Qwen2.5-VL アーキのメモ

に公開

テクレポ https://arxiv.org/abs/2502.13923

transformers(ややこしい名前)での実装

https://github.com/huggingface/transformers/tree/main/src/transformers/models/qwen2_5_vl

Vision 側(3B での dump)

  Qwen2_5_VLForConditionalGeneration(
    (visual): Qwen2_5_VisionTransformerPretrainedModel(
      (patch_embed): Qwen2_5_VisionPatchEmbed(
        (proj): Conv3d(3, 1280, kernel_size=(2, 14, 14), stride=(2, 14, 14), bias=False)
      )
      (rotary_pos_emb): Qwen2_5_VisionRotaryEmbedding()
      (blocks): ModuleList(
        (0-31): 32 x Qwen2_5_VLVisionBlock(
          (norm1): Qwen2RMSNorm((1280,), eps=1e-06)
          (norm2): Qwen2RMSNorm((1280,), eps=1e-06)
          (attn): Qwen2_5_VLVisionSdpaAttention(
            (qkv): Linear(in_features=1280, out_features=3840, bias=True)
            (proj): Linear(in_features=1280, out_features=1280, bias=True)
          )
          (mlp): Qwen2_5_VLMLP(
            (gate_proj): Linear(in_features=1280, out_features=3420, bias=True)
            (up_proj): Linear(in_features=1280, out_features=3420, bias=True)
            (down_proj): Linear(in_features=3420, out_features=1280, bias=True)
            (act_fn): SiLU()
          )
        )
      )
      (merger): Qwen2_5_VLPatchMerger(
        (ln_q): Qwen2RMSNorm((1280,), eps=1e-06)
        (mlp): Sequential(
          (0): Linear(in_features=5120, out_features=5120, bias=True)
          (1): GELU(approximate='none')
          (2): Linear(in_features=5120, out_features=2048, bias=True)
        )
      )
    )

fullatt_block_indexes

Qwen2-VL とそれほど大きくは変わりがないが,

https://huggingface.co/Qwen/Qwen2.5-VL-3B-Instruct/blob/main/config.json#L43

fullatt_block_indexes
というのが VisionEncoder に追加されている.

中身としては, SlidingWindow した (visual) tokens で Attention 計算するのではなく,
SlidingWindow しない (visual) tokens でフルに Attention を計算する.

visual tokens の場合は動作イメージがよくわからんが, SilidingWindow だと画像の一部領域だけでの visual tokens, fullatt_block だと画像全体の visual tokens, という感じなんじゃろか?
(実装していけば自ずとわかってくるでしょう)

sliding window するときの pixel size は 112x112(8x8 patches)

M-RoPE

M-RoPE(multimodal rope)での id 計算が qwen2-vl と異なる. 時間軸方向は absolute id を割り当てるように変更

Discussion