跳转至

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 并行能力进行训练。