news 2026/10/18 5:02:18

InternVL3.5-2B-Pretrained架构深度拆解:ViT-MLP-LLM范式与Pixel Shuffle特征压缩原理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
InternVL3.5-2B-Pretrained架构深度拆解:ViT-MLP-LLM范式与Pixel Shuffle特征压缩原理

【免费下载链接】InternVL3_5-2B-Pretrained

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3_5-2B-Pretrained
点击查看免费下载

InternVL3.5-2B-Pretrained 是上海 AI Lab 开源的 2.3B 参数多模态大模型预训练底座,采用经典的ViT-MLP-LLM三段式架构:InternViT-300M 视觉编码器 + 两层 MLP 适配器 + Qwen3-1.7B 语言模型。它的最大技术亮点是Pixel Shuffle 特征压缩——在不增加任何可学习参数的情况下,把每个图像切片的 1024 个视觉 token 压缩到 256 个,大幅降低 LLM 侧的计算开销。本文带你从配置文件到源码逐层拆解这套架构。

快速上手:30秒认识这个模型

在深入架构前,先用一张表认清这个模型的"家底":

组件型号参数量关键规格
视觉编码器 ViTInternViT-300M-448px0.3B24 层,hidden 1024,patch 14,输入 448×448
视觉压缩Pixel Shuffle + MLP极少1024 token → 256 token
语言模型 LLMQwen3-1.7B2.0B28 层,hidden 2048,40K 上下文
合计—2.3Bbf16 精度,单卡 A100 可跑

⚠️ 注意:Pretrained后缀表示该权重只完成了CPT(多模态持续预训练)阶段,尚未做 SFT 指令对齐。想直接对话请选同系列的Instruct版本;本仓库适合用于理解架构和二次预训练。

如需本地获取权重:

git clone https://gitcode.com/OpenGVLab/InternVL3_5-2B-Pretrained

整体架构:ViT-MLP-LLM 三段式数据流

InternVL 系列始终坚持 "ViT–MLP–LLM" 范式,整个前向过程可以概括为 5 步:

  1. 切图:图片被动态切成 1~12 个 448×448 的切片(tile),每个切片独立送入 ViT
  2. 提特征:InternViT 把每个切片编码为 32×32 = 1024 个 patch 特征(维度 1024)
  3. Pixel Shuffle 压缩:重排张量形状,得到 16×16 = 256 个 token(维度 4096)
  4. MLP 适配:mlp1模块把 4096 维特征投影到 LLM 的 2048 维词嵌入空间
  5. 注入与生成:视觉特征替换掉文本序列中的<IMG_CONTEXT>占位 token,Qwen3 自回归生成回答

主模型类定义在 modeling_internvl_chat.py,三大组件在__init__中拼装完成。

ViT 视觉编码器:InternViT-300M

视觉塔配置声明在 config.json 的vision_config字段,对应实现为 modeling_intern_vit.py 中的InternVisionModel:

  • Patch 嵌入:一个Conv2d(3, 1024, kernel=14, stride=14)卷积直接把图像切成 14×14 像素块并投影到 1024 维,见 modeling_intern_vit.py。448÷14 = 32,因此每个切片产生 32×32 = 1024 个 patch,再拼上一个可学习的 CLS token
  • 编码器:24 层 Transformer,16 个注意力头,前馈中间维度 4096,使用 LayerNorm 与 0.1 的 drop_path
  • 注意力:支持 FlashAttention(use_fa3: true),带 QK-Norm 选项,见 modeling_intern_vit.py
  • 位置编码:可学习位置嵌入 + 双三次插值(bicubic interpolation),支持任意分辨率的切片,这正是动态高分辨率的基础

MLP 适配器:4096 → 2048 的"翻译官"

ViT 输出 1024 维特征,而 Qwen3 的词嵌入空间是 2048 维,二者之间靠mlp1衔接。源码在 modeling_internvl_chat.py:

层类型输入 → 输出
1LayerNorm4096 → 4096
2Linear4096 → 2048
3GELU2048 → 2048
4Linear2048 → 2048

注意输入维度是4096 而不是 1024——因为 Pixel Shuffle 先把 4 个相邻 patch 的通道拼在一起(1024 × 4 = 4096)。downsample_ratio=0.5是理解这个设计的钥匙。

LLM:Qwen3-1.7B

语言模型部分直接复用 Qwen3-1.7B,config.json 中llm_config的关键参数:

参数值说明
num_hidden_layers2828 层 Transformer
hidden_size2048与 mlp1 输出对齐
num_attention_heads/num_key_value_heads16 / 8GQA 分组查询注意力
intermediate_size6144前馈网络宽度
max_position_embeddings4096040K 长上下文
rope_theta1000000旋转位置编码基频

多模态融合的核心技巧在 modeling_internvl_chat.py:不新增任何交叉注意力层,而是直接把视觉特征当作 embedding 塞进输入序列,LLM 用标准因果注意力统一处理图文 token,架构上极其简洁。

Pixel Shuffle 特征压缩原理详解

这是 InternVL3.5 效率设计的精髓。完整实现在 modeling_internvl_chat.py 的pixel_shuffle方法,没有任何可学习参数,纯粹是三次张量 reshape/permute 重排。

压缩过程图解(以单个 448 切片为例)

ViT 输出 (1, 32, 32, 1024) 32×32 个 patch,每个 1024 维 │ 第1步 view:把高度维拆成 (16 × 0.5),通道维拆成 (1024 ÷ 0.5 = 2048) ▼ (1, 32, 16, 2048) │ 第2步 permute:交换宽高轴顺序 ▼ (1, 16, 32, 2048) │ 第3步 view:把宽度维与通道再合并 → 16×16 个 token,每个 4096 维 ▼ Pixel Shuffle 后 (1, 16, 16, 4096) 256 个 token,每个 4096 维

直观理解:把 32×32 的 patch 网格按 2×2 分组,每组的 4 个 patch 特征首尾拼接成一个"超级 token"。信息总量守恒(1024 个 ×1024 维 = 256 个 ×4096 维),但喂给 LLM 的 token 数减少了 4 倍——而 LLM 的自注意力开销与 token 数的平方成正比,所以压缩 4 个 token 能省下约 16 倍的注意力计算。

关键数字怎么来的

每个切片送进 LLM 的 token 数由 modeling_internvl_chat.py 一行公式决定:

num_image_token = (image_size // patch_size)² × downsample_ratio² = (448 // 14)² × 0.5² = 1024 × 0.25 = 256

也就是说:1 个 448 切片 = 256 个视觉 token;开启最大 12 切片 + 缩略图时,一张图最多占 13 × 256 =3328 个 token。

ps_version 的小细节

配置中ps_version: "v2"(见 configuration_internvl_chat.py)值得留意:v1 版本在重排后没有把宽高轴换回来,会导致图像特征被转置;v2 通过一次额外的permute(0,2,1,3)修正了这个问题(源码警告信息见 modeling_internvl_chat.py)。

完整特征提取流水线

extract_feature方法(modeling_internvl_chat.py)把上述环节串起来:

  1. ViT 前向取last_hidden_state(1 个 CLS + 1024 个 patch token)
  2. vit_embeds[:, 1:, :]丢弃 CLS token
  3. reshape 成(32, 32, 1024)空间布局
  4. pixel_shuffle压缩为(16, 16, 4096)
  5. 展平为(256, 4096)后经mlp1得到(256, 2048)
  6. 按顺序注入文本序列的<IMG_CONTEXT>位置

动态高分辨率:一张图到底喂几个切片

固定 448 分辨率会损失细节,InternVL 的做法是动态切块:根据原图宽高比,从候选比例中选出最接近的网格(如 2:1、3:1),切成最多 12 块 448 小图,再附加 1 张全图缩略图。相关开关都在 config.json 里:

配置项值含义
dynamic_image_sizetrue启用动态分辨率
min_dynamic_patch1最少 1 个切片
max_dynamic_patch12最多 12 个切片
use_thumbnailtrue附加缩略图,保留全局信息

文本侧的占位协议由 added_tokens.json 定义的特殊 token 完成:<img>(151669)开头,<</img>>(151670)结尾,中间填充256 × 切片数个<IMG_CONTEXT>(151671)。对话模板逻辑见 conversation.py 中的internvl2_5模板,modeling_internvl_chat.py 的chat方法负责把<image>占位符展开成对应数量的视觉 token 序列。

预训练阶段:CPT 做了什么

InternVL3.5-2B-Pretrained位于官方四阶段训练管线的第一个位置:

CPT(本权重)→ SFT → MPO(离线RL)→ GSPO(在线RL)

CPT 阶段的核心做法(详见 README.md 的 Pre-Training 章节):

  • 基座合并:视觉塔 InternViT-300M-448px-V2_5 + 语言塔 Qwen3-1.7B,通过 merge 方式组合
  • 全参数联合更新:ViT、MLP、LLM 一起训,损失函数为标准 next token prediction,但前缀可以是文本 token 或图像 token
  • 平方根平均重加权:按 1/√N 对每条样本的 NTP 损失加权,避免偏袒长/短回复
  • 随机 JPEG 压缩增广:提升真实场景鲁棒性
  • 训练语料:MMPR-v1.2、MMPR-Tiny 两个多模态语料库

模型权重全部存放在 model.safetensors 中,词表为 vocab.json(151,936 词位)+ merges.txt,对话行为由 generation_config.json 控制。

配置文件导航:读懂每个 .py 的分工

文件角色关键内容
config.json总配置vision_config、llm_config、downsample_ratio
configuration_intern_vit.pyViT 配置类InternVisionConfig,patch/层数/头数
configuration_internvl_chat.py组合配置类InternVLChatConfig,downsample_ratio=0.5等
modeling_intern_vit.py视觉编码器InternVisionModel、Patch 嵌入、FlashAttention
modeling_internvl_chat.py主模型InternVLChatModel、pixel_shuffle、chat
conversation.py对话模板internvl2_5模板、system message 管理
added_tokens.json特殊 token<img>/</img>/<IMG_CONTEXT>及数学、工具 token

💡给二次开发者的建议:如果要做视觉微调,只需关注vision_model与mlp1的权重名;若只关心指令能力,LLM 侧权重可直接对照 Qwen3-1.7B 结构理解。

总结:为什么这套设计值得学习

✅架构极简:没有复杂的跨模态注意力桥,ViT 特征经 MLP 投影后直接并入 LLM 输入流,好训、好部署、好推理

✅压缩零成本:Pixel Shuffle 纯重排、无可学习参数,token 数降 4 倍而信息无损,是"用形状换序列长度"的教科书操作

✅动态分辨率:1~12 切片自适应 + 缩略图,在细节与全局之间取得平衡

✅规格透明:所有关键超参(downsample_ratio、max_dynamic_patch、ps_version)都明文写在 config.json 中,架构与配置一一对应

InternVL3.5-2B-Pretrained 证明了:小体量多模态模型也能通过精巧的 token 压缩策略,把算力花在最刀刃的地方。理解了 ViT-MLP-LLM 与 Pixel Shuffle 这套范式,你就掌握了 InternVL 全系列(从 1B 到 241B)的共同骨架。

【免费下载链接】InternVL3_5-2B-Pretrained

项目地址:https://ai.gitcode.com/OpenGVLab/InternVL3_5-2B-Pretrained
点击查看免费下载
上一篇:CodexManager请求日志与费用统计详解:如何追踪Token消耗、缓存命中率与请求耗时
下一篇:Week 2 实战:基于 FastAPI + SQLite + Ollama 的 LLM 动作项抽取器(modern-software-dev-assignments 课程实践)

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/18 4:58:31

呕吐毒素与 T-2 毒素“助攻”猪链球菌穿越肠道屏障? | MDPI Toxins

研究背景 呕吐毒素 (DON) 与T-2 毒素是镰刀菌产生的主要单端孢霉烯族毒素&#xff0c;广泛污染猪饲料 (约 88% 育肥猪饲料检出DON)。二者破坏肠道屏障。猪链球菌 (S. suis) 是重要猪病原菌&#xff0c;可致败血症、脑膜炎。慢性低剂量毒素是否促进其易位长期缺乏证据。近期&am…

作者头像 李华
网站建设 2026/10/18 4:58:13

LTX-2 视频生成完整指南:从安装到出片

LTX-2 视频生成完整指南&#xff1a;从安装到出片 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo ComfyUI-LTXVideo 是一套 LTX-2 ComfyUI 视频生成的扩展节点&#xff1a;它把文…

作者头像 李华
网站建设 2026/10/18 4:58:07

微信小程序图片自适应:widthFix与bindload方案对比

简介&#xff1a;这份PDF资料聚焦微信小程序中图片尺寸的动态适配问题&#xff0c;面向需要处理商品详情页、图文列表等场景的开发者&#xff0c;尤其适合希望摆脱image组件默认固定宽高限制、实现按原图比例显示图片的前端人员。资源包共1个PDF文件&#xff0c;大小约51KB&…

作者头像 李华
网站建设 2026/10/18 4:52:41

基于YOLOv5与PyQt5的行人车辆实时检测计数系统开发实践

前阵子有个做交通调研的朋友找我帮忙&#xff0c;想做一个能自动统计路口行人和车辆数量的工具。一开始以为只是简单的目标检测&#xff0c;后来实际做下来才发现&#xff0c;从模型选型、数据训练到桌面界面开发、计数逻辑实现&#xff0c;每一步都有不少坑。最后我做出了一套…

作者头像 李华