qwen2_5_vl.py — Qwen2.5-VL mcore 实现¶
目录路径¶
verl/models/mcore/qwen2_5_vl/
目录概述¶
为 Qwen2.5-VL 视觉语言模型提供完整的 Megatron-Core 实现,包含视觉编码器、注意力机制、RoPE 工具和模型组装。这个子目录包含 7 个文件。
文件清单¶
__init__.py¶
导出 Qwen2_5VLModel、get_vision_model_config、get_vision_projection_config。
model.py -- 主模型类¶
class Qwen2_5VLModel(MegatronModule):
"""Qwen2.5VL 多模态模型,包含视觉编码器 + 投影层 + 语言模型"""
def __init__(self, language_transformer_config, language_transformer_layer_spec,
vision_transformer_config, vision_transformer_layer_spec,
vision_projection_config, vision_projection_layer_spec, ...):
# 创建语言模型 (GPTModel)
self.language_model = GPTModel(config=language_transformer_config, ...)
# 创建视觉模型
self.vision_model = Qwen2_5VisionModel(vision_transformer_config, ...)
# 创建投影层
self.vision_projection = MultimodalProjector(vision_projection_config, ...)
attention.py -- 自定义注意力¶
class Qwen2_5VLSelfAttention(SelfAttention):
"""重写 SelfAttention,使用绝对位置 RoPE"""
def forward(self, hidden_states, attention_mask, ...):
# 使用 apply_rotary_pos_emb_absolute 替代标准 RoPE
query, key = apply_rotary_pos_emb_absolute(query, key, cos, sin)
Qwen2.5-VL 使用绝对位置的 M-RoPE(3D 位置编码),与标准 RoPE 的相对位置不同。
rope_utils.py -- 位置编码工具¶
def get_rope_index(input_ids, image_grid_thw, video_grid_thw, ...):
"""计算 3D 位置索引(与 transformers 版 qwen2_vl.py 类似)"""
position_ids = torch.ones(3, seqlen, ...) # 时间、高度、宽度
def apply_rotary_pos_emb_absolute(query, key, position_ids, rotary_emb):
"""应用绝对位置的 M-RoPE"""
vision_config.py -- 视觉模型配置¶
def get_vision_model_config(config):
"""从语言模型配置构建视觉编码器配置"""
config.num_layers = 32 # ViT depth
config.num_attention_heads = 16
config.hidden_size = 1280
config.ffn_hidden_size = 3456 # 或 3420(取决于模型大小)
return config
def get_vision_projection_config(config, vision_hidden_size, spatial_merge_size):
"""构建视觉投影层配置"""
config.ffn_hidden_size = config.hidden_size
config.hidden_size = vision_hidden_size * (spatial_merge_size ** 2)
return config
vision_model.py -- 视觉编码器¶
class PatchEmbed(nn.Module):
"""将图像/视频切成 patch 并嵌入"""
class Qwen2_5VisionModel(VisionModule):
"""完整的视觉编码器:PatchEmbed + TransformerBlock + 投影"""
def __init__(self, ...):
self.patch_embed = PatchEmbed(...)
self.blocks = TransformerBlock(...) # ViT decoder
vision_transformer_block.py -- 视觉 Transformer 块¶
class Qwen2_5VisionTransformerBlock(TransformerBlock):
"""支持 full attention 和 windowed attention 交替的 ViT"""
def _checkpointed_forward(self, ...):
for index in range(start, end):
if index in fullatt_block_indexes:
# 使用全局注意力
packed_seq_params_now = packed_seq_params_full
else:
# 使用窗口注意力
packed_seq_params_now = packed_seq_params
Qwen2.5-VL 的视觉编码器交替使用全局注意力和窗口注意力层。
核心类/函数列表¶
| 名称 | 文件 | 作用 |
|---|---|---|
Qwen2_5VLModel |
model.py | 完整的 VLM 模型 |
Qwen2_5VLSelfAttention |
attention.py | 绝对位置 RoPE 注意力 |
get_rope_index() |
rope_utils.py | 3D 位置编码计算 |
get_vision_model_config() |
vision_config.py | 视觉编码器配置 |
get_vision_projection_config() |
vision_config.py | 投影层配置 |
PatchEmbed |
vision_model.py | Patch 嵌入层 |
Qwen2_5VisionModel |
vision_model.py | 视觉编码器 |
Qwen2_5VisionTransformerBlock |
vision_transformer_block.py | 视觉 Transformer |
与其他模块的关系¶
- 被
model_initializer.py的Qwen25VLModel类使用 - 使用 mcore 的
GPTModel、VisionModule等基础组件 - RoPE 计算与
transformers/qwen2_vl.py的get_rope_index功能相同
小结¶
这个子目录是 Qwen2.5-VL 在 Megatron-Core 框架下的完整实现,涵盖了视觉编码器、多模态投影和语言模型的组装。它使得 Qwen2.5-VL 可以利用 mcore 的 TP/PP 并行能力进行训练。