Qwen3 VL多模态解析 本文作者kaiyuanQwen3 VL多模态解析想深耕AI Infra领域欢迎访问InfraTech库内容涵盖大模型基础、PyTorch/vLLM/SGLang框架入门、性能加速等核心方向配套50知识干货及适合初学者的notebook练习:https://github.com/CalvinXKY/InfraTech本文梳理了Qwen3 VL视觉信息进入语言模型的关键路径编码、压缩、拼接、跨层注入与位置编码。重点分析数据操作过程比较图像与视频分支在建模上的差异并说明DeepStack与RoPE/M-RoPE在多模态对齐中的作用帮助读者对Qwen3 VL有个整体了解。1 模型结构概览Qwen3-VL是Qwen系列新一代视觉-语言模型面向图文理解、视频理解、多模态推理与智能体交互等场景。 官方形态同时覆盖Dense与MoE并提供Instruct/Thinking等版本支持从边缘端到云端的灵活部署。以Qwen3-VL-32B-Instruct和Qwen3-VL-235B-A22B-Instruct为例来了解模型主体结构。1.1 Qwen3-VL-32B-Instruct高清图https://github.com/CalvinXKY/InfraTech/tree/main/models/qwen3_vl模型结构描述类型视觉-语言指令模型Instruct架构Qwen3VLForConditionalGeneration模型类型qwen3_vl参数规模32B以模型命名为准文本上下文长度262144文本层数64文本隐藏维度5120文本FFN中间层维度25600文本注意力头数Q64KV8head_dim128文本词表大小151936RoPE参数rope_theta5000000mrope_section[24,20,20]视觉编码器层数27视觉隐藏维度1152视觉头数16视觉FFN中间层维度4304图像Patch大小16时序Patch大小2视觉输出映射维度5120与文本隐藏维度对齐1.2 Qwen3-VL-235B-A22B-Instruct高清图https://github.com/CalvinXKY/InfraTech/tree/main/models/qwen3_vl模型结构描述类型视觉-语言指令模型Instruct架构Qwen3VLMoeForConditionalGeneration模型类型qwen3_vl_moe参数规模235B激活参数22B以模型命名为准文本上下文长度262144文本层数94文本隐藏维度4096文本FFN中间层维度12288文本注意力头数Q64KV4head_dim128文本词表大小151936RoPE参数rope_theta5000000mrope_section[24,20,20]MoE配置专家总数128每token激活专家数8moe_intermediate_size1536视觉编码器层数27视觉隐藏维度1152视觉头数16视觉FFN中间层维度4304图像Patch大小16时序Patch大小2视觉输出映射维度4096与文本隐藏维度对齐2 图片到tokens的编码过程视觉图片类数据在进入语言模型前需要先转化为tokens序列。不同尺寸的图片经过视觉编码器Vision Encoder后得到的tokens长度通常不同。 在Qwen3VL的技术报告中有几张示意图展示了常见场景例如H×W32×256这种宽高比较大的图片。 这些图片最终会映射为不同长度的tokens。图像数据如何与tokens序列对应编码过程一般包含网格分块与压缩两步。网格分块用于重排图像数据压缩用于降低序列长度。2.1 图片patch化下面以Height800、Width1440的图片为例输入形状为[800, 1440, 3]。 在Qwen3VL中相关patch参数如下patch_size16图片块的高宽temporal_patch_size2时间维度块大小主要用于视频in_channels3图片通道数对图片进行网格化处理时间维度会补齐到2再除以temporal_patch_sizegrid_t 2⁄2 1grid_h 800⁄16 50grid_w 1440⁄16 90进入VisionEncoder前的序列长度L_pre grid_t * grid_h * grid_w 15090 4500每个patch向量维度D 3216*16 1536得到数据pixel_values 形状[1, 4500, 1536]image_grid_thw[1, 50, 90]最后一个维度的变化与映射方式相关进入VisionEncoder后会先经过PatchEmbed处理末端再经过Merger映射运算。2.2 PatchEmbed/Merger处理最后一个维度的变化与映射方式相关进入VisionEncoder后会先经过PatchEmbed处理末端再经过Merger映射运算。PatchEmbed处理PatchEmbed包含一个3D卷积映射Conv3d将维度从1536映射到hidden_size因此pixel_values形状变为[1, 4500, 1152]。示例代码如下classQwen3VLVisionPatchEmbed(nn.Module):def__init__(self,config)-None:super().__init__()self.patch_sizeconfig.patch_size self.temporal_patch_sizeconfig.temporal_patch_size self.in_channelsconfig.in_channels self.embed_dimconfig.hidden_size kernel_size[self.temporal_patch_size,self.patch_size,self.patch_size]self.projnn.Conv3d(self.in_channels,self.embed_dim,kernel_sizekernel_size,stridekernel_size,biasTrue)defforward(self,hidden_states:torch.Tensor)-torch.Tensor:target_dtypeself.proj.weight.dtype hidden_stateshidden_states.view(-1,self.in_channels,self.temporal_patch_size,self.patch_size,self.patch_size)hidden_statesself.proj(hidden_states.to(dtypetarget_dtype)).view(-1,self.embed_dim)returnhidden_statesMerger处理Merger计算中会压缩序列长度。相关配置spatial_merge_size2视觉压缩融合尺寸。out_hidden_size5120语言模型的hidden维度大小。模型规模不同时该参数会变化。classQwen3VLVisionPatchMerger(nn.Module):def__init__(self,config:Qwen3VLVisionConfig,use_postshuffle_normFalse)-None:super().__init__()self.hidden_sizeconfig.hidden_size*(config.spatial_merge_size**2)self.use_postshuffle_normuse_postshuffle_norm self.normnn.LayerNorm(self.hidden_sizeifuse_postshuffle_normelseconfig.hidden_size,eps1e-6)self.linear_fc1nn.Linear(self.hidden_size,self.hidden_size)self.act_fnnn.GELU()self.linear_fc2nn.Linear(self.hidden_size,config.out_hidden_size)defforward(self,x:torch.Tensor)-torch.Tensor:xself.norm(x.view(-1,self.hidden_size)ifself.use_postshuffle_normelsex).view(-1,self.hidden_size)xself.linear_fc2(self.act_fn(self.linear_fc1(x)))returnx在最后的Merger计算时self.use_postshuffle_normTrue输入x会先调整形状x.view(-1, self.hidden_size)其中self.hidden_size config.hidden_size * (spatial_merge_size**2)。所以压缩后的序列计算方式L_final L_pre / ((spatial_merge_size**2) 4500 / 4 1125得到输出的序列长度与嵌入维度的shape[1125, 5120]3 视频数据的编码过程视频数据与图片数据的主要差异在于增加了时间维度。视频会先抽帧降低数据量再进行时序patch划分。 以Qwen3VL示意图中的视频为例分辨率H448、W736时长8秒。默认参数配置fps2temporal_patch_size2patch_size16merge_size2计算过程采样帧数num_frames ≈ 8 * 2 16时间网格grid_t 16 / 2 8空间网格grid_h 448 / 16 28grid_w 736 / 16 46得到数据pixel_values 形状[1, 10304, 1536]image_grid_thw[[8, 28, 46]]L_pre grid_t * grid_h * grid_w 10304与图片流程相同视频也需要经过PatchEmbed和Merger处理最终得到shape[2576, 5120]4 数据的拼接文本、图片、视频tokens最终会一起送入LLM处理因此需要拼接。其做法是先在输入构造阶段通过placeholder预留图片/视频tokens位置再在视觉分支计算完成后回填拼接。其中图片/视频数据会引入一些额外tokens。继续以上面的视频为例上一步得到的视觉序列长度为2576。实际构造输入时每个grid_t都会拼接一段每一段分为四块”{curr_time:.1f} seconds“文本会被分词成若干 token时间戳文本vision_start_token一段视频placeholder本例中长度为2576/8 322vision_end_token所以总长度上除了2576个视觉占位外还会额外增加vision_start/end共2*grid_t16个特殊token以及8段时间戳文本会进一步分词。5 DeepStack操作DeepStack原理不把所有视觉token都“横向串成一长串”塞进LLM输入而是把额外的高分辨率视觉token按层“纵向堆叠” 分配到LLM的多个早期/中期层里用残差方式逐层注入从而在不显著增加上下文长度的前提下让模型有效处理更多视觉细节。 DeepStack在保留更多视觉信息的同时能够有效控制上下文长度。Qwen3VL使用了DeepStack技术在vision encoder中从指定层deepstack_visual_indexes取出hidden_states并分别经过deepstack_merger 将空间merge后的视觉特征整理到可注入语言模型的维度。Qwen3VL配置中指定了[8, 16, 24]层。操作过程vision decoder中间层特征多尺度/不同语义深度先各自经过merger得到deepstack_features这些特征后续会在文本模型前几层按视觉位置加回_deepstack_process。注意VisionDecoder最后一层的Merger与DeepStack分支中的Merger存在差异最后一层Merger的LayerNorm位置不同且需要进行尺寸压缩。6 位置编码的处理在Qwen3VL中位置编码采用RoPERotary Position Embedding但视觉与文本在位置ID构造上存在差异 视觉分支通常使用2D/3D坐标构造位置在多模态统一建模时会通过M-RoPEMultimodal Rotary Position Embedding把t/h/w信息映射到不同通道分组。 其核心差异主要体现在嵌入维度head_dim分量的分配方式与位置索引的组织方式上。6.1 视觉塔中的2D编码对图片数据而言每个token有二维索引(h, w)对应视觉塔中的row/col若head_dim128其分频逻辑是128先分为64对二维向量构成独立的平面前32对的频率分量由row索引决定后32对的频率分量由col索引决定。更具体一点每个维度的归属如下索引区间内容emb[0:32]row的32个频率分量emb[32:64]col的32个频率分量emb[64:96]再次row与0:32相同emb[96:128]再次col与32:64相同然后cos emb.cos()sin emb.sin()形状都是(seq_len, 128)。规律前32个旋转对覆盖q[0:32]与q[64:96]由行坐标r rr决定相位。后32个旋转对覆盖q[32:64]与q[96:128]由列坐标c cc决定相位。其中r rr与c cc由token在图片中的行列位置决定。row与col共用freqsmax_len通常取max(R,C)其中R、C分别为row与col方向的最大索引。6.2 文本模型的M-RoPE视觉3D位置编码是在2D位置编码的基础上进一步引入了时间维度。在M-RoPE中有三个独立的角度时间维度角度angle_t t * theta_i高度维度角度angle_h h * theta_i宽度维度角度angle_w w * theta_iQwen3 VL采用了Interleaved-MRoPE其核心思想如下在1D RoPE中嵌入层分成了d/2组每一对连续元素(x[2j], x[2j1])视为一个二维子空间j 0, 1, …, d/2 - 1。确定第j jj个子空间应使用t、h、w中的哪一个轴进行旋转采用轮询Round‑Robin分配axis ( j ) j m o d 3 \text{axis}(j) j \bmod 3axis(j)jmod3其中定义映射0→t1→h2→w。因此当j % 3 0时该子空间用t轴的旋转角度angle t * θ_j当j % 3 1时该子空间用h轴的旋转角度angle h * θ_j当j % 3 2时该子空间用w轴的旋转角度angle w * θ_j这种方式将时间、高度、宽度三个维度的信息交错融入整个特征空间从而使多模态模型能更全面、更高效地理解数据中的复杂时空结构。位置编码知识可参考《彻底搞懂RoPE计算原理从1D到3D》相关文章《VLM视觉-语言融合流程解析Kimi K2.5/VL》参考文章https://github.com/huggingface/transformers/blob/main/src/transformers/models/qwen3_vl/Qwen3-VL Technical Reporthttps://arxiv.org/pdf/2511.21631https://arxiv.org/pdf/2406.04334InfraTech申明未经允许不得转载