Qwen-VL 视觉大模型 计算图拆解及SFT实操

📅 2026/8/7 12:24:22
Qwen-VL 视觉大模型 计算图拆解及SFT实操
1. 视觉大模型介绍Qwen-VisualLanguage, 基于 Qwen-7B 的多模态视觉语言大模型. 支持图文理解、文档解析、OCR、视觉问答等任务.它的视觉编码参考了 CLIP, 所以一并介绍.2. 计算图拆解基于 Qwen-7B, 新增了 a language-alignedvisual encoderand a position awareadapter.2.1 Large Language ModelQwen-7B.2.2 视觉编码器 - ViT即Vision Transformer (ViT)架构, 并使用了来自 OpenCLIP 的ViT-bigG预训练权重作为其视觉编码器的基础。ViT 的论文见参考 [3], 名字是 “An Image is Worth 16x16 Words”, 挺有意思.ViT 的工作原理第一步: 原始图像resize 到固定分辨率(如 224×224)。内存中就是一张 H×W×C 224×224×3 的 float32 tensor像素值归一化到 [0,1] 或 [-1,1]。占用显存 224×224×3×4 bytes ≈ 602KB很小。第二步Patch 划分约定一个 patch 为 16 x 16 256 个像素, 每个像素有 RGB 三通道, 共 16×16×3 768 个 tensor 元素(数值), 对应 shape 为 [C3, H16, W16].因为上步得到的分辨率为 224, 所以水平、垂直方向各 224÷16 14 个 patch一共 196 个 patch。第三步Linear Projection线性投影每个 patch 展平成一个 768 维的向量然后通过一个可学习的线性层把它映射到模型的隐藏维度。ViT-B 的隐藏维度是 768所以这个线性层的权重矩阵是 768×768。本质上就是把每个 patch 的像素信息压缩成一个 768 维的词向量——跟 NLP 里把 token ID 查表得到 embedding 是完全对称的操作。所以论文标题才说An Image is Worth 16x16 Words每个 16×16 的 patch 就是一个word。注意: 所有 196 个 patch 共享同一个线性投影层.第四步加 CLS Token 和 Position Embedding在 196 个 patch token 前面拼接一个可学习的 [CLS] token维度也是 768序列长度变成 197。这个 CLS token 的作用是聚合全局信息最后取它的输出来做分类。然后给每个 token 加上位置编码。位置编码也是 768 维的可学习向量197 个位置各一个直接 element-wise 加到对应的 token 上。这一步之后模型就能区分这个 patch 来自图片左上角还是右下角。在 Qwen-VL 中视觉编码器以14 的步长stride对图像进行分块处理生成一组图像特征。这些特征捕获了图像的视觉内容为后续的视觉-语言对齐提供了基础。为什么选择 ViT与传统卷积神经网络CNN相比ViT 具有以下优势全局注意力机制能够捕捉图像中长距离的依赖关系对理解图像整体语义更有帮助。可扩展性随着模型规模和训练数据的增加ViT 的性能提升更加明显。与 Transformer 架构的统一与语言模型使用相同的 Transformer 架构简化了多模态融合的设计。在 Qwen-VL 的训练过程中视觉编码器在预训练阶段与语言模型一起优化学习将视觉特征与文本描述对齐这是实现高质量视觉-语言理解的关键。2.3 Position-aware Vision-Language AdapterAdapter 是独立于 ViT 的一个模块它夹在 ViT 和 LLM 之间. 作用有是把 ViT 输出的 不定长 (跟分辨率直接相关) 的 token 数量压缩到固定 256 个 token.注入位置信息. ViT 原始输出只带 1D 位置编码序列顺序但图像本质是 2D 结构左上角和右下角这种空间关系用 1D 编码表达得不够好Adapter 在 cross-attention 的 Q 和 K 之间加入了 2D 绝对位置编码让压缩后的每个 token 隐式携带这个特征来自图像哪个区域的信息。这就是Position-aware这个前缀的由来整个数据流是这样的原始图像 → ViT输出比如 1024 个 patch token每个 768 维 → Adapter压缩到 256 个 token对齐到 LLM 的隐藏维度 → LLM3. 官方阶段训练3.1 ViT 预训练冻结 LLM只训视觉编码器用大规模图文对数据建立视觉-文本关联3.2 全参数预训练Multi-Task Pre-trainingImage Captioningimgcc3m/01581435.jpg/imgGenerate the caption in English: the beautiful flowers for design.eosVision Question AnsweringimgVG_100K_2/1.jpg/imgDoes the bandage have a different color than the wrist band? Answer: No, both the bandage and the wrist band are white.eos3.3 SFT - Qwen-VL-Chat这是 Qwen-VL 从预训练模型到对话模型Qwen-VL-Chat的有监督微调SFT阶段。SFT 本身就能出 Chat 模型, 后续没有 RLHF 和 DPO 等对齐.冻结 ViT只调 LLM 和 Adapter用 ChatML 格式的指令数据微调出 Chat 版本.核心信息几个点.数据总量指令微调数据一共 350k 条对于当时的多模态模型来说算比较精简的。训练策略冻结视觉编码器Visual Encoder只优化语言模型和 Adapter 模块。这是一个很常见的做法——视觉编码器在预训练阶段已经学好了特征提取能力SFT 阶段不需要再动它既省算力也避免灾难性遗忘。// The Dataset Format Example of ChatMLim_startuser Picture 1:imgvg/VG_100K_2/649.jpg/imgWhat is the sign in the picture?im_endim_startassistant The sign is a road closure with an orange rhombus.im_endim_startuser How is the weather in the picture?im_endim_startassistant The shape of the road closure sign is an orange rhombus.im_end4. 评测 benchmarksImage CaptionGeneral VQAInstruction Following, 指令遵循.5. hf-transformers 推理实操选Qwen2-VL-2B-Instructnvidia A10 24G.5.1 大小拆解从 hf 社区拉取 qwen 的模型文件. 模型权重 safetensors 文件占用为 4GB.参数量模型 语言模型(~ 1.54B约 71% 视觉编码器~ 0.63B约 29%, 共 2.17B.存储精度. 为 BF16, 2 bytes/参数.bf16 砍掉 fp32 一半尾数、保留全部指数位的短 fp32所以它和 fp32 之间转换非常快移位即可且不容易溢出——这也是它在深度学习里取代 fp16 的原因。综合计算, 2.17Billion * 2 Byte 4.3GigaByte4.3 GB.语言模型配置项值作用num_hidden_layers28Transformer 层数hidden_size(H)1536隐藏维度模型宽度intermediate_size(I)8960MLP 中间维度≈5.83×Hnum_attention_heads(Q)12Query 头数head_dim 128num_key_value_heads(KV)2KV 头数GQA远小于 QHvocab_size(V)151936词表大小tie_word_embeddingstrueembedding 与 lm_head 共享权重视觉编码器vision_config配置项值作用depth32ViT 层数比 LLM 还多embed_dim(Eh)1280ViT 隐藏维度num_heads16注意力头数标准 MHA不用 GQAmlp_ratio4MLP 中间维度倍数patch_size14空间 patch 大小temporal_patch_size2时间 patch 大小spatial_merge_size22×2 视觉 token 合并为 1in_chans3RGB 三通道5.2 processor构造 messagesmessages:list[dict[str,object]][{role:user,content:[{type:image,image:./pics/罗小黑.jpg},{type:text,text:请描述这张图片中有什么},],}]qwen_vl_utils.process_vision_info() .这个工具把 messages 里的 image path 转为 PIL.Image 对象, 原始尺寸为(400,744).做 smart resize, 是 patch_size14 的整数倍, 于是为 (39228x14, 75654x14)Qwen2VLProcessor.call().inputs:BatchFeatureprocessor(text[text],imagesimages,return_tensorspt,)BatchFeature 继承自 UserDict,用法上就是dict[str,torch.Tensor]本例 inputs 实际内容:input_ids shape(1,404)dtypetorch.int64 attention_mask shape(1,404)dtypetorch.int64 pixel_values shape(1512,1176)dtypetorch.float32 image_grid_thw shape(1,3)dtypetorch.int64pixel_values, 该 tensor 的第一维代表patch 的个数1512 392/14*756/14; 第二维1176 patch_size**2 * channel_num * temporal_size 14**2 * 3 * 2.image_grid_thw, (t1, h54, w28), 其中 t 时间维静态图片为 1视频才有意义、h/w 空间方向上的 patch 网格行列数5.3 model# 加载模型 (使用 bfloat16 节省显存)modelQwen2VLForConditionalGeneration.from_pretrained(models/Qwen2-VL-2B-Instruct,torch_dtypetorch.bfloat16,device_mapauto,trust_remote_codeTrue,)6. 业务场景的 SFT 及 DPO以上是开源工作. 发布在 HuggingFace, ModelScope 等社区, 如 Qwen3-VL-8B-Instruct如果想结合自己的业务做SFT, 对于 Qwen-VL 8B 大小的模型, 可以选用 内存40G的 GPU, 如 英伟达A800,附录chatMLChat Markup Language, 类比于 xml, 由 openAI 推出的将 对话 组织为样本的 结构化表示格式. 把「指令 输入 期望输出」组织成 role 化的消息序列system设定角色/规则可选user指令 输入assistant期望的回答训练时算 loss 的部分一个例子:|im_start|system You are a helpful assistant.|im_end||im_start|user 指令数据是什么|im_end||im_start|assistant 指令数据是指……|im_end|参考Qwen-VLQwen2-VL: Enhancing Vision-Language Model’s Perception of the World at Any ResolutionViT 论文, 2020 , Google Research An Image is Worth 16x16 Words: Transformers for Image Recognition at Scalemy blog, LLM 大模型的 SFT 及 DPO 实践