
【免费下载链接】Mini-InternVL2-4B-DA-DriveLM项目地址https://ai.gitcode.com/OpenGVLab/Mini-InternVL2-4B-DA-DriveLM点击查看免费下载Mini-InternVL2-4B-DA-DriveLM 是 OpenGVLab 面向自动驾驶领域微调的多模态大模型它如何让看得懂的图像真正说得出来答案藏在一座精巧的桥里视觉特征先经过Pixel Shuffle像素重排降采样再由一个MLP 连接器映射成语言模型能理解的词嵌入空间。本文带你快速读懂这座视觉→语言桥梁的完整实现。1. 先看清整体架构三块拼图的分工 模型由三个部分组成配置文件 config.json 中可以看到全貌组件模型关键参数视觉编码器ViTInternVisionModelimage_size: 448、patch_size: 14、hidden_size: 1024连接器Pixel Shuffle MLPdownsample_ratio: 0.5、ps_version: v2语言模型LLMPhi3ForCausalLMhidden_size: 3072、32 层一次推理的数据流是这样的图片(448×448) → ViT 输出 32×32 个 patch 特征(1024维) → Pixel Shuffle2×2 邻域拼接 → 16×16 个特征(4096维) → MLP 连接器4096 → 3072 维 → 替换文本中的 IMG_CONTEXT 占位符 → Phi-3 语言模型生成文字回答关键洞察ViT 和 LLM 是两个语言不通的模型。ViT 吐出的特征向量LLM 完全看不懂。连接器就是翻译官而 Pixel Shuffle 在翻译前先做了一次压缩排版。2. 为什么必须先降采样从 1024 个 token 到 256 个448×448 的图片按 14×14 切 patch会得到 32×32 1024 个patch 特征。如果每个 patch 都变成一个视觉 token 塞给 LLM序列会非常长注意力开销平方级上涨还会挤占用户问题和回答的上下文空间。Mini-InternVL 的解法是把空间分辨率减半、通道数加倍。降采样比例由 config.json 中的downsample_ratio: 0.5控制每张图片最终对应多少个 token在 modeling_internvl_chat.py 中一眼可见self.num_image_token int((image_size // patch_size) ** 2 * (config.downsample_ratio ** 2)) # (448 // 14)**2 * 0.5**2 1024 * 0.25 256也就是说每张 448×448 图片只消耗 256 个 token且信息并没有被插值丢掉——它被打包进了更宽的向量里。3. Pixel Shuffle 实现原理零参数、零插值的纯重排 Pixel Shuffle 的全部逻辑集中在 modeling_internvl_chat.py 的pixel_shuffle方法def pixel_shuffle(self, x, scale_factor0.5): n, w, h, c x.size() x x.view(n, w, int(h * scale_factor), int(c / scale_factor)) x x.permute(0, 2, 1, 3).contiguous() x x.view(n, int(h * scale_factor), int(w * scale_factor), int(c / (scale_factor * scale_factor))) if self.ps_version v1: warnings.warn(In ps_version v1, the height and width have not been swapped back, which results in a transposed image.) else: x x.permute(0, 2, 1, 3).contiguous() return x拆开看它在做什么以本模型的 32×32×1024 输入为例reshape把高度维拆成16 × 2同时把 1024 个通道看作512 × 2permute调整维度顺序让 2×2 邻域内的 4 个 patch 在内存中排到一起view合并后得到16×16×4096—— 每个新位置的特征正是原来 2×2 小方块里 4 个 patch 特征按行优先顺序首尾拼接。它的巧妙之处纯view/permute操作不经过任何矩阵乘法和插值没有可学习参数开销几乎为零信息无损4 个 patch 的 4×1024 4096 维信息一个不少地保留在新 token 中空间细节只是被压缩打包了空间对应关系正确第 (i, j) 个新 token 精确对应原图 2×2 的方块后续 LLM 能建立这个 token 负责图像哪一块的映射。ps_version 的小坑v1 与 v2 的区别 ⚠️注意方法末尾的分支。ps_version: v1时跳过最后一步permute(0, 2, 1, 3)结果就是宽和高没有换回去输出特征图相当于被转置横向信息错放到纵向。本仓库的 config.json 中配置为ps_version: v2即会执行这次交换保证空间对应关系正确。如果你加载旧版本权重或旧配置需要留意这个参数。4. 特征提取的完整流程extract_feature 逐步拆解上面两步被组织在 modeling_internvl_chat.py 的extract_feature中逐行对应vit_embeds self.vision_model(pixel_values..., ...).last_hidden_state vit_embeds vit_embeds[:, 1:, :] # ① 去掉 CLS token只留 32×321024 个 patch 特征 h w int(vit_embeds.shape[1] ** 0.5) # ② 推出 32×32 网格 vit_embeds vit_embeds.reshape(vit_embeds.shape[0], h, w, -1) vit_embeds self.pixel_shuffle(vit_embeds, scale_factorself.downsample_ratio) # ③ 重排为 16×16×4096 vit_embeds vit_embeds.reshape(vit_embeds.shape[0], -1, vit_embeds.shape[-1]) # ④ 展平成 256×4096 vit_embeds self.mlp1(vit_embeds) # ⑤ MLP 连接器 → 256×3072其中select_layer: -1见 config.json表示取 ViT 最后一层输出若设为正整数则取对应中间层源码中hidden_states[self.select_layer]的分支这是 InternVL 系列常用的消融手段。5. MLP 连接器把 4096 维翻译进 LLM 词汇空间降采样后的特征还是 4096 维而 Phi-3 的隐藏维度是 3072。真正的语言翻译由mlp1完成定义见 modeling_internvl_chat.pyself.mlp1 nn.Sequential( nn.LayerNorm(vit_hidden_size * int(1 / self.downsample_ratio) ** 2), # 4096 nn.Linear(vit_hidden_size * int(1 / self.downsample_ratio) ** 2, llm_hidden_size), # 4096 → 3072 nn.GELU(), nn.Linear(llm_hidden_size, llm_hidden_size) # 3072 → 3072 )结构是经典的LayerNorm → Linear → GELU → Linear输入 4096 1024 × (1/0.5)²正好是 Pixel Shuffle 拼接后的维度两者是上下游关系输出 3072与 config.json 中llm_config.hidden_size: 3072完全对齐可以直接和文本词嵌入并列没有加投影层数上的花活保持轻量符合 Mini-InternVL 口袋模型的定位。6. 最后一公里视觉嵌入如何替换进文本序列连接器输出的 256 个特征向量如何进入对话看 modeling_internvl_chat.py 的generatevit_embeds self.extract_feature(pixel_values) input_embeds self.language_model.get_input_embeddings()(input_ids) selected (input_ids self.img_context_token_id) # 找到 IMG_CONTEXT 位置 input_embeds[selected] vit_embeds.reshape(-1, C) # 原地替换成视觉特征机制很直白chat接口把问题中的image展开为img 256 个IMG_CONTEXT× 图片块数 /img见 modeling_internvl_chat.py这些特殊 token 来自 added_tokens.json其中IMG_CONTEXT对应词表 id32013词表大小 32020编码时所有IMG_CONTEXT位置的文本词嵌入被视觉特征整体覆盖* 0.0 vit_embeds的技巧保证梯度不回流到原嵌入见 modeling_internvl_chat.py于是 Phi-3 看到的序列是... img [256 个视觉向量] /img 用户的问题 ...随后逐词生成回答。顺带一提得益于动态分辨率dynamic_image_size: true、max_dynamic_patch: 12长宽比不规则的图会被切成多块 448×448 的 tile最多 12 块 1 张缩略图每块都贡献 256 个 token这也是该模型能看清道路细节、小字标识的关键。7. 快速体验跑通一次图文对话 使用transformers 4.37.2按 README.md 的 Quick Start 即可from transformers import AutoModel, AutoTokenizer import torch path OpenGVLab/Mini-InternVL2-4B-DA-DriveLM model AutoModel.from_pretrained(path, torch_dtypetorch.bfloat16, low_cpu_mem_usageTrue, trust_remote_codeTrue).eval().cuda() tokenizer AutoTokenizer.from_pretrained(path, trust_remote_codeTrue, use_fastFalse) question image\nPlease describe the image shortly. response model.chat(tokenizer, pixel_values, question, dict(max_new_tokens1024, do_sampleTrue))图片预处理load_image/dynamic_preprocess的完整代码见 README.md。8. 核心文件与参数速查表内容位置Pixel Shuffle 实现modeling_internvl_chat.py特征提取流程 extract_featuremodeling_internvl_chat.pyMLP 连接器 mlp1 定义modeling_internvl_chat.py占位符替换逻辑modeling_internvl_chat.py连接器超参downsample_ratio、ps_version等config.json连接器超参定义configuration_internvl_chat.pyViT 结构24 层、hidden 1024modeling_intern_vit.pyIMG_CONTEXT等新增 tokenadded_tokens.json推理示例代码README.md9. 小结回到开头的问题——视觉特征如何变成语言Pixel Shuffle用一次无参数的张量重排把 1024 个 1024 维 patch 特征打包成 256 个 4096 维特征空间减半、通道翻倍信息无损MLP 连接器LayerNorm 两层 Linear GELU再把 4096 维投影进 Phi-3 的 3072 维嵌入空间最后通过IMG_CONTEXT占位符替换视觉向量与文本词嵌入并肩进入 LLM模型自然输出看得懂的文字。这套重排 轻 MLP的连接器设计正是 Mini-InternVL2-4B-DA-DriveLM 以不到 5% 的参数拿到 90% 性能的秘密之一也是理解 InternVL 系列多模态对齐机制的最佳切入点。赞分享【免费下载链接】Mini-InternVL2-4B-DA-DriveLM项目地址https://ai.gitcode.com/OpenGVLab/Mini-InternVL2-4B-DA-DriveLM点击查看免费下载相关推荐Mini-InternVL2-2B-DA-DriveLM如何看懂图片mlp1跨模态连接器原理全解读Mini InternVL2 2B DA DriveLM如何看懂图片mlp1跨模态连接器原理全解读 Mini InternVL2 2B DA DriveLMini-InternVL2-1B-DA-BDD架构深度拆解PixelShuffleMLP视觉语言连接器源码逐行讲解Mini InternVL2 1B DA BDD架构深度拆解PixelShuffleMLP视觉语言连接器源码逐行讲解 Mini InternVL2 1B D深入Docopilot-2B核心原理Pixel Shuffle下采样与MLP投影的视觉语言对齐实现深入Docopilot 2B核心原理Pixel Shuffle下采样与MLP投影的视觉语言对齐实现 Docopilot 2B 是一个面向 文档级理解 的多模态上一篇零拷贝的魔法video-compress-cj 如何用 Surface 直通硬件编解码大幅降低延迟下一篇在Slack、Discord、微信里继续指挥同一个AIKiro Crew接入10大消息平台教程无需暴露公网端口创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考