Qwen2.5-VL 模型配置

本文将详细介绍 Qwen2_5_VLConfigQwen2_5_VLVisionConfigPretrainedConfig 之间的关系,以及它们在 Qwen2.5-VL 模型配置中的作用。Qwen2.5-VL 是一个多模态模型,结合了视觉和语言处理能力。我们将从代码结构、类继承关系、配置参数以及实际使用方法等方面进行阐述,并将各类的属性和方法分类成表格,便于理解。


模块导入

from transformers.configuration_utils import PretrainedConfig
from transformers.modeling_rope_utils import rope_config_validation
  • PretrainedConfig:模型配置的基类,提供通用的配置功能,如保存和加载配置、参数验证等。
  • rope_config_validation:用于验证旋转位置编码(RoPE)的配置,确保配置参数的正确性。

类关系概述

  • PretrainedConfig:所有配置类的基类。
  • Qwen2_5_VLVisionConfig:继承自 PretrainedConfig,用于视觉编码器的配置。
  • Qwen2_5_VLConfig:继承自 PretrainedConfig,用于整个模型的配置,包括语言模型配置和视觉模型配置(通过包含 Qwen2_5_VLVisionConfig 实现)。

类继承图

PretrainedConfig
       /          \
      /            \
Qwen2_5_VLConfig   Qwen2_5_VLVisionConfig
         |
         | 包含 (vision_config)
         |
Qwen2_5_VLVisionConfig

Qwen2_5_VLVisionConfig

class Qwen2_5_VLVisionConfig(PretrainedConfig):
    model_type = "qwen2_5_vl"
    base_config_key = "vision_config"

    def __init__(
        self,
        depth=32,
        hidden_size=3584,
        hidden_act="silu",
        intermediate_size=3420,
        num_heads=16,
        in_channels=3,
        patch_size=14,
        spatial_merge_size=2,
        temporal_patch_size=2,
        tokens_per_second=4,
        window_size=112,
        out_hidden_size=3584,
        fullatt_block_indexes=[7, 15, 23, 31],
        **kwargs,
    ):
        super().__init__(**kwargs)

        self.depth = depth
        self.hidden_size = hidden_size
        self.hidden_act = hidden_act
        self.intermediate_size = intermediate_size
        self.num_heads = num_heads
        self.in_channels = in_channels
        self.patch_size = patch_size
        self.spatial_merge_size = spatial_merge_size
        self.temporal_patch_size = temporal_patch_size
        self.tokens_per_second = tokens_per_second
        self.window_size = window_size
        self.fullatt_block_indexes = fullatt_block_indexes
        self.out_hidden_size = out_hidden_size

继承关系

  • 父类PretrainedConfig

类属性

类属性描述
model_type指定模型类型,为 "qwen2_5_vl"
base_config_key用于标识这是视觉配置,值为 "vision_config"

实例属性

实例属性描述默认值
depth模型的深度,即 Transformer 层的数量32
hidden_size隐藏层的维度3584
hidden_act激活函数,默认使用 "silu""silu"
intermediate_sizeFeedforward 层的中间维度3420
num_heads注意力机制中的头数16
in_channels输入通道数,对于图像通常为 3(RGB)3
patch_size图像切分的 patch 大小14
spatial_merge_size空间合并大小2
temporal_patch_size时间维度上的 patch 大小2
tokens_per_second每秒的 token 数量4
window_size窗口大小112
fullatt_block_indexes使用全局注意力的层索引列表[7, 15, 23, 31]
out_hidden_size输出隐藏层的维度3584

实例方法

实例方法描述
__init__(self, **kwargs)初始化方法,接受上述参数并设置实例属性

说明

  • 用途Qwen2_5_VLVisionConfig 是一个专门用于视觉部分的配置类,包含与视觉处理相关的参数,如视觉 Transformer 的层数、隐藏层维度、注意力头数、图像输入通道、patch 大小等。
  • 独立性:可以独立存在,用于专门配置视觉编码器,既可通过 from_pretrained 方法加载预训练的视觉配置,也可自定义参数实例化。

Qwen2_5_VLConfig

继承关系

  • 父类PretrainedConfig

class Qwen2_5_VLConfig(PretrainedConfig):
   

    model_type = "qwen2_5_vl"
    sub_configs = {"vision_config": Qwen2_5_VLVisionConfig}
    keys_to_ignore_at_inference = ["past_key_values"]
    # Default tensor parallel plan for base model `Qwen2_5_VL`
    base_model_tp_plan = {
        "layers.*.self_attn.q_proj": "colwise",
        "layers.*.self_attn.k_proj": "colwise",
        "layers.*.self_attn.v_proj": "colwise",
        "layers.*.self_attn.o_proj": "rowwise",
        "layers.*.mlp.gate_proj": "colwise",
        "layers.*.mlp.up_proj": "colwise",
        "layers.*.mlp.down_proj": "rowwise",
    }
    base_model_pp_plan = {
        "embed_tokens": (["input_ids"], ["inputs_embeds"]),
        "layers": (["hidden_states", "attention_mask"], ["hidden_states"]),
        "norm": (["hidden_states"], ["hidden_states"]),
    }

    def __init__(
        self,
        vocab_size=152064,
        hidden_size=8192,
        intermediate_size=29568,
        num_hidden_layers=80,
        num_attention_heads=64,
        num_key_value_heads=8,
        hidden_act="silu",
        max_position_embeddings=32768,
        initializer_range=0.02,
        rms_norm_eps=1e-05,
        use_cache=True,
        tie_word_embeddings=False,
        rope_theta=1000000.0,
        use_sliding_window=False,
        sliding_window=4096,
        max_window_layers=80,
        attention_dropout=0.0,
        vision_config=None,
        rope_scaling=None,
        **kwargs,
    ):
        if isinstance(vision_config, dict):
            self.vision_config = self.sub_configs["vision_config"](**vision_config)
        elif vision_config is None:
            self.vision_config = self.sub_configs["vision_config"]()

        self.vocab_size = vocab_size
        self.max_position_embeddings = max_position_embeddings
        self.hidden_size = hidden_size
        self.intermediate_size = intermediate_size
        self.num_hidden_layers = num_hidden_layers
        self.num_attention_heads = num_attention_heads
        self.use_sliding_window = use_sliding_window
        self.sliding_window = sliding_window
        self.max_window_layers = max_window_layers

        # for backward compatibility
        if num_key_value_heads is None:
            num_key_value_heads = num_attention_heads

        self.num_key_value_heads = num_key_value_heads
        self.hidden_act = hidden_act
        self.initializer_range = initializer_range
        self.rms_norm_eps = rms_norm_eps
        self.use_cache = use_cache
        self.rope_theta = rope_theta
        self.attention_dropout = attention_dropout
        self.rope_scaling = rope_scaling

        # Validate the correctness of rotary position embeddings parameters
        # BC: if there is a 'type' field, move it to 'rope_type'.
        # and change type from 'mrope' to 'default' because `mrope` does defeault RoPE calculations
        # one can set it to "linear"/"dynamic" etc. to have scaled RoPE
        # TODO: @raushan update config in the hub
        if self.rope_scaling is not None and "type" in self.rope_scaling:
            if self.rope_scaling["type"] == "mrope":
                self.rope_scaling["type"] = "default"
            self.rope_scaling["rope_type"] = self.rope_scaling["type"]
        rope_config_validation(self, ignore_keys={"mrope_section"})

        super().__init__(tie_word_embeddings=tie_word_embeddings, **kwargs)

类属性

类属性描述
model_type指定模型类型,为 "qwen2_5_vl"
sub_configs包含子配置的字典,这里定义了 "vision_config",使用 Qwen2_5_VLVisionConfig
keys_to_ignore_at_inference在推理时忽略的键,这里为 ["past_key_values"]
base_model_tp_plan定义模型的张量并行(TP)计划的字典,用于并行化计算
base_model_pp_plan定义模型的流水线并行(PP)计划的字典,用于分割模型的不同部分在不同设备上运行

实例属性

实例属性描述默认值
vision_config视觉配置实例,使用 Qwen2_5_VLVisionConfig默认实例
vocab_size词汇表大小152064
max_position_embeddings最大序列长度32768
hidden_size隐藏层维度8192
intermediate_sizeFeedforward 层的中间维度29568
num_hidden_layersTransformer 层的数量80
num_attention_heads注意力头的数量64
num_key_value_heads键值头的数量,用于分组查询注意力(GQA);如果未指定,则设置为 num_attention_heads8
hidden_act激活函数,默认值为 "silu""silu"
initializer_range权重初始化范围0.02
rms_norm_epsRMS 正则化的 epsilon 值1e-5
use_cache是否使用缓存True
rope_theta旋转位置编码(RoPE)的基本周期1e6
use_sliding_window是否使用滑动窗口注意力False
sliding_window滑动窗口大小4096
max_window_layers使用滑动窗口注意力的最大层数80
attention_dropout注意力的 dropout 比率0.0
rope_scalingRoPE 缩放配置的字典,用于扩展位置编码的能力;如果需要缩放,则指定相关参数None

实例方法

实例方法描述
__init__(self, **kwargs)初始化方法,接受上述参数并设置实例属性,包括处理 vision_configrope_scaling 的逻辑

说明

  • 用途Qwen2_5_VLConfig 是主配置类,用于配置 Qwen2.5-VL 模型的各项参数,包括语言模型和视觉模型的配置,以及一些高级功能的配置,如滑动窗口注意力、RoPE 缩放等。
  • 包含关系:包含了 Qwen2_5_VLVisionConfig,通过 vision_config 属性访问视觉配置。
  • 初始化逻辑
    • 如果 vision_config 是字典,则使用其参数实例化 Qwen2_5_VLVisionConfig
    • 如果 vision_configNone,则使用默认的视觉配置实例。
    • 验证 rope_scaling 参数的正确性,确保 RoPE 配置有效。

模块导出

__all__ = ["Qwen2_5_VLConfig"]
  • 作用:指定当使用 from module import * 时,导出的公共 API,这里是 Qwen2_5_VLConfig

总结

  • PretrainedConfig:所有配置类的基类,提供基本的配置机制,使模型配置可以序列化、反序列化,并与 Transformers 库的其他组件兼容。
  • Qwen2_5_VLVisionConfig:处理视觉部分的配置,包含视觉 Transformer 的相关参数。作为 Qwen2_5_VLConfig 的子配置,也可独立使用。
  • Qwen2_5_VLConfig:处理整个模型的配置,包括语言模型和视觉模型的参数,以及高级功能配置,如滑动窗口注意力、RoPE 缩放等。通过 vision_config 属性包含视觉配置。
  • 实际应用:这些配置类允许用户灵活地设置模型的参数,以适应不同的任务需求。在需要修改模型配置时,可以有针对性地调整 Qwen2_5_VLConfigQwen2_5_VLVisionConfig

使用示例

加载预训练模型和配置

from transformers import Qwen2_5_VLForConditionalGeneration

# 通过 from_pretrained 方法加载预训练的模型及配置
model = Qwen2_5_VLForConditionalGeneration.from_pretrained("Qwen/Qwen2.5-VL-7B")

# 访问模型的整体配置
model_config = model.config

# 访问视觉配置
vision_config = model.config.vision_config

说明

  • 加载预训练模型:使用 from_pretrained 方法,从 HuggingFace 模型库中加载预训练的 Qwen2.5-VL 模型,包括其配置。
  • 访问配置:加载模型后,可以通过 model.config 访问模型的整体配置,model.config.vision_config 访问视觉配置。
  • 自定义配置:如果需要自定义配置,可以在调用 from_pretrained 方法时,传入自定义的配置参数。

自定义配置实例化模型

from transformers import Qwen2_5_VLForConditionalGeneration, Qwen2_5_VLConfig

# 自定义视觉配置
custom_vision_config = {
    "depth": 36,
    "hidden_size": 4096,
    "num_heads": 32,
    "patch_size": 16,
}

# 自定义模型配置,并传入自定义的视觉配置
custom_model_config = Qwen2_5_VLConfig(
    vocab_size=200000,
    hidden_size=10240,
    num_hidden_layers=96,
    vision_config=custom_vision_config,
)

# 实例化模型,使用自定义配置
model = Qwen2_5_VLForConditionalGeneration(config=custom_model_config)

# 查看模型的配置
print(model.config)
print(model.config.vision_config)

说明

  • 自定义视觉配置:创建一个包含自定义参数的字典 custom_vision_config
  • 自定义模型配置:创建 Qwen2_5_VLConfig 实例,传入自定义的视觉配置。
  • 实例化模型:使用自定义的模型配置实例化模型。
  • 注意:如果使用预训练的权重,需要确保模型的架构与预训练的权重匹配,否则可能导致加载权重失败或模型性能下降。

配置的加载方式总结

  • 推荐方式:通过 from_pretrained 方法加载预训练的模型和配置,以确保模型的架构与预训练权重一致。
  • 自定义配置:如果需要修改模型架构,可以自定义配置,但需要相应地训练模型或微调预训练模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值