本文将详细介绍 Qwen2_5_VLConfig
、Qwen2_5_VLVisionConfig
和 PretrainedConfig
之间的关系,以及它们在 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
继承关系
类属性
类属性 | 描述 |
---|
model_type | 指定模型类型,为 "qwen2_5_vl" |
base_config_key | 用于标识这是视觉配置,值为 "vision_config" |
实例属性
实例属性 | 描述 | 默认值 |
---|
depth | 模型的深度,即 Transformer 层的数量 | 32 |
hidden_size | 隐藏层的维度 | 3584 |
hidden_act | 激活函数,默认使用 "silu" | "silu" |
intermediate_size | Feedforward 层的中间维度 | 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
继承关系
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"]
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
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
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_size | Feedforward 层的中间维度 | 29568 |
num_hidden_layers | Transformer 层的数量 | 80 |
num_attention_heads | 注意力头的数量 | 64 |
num_key_value_heads | 键值头的数量,用于分组查询注意力(GQA);如果未指定,则设置为 num_attention_heads | 8 |
hidden_act | 激活函数,默认值为 "silu" | "silu" |
initializer_range | 权重初始化范围 | 0.02 |
rms_norm_eps | RMS 正则化的 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_scaling | RoPE 缩放配置的字典,用于扩展位置编码的能力;如果需要缩放,则指定相关参数 | None |
实例方法
实例方法 | 描述 |
---|
__init__(self, **kwargs) | 初始化方法,接受上述参数并设置实例属性,包括处理 vision_config 和 rope_scaling 的逻辑 |
说明
- 用途:
Qwen2_5_VLConfig
是主配置类,用于配置 Qwen2.5-VL 模型的各项参数,包括语言模型和视觉模型的配置,以及一些高级功能的配置,如滑动窗口注意力、RoPE 缩放等。 - 包含关系:包含了
Qwen2_5_VLVisionConfig
,通过 vision_config
属性访问视觉配置。 - 初始化逻辑:
- 如果
vision_config
是字典,则使用其参数实例化 Qwen2_5_VLVisionConfig
。 - 如果
vision_config
为 None
,则使用默认的视觉配置实例。 - 验证
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_VLConfig
或 Qwen2_5_VLVisionConfig
。
使用示例
加载预训练模型和配置
from transformers import Qwen2_5_VLForConditionalGeneration
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
方法加载预训练的模型和配置,以确保模型的架构与预训练权重一致。 - 自定义配置:如果需要修改模型架构,可以自定义配置,但需要相应地训练模型或微调预训练模型。