⛳
Qwen2.5-VL アーキのメモ
テクレポ https://arxiv.org/abs/2502.13923
transformers(ややこしい名前)での実装
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 とそれほど大きくは変わりがないが,
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