【免费下载链接】InternVL2-40B项目地址https://ai.gitcode.com/OpenGVLab/InternVL2-40B点击查看免费下载InternVL2-40B 是 OpenGVLab 开源的多模态大语言模型视觉塔 InternViT-6B 语言塔 Yi-34B约 40B 参数。本文拆解它的两大核心技术dynamic_preprocess 动态分辨率分块算法和Pixel Shuffle 降维——前者让模型看清任意宽高比的图片后者把视觉 token 压缩 4 倍以节省上下文。一、为什么需要动态分辨率多模态模型常把图片统一缩放到 448×448 再输入。这样做的问题是图片被拉变形文字、图表等细节失真宽高比悬殊的图长截图、横幅被迫留大片黑边浪费 token 还不看清细节。而 InternVL2-40B 主打 DocVQA93.9、OCRBench837等文档与 OCR 场景见 README.md Performance 表格对细节要求极高。它的解法是按原图宽高比把图片切成 i×j 个 448×448 的块tile每块独立过 ViT再额外附一张全图缩略图——局部块保细节缩略图保全局token 数量随图片形状自适应。二、dynamic_preprocess 分块算法三步走分块逻辑位于 README.md Quick Start 的dynamic_preprocess与find_closest_aspect_ratio第 225–284 行。核心参数参数本模型取值含义image_size448每块边长像素min_num1最少块数max_num12最多块数max_dynamic_patchuse_thumbnailTrue多块时是否追加一张 448×448 全图缩略图2.1 枚举候选网格target_ratios set( (i, j) for n in range(min_num, max_num 1) for i in range(1, n 1) for j in range(1, n 1) if i * j max_num and i * j min_num)它枚举所有 i×j 且总块数 i·j ≤ 12 的网格组合例如 (1,1)、(2,1)、(2,2)、(3,2)、(4,3)、(1,12)……2.2 匹配最接近的宽高比find_closest_aspect_ratio逐一对比各网格宽高比与原图宽高比的差值取差值最小者若差值相同优先选覆盖面积更大的组合。2.3 缩放、切块、加缩略图选中 (i, j) 后把整图 resize 成448×i宽×448×j高再按 448 网格切成 i×j 张块如果块数大于 1再补一张 448×448 的全图缩略图。图片形状选中网格输出块数含缩略图方形 1:11×11无缩略图宽横幅 ≈2:12×12 1本文示例图 1000×747 ≈4:34×3比值 1.333 ≈ 1.33912 1 13也就是说一张 4:3 的照片最多产生 13 张 448px 的块这就是动态的含义——token 预算按图形状伸缩上限由max_dynamic_patch: 12见 config.json 第 100 行兜底。三、Pixel Shuffle 降维原理3.1 从 1024 个 token 到 256 个 token每块 448×448 进入 ViT 后patch_size14被切成 32×32 1024 个 patch token维度 3200。若全部送入 LLM40B 模型 8K 上下文会很快被图片占满。Pixel Shuffle 的思路把空间上相邻的 2×2 个 token 的向量横向拼接再线性投影——序列长度缩为 1/4同时保住局部空间结构。整个过程是零参数的张量重排计算几乎免费。核心实现在 modeling_internvl_chat.py#L165-L179def 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: ... else: x x.permute(0, 2, 1, 3).contiguous() # v2 修正常态化纵横排布 return x以downsample_ratio0.5为例形状变化为[N, 32, 32, 3200] → [N, 16, 16, 12800]1024 个 3200 维向量合并成 256 个 12800 维向量。本模型的ps_version为v2见 config.json 第 103 行修正了 v1 版本高度/宽度未换回导致的图像转置问题。3.2 MLP 投影与 token 数在 extract_feature第 181–199 行中降维后的特征送入mlp1投影到语言模型维度mlp1 LayerNorm(12800) → Linear(12800, 7168) → GELU → Linear(7168, 7168)7168 即 Yi-34B 的hidden_size见 config.json 第 39 行。于是每块 448px 最终贡献环节数量/维度ViT 原始 patch token32×32 1024 个 × 3200Pixel Shuffle 后16×16 256 个 × 12800mlp1 投影后num_image_token256 个 × 7168num_image_token的计算公式在 modeling_internvl_chat.py#L51(448 // 14)² × 0.5² 256。推理时提示词里的image会被替换为img 256×块数 个IMG_CONTEXT占位符 /imgViT 特征精确对号入座填充进去见 modeling_internvl_chat.py#L105-L126 与chat方法第 280–282 行。四、完整数据流一图流以示例图 examples/image1.jpg1000×747 的小熊猫照片走一遍完整链路load_image()调用dynamic_preprocess(image, image_size448, use_thumbnailTrue, max_num12)README.md 第 278–284 行→ 4×3 网格切出 12 块 1 张缩略图共13 张 448×44813 块各自过 InternViT-6B45 层→ 各得 1024 个 patch tokenextract_feature对每块做 Pixel Shuffle mlp1→ 各 256 个图像 token合计13 × 256 3328 个视觉 token视觉 token 替换进 prompt 的IMG_CONTEXT位置与问题文本一起送入 Yi-34B 语言模型生成回答。 直观对比方形图只需 1 块256 token本文 4:3 示例图需要 13 块3328 token——细节换 token花得恰到好处。五、关键参数速查与文件导航配置项config.json值作用force_image_size448每块基准边长dynamic_image_sizetrue启用动态分辨率min_dynamic_patch/max_dynamic_patch1 / 12块数下限/上限use_thumbnailtrue多块时附加全图缩略图downsample_ratio0.5Pixel Shuffle 合并 2×2ps_versionv2修正纵横排布的版本select_layer-1取 ViT 最后一层输出想动手验证可以从这几处读起分块算法README.md Quick Start →dynamic_preprocess第 240–276 行降维核心modeling_internvl_chat.py →pixel_shuffle第 165 行、extract_feature第 181 行视觉塔结构modeling_intern_vit.py →InternVisionEmbeddings第 133 行超参数定义configuration_internvl_chat.py第 22–63 行、configuration_intern_vit.py一句话总结InternVL2-40B 用 dynamic_preprocess 把任意图片按形分块喂给 ViT再用 Pixel Shuffle 以近乎零成本把每块的 token 压缩 4 倍——既保住了 OCR 级细节又让 40B 大模型装得下长上下文这正是它登顶开源多模态榜单的底层秘密。赞分享【免费下载链接】InternVL2-40B项目地址https://ai.gitcode.com/OpenGVLab/InternVL2-40B点击查看免费下载相关推荐InternVL3_5-1B-Instruct动态高分辨率详解448动态切片与Pixel Shuffle降采样原理InternVL3_5 1B Instruct动态高分辨率详解448动态切片与Pixel Shuffle降采样原理 InternVL3_5 1B InstruInternVL2_5-4B-MPO架构深度拆解ViT-MLP-LLM范式与Pixel Shuffle动态分辨率机制揭秘InternVL2_5 4B MPO架构深度拆解ViT MLP LLM范式与Pixel Shuffle动态分辨率机制揭秘 InternVL2_5 4B MPOMini-InternVL2-2B-DA-DriveLM动态图像分辨率的秘密dynamic_preprocess十二切片机制详解Mini InternVL2 2B DA DriveLM动态图像分辨率的秘密dynamic_preprocess十二切片机制详解 Mini InternVL2上一篇终极指南使用OpenCore Legacy Patcher让老旧Mac焕发新生下一篇如何让老旧Mac重获新生OpenCore Legacy Patcher终极指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?