InternVL3.5: Advancing Open-Source Multimodal Models in Versatility, Reasoning, and Efficiency
Paper: arXiv:2508.18265 Code: OpenGVLab/InternVL; Weiyun1025/verl-internvl Code reference:
OpenGVLab/InternVL main@2410d1db(2025-09-22);Weiyun1025/verl-internvl main@3950bc4f(2025-08-29)
1. Motivation (研究动机)
InternVL3.5 的目标不是提出一个单点 benchmark trick,而是把 InternVL 系列推进到“开源 MLLM 套件可以同时覆盖通用多模态、数学/视觉推理、文本推理、GUI/Embodied agent、长视频与高分辨率理解”的阶段。论文的背景判断很直接:2025 年前后闭源模型(论文用 GPT-5 作为代表)在视觉问答、数学、空间推理和 agentic tasks 上继续拉高上限,而开源 MLLM 虽然在单项能力上进步很快,但通常面临三个瓶颈:第一,推理能力仍然依赖 SFT 数据质量,模型在多步视觉数学题、复杂图表、空间关系和动态场景中容易停留在短链路匹配;第二,模型规模扩张带来视觉 token 和语言模型推理的双重成本,高分辨率图像、多图和视频输入使 prefill 阶段变慢;第三,大模型家族通常只给最终 checkpoint,训练 recipe、RL 数据和系统部署策略不透明,使社区难以复现或迁移。
这篇论文要解决的具体问题可以概括为:如何在保留开源可用性的前提下,让一个统一的 MLLM 家族同时获得更强 reasoning、更高 versatility 和更好的 inference efficiency。它把问题拆成三条主线。第一条是训练侧的 Cascade Reinforcement Learning:先用 offline RL/MPO 做稳定 warm-up,再用 online RL/GSPO 继续提升模型自身 rollout 分布的上界。第二条是视觉 token 侧的 Visual Resolution Router (ViR):不是只按图像宽高进行 Dynamic High Resolution 切块,而是让每个 patch 根据语义丰富度选择较高或较低压缩率。第三条是系统部署侧的 Decoupled Vision-Language Deployment (DvD):把 vision encoder 与 LLM 放在不同服务/GPU 组中,让视觉 prefill、视觉特征传输和语言侧 prefill/decoding 异步流水化。
这件事值得研究,是因为 MLLM 的真实使用场景往往同时要求“准、快、可部署”。如果只提升 benchmark 而牺牲推理速度,模型很难用于 GUI 操作、移动端高分辨率 OCR、多图检索或 embodied perception;如果只做压缩而损失复杂视觉推理,则开源模型仍会被限制在简单问答。InternVL3.5 的动机正是把训练 recipe、模型家族和系统效率放到同一篇报告中讨论:用 Cascade RL 增强难题推理,用 ViR/DvD 降低高分辨率和大模型部署的成本,再通过大量 benchmark 证明这些能力不只存在于单一规模模型上。
Figure 1 解读:这张 teaser 把 InternVL3.5 与开源/闭源 MLLM 按 general、reasoning、text、agentic 四类能力做平均对比,斜线柱表示闭源商业模型。核心信息是:InternVL3.5-241B-A28B 在开源模型中处于领先位置,并在总体能力上把与 GPT-5 的差距缩小到 3.9%;同时 30B-A3B 也不是“小模型陪跑”,而是在通用、文本和 agentic 维度保持可用竞争力。图中的重点不是某一个 benchmark 的最高分,而是“一个开源 family 覆盖多任务谱系”的证据。
2. Idea (核心思想)
这篇论文的核心思想是:InternVL3.5 不是单纯扩大参数量,而是用“能力训练 + 视觉 token 自适应 + 系统解耦部署”的三层协同来推进开源 MLLM。最本质的新意有三点。第一,Cascade RL 把 offline RL 的样本效率和 online RL 的上界提升串联起来:MPO 用现有正负偏好样本快速把模型推到较好的策略区域,GSPO 再让模型对自身生成的多候选响应做组内相对优化。第二,ViR 将“图像分辨率”从全图级别的固定选择变成 patch-aware 的语义路由问题:信息密集 patch 用 256 visual tokens,信息稀疏 patch 压到 64 visual tokens。第三,DvD 把 MLLM 的视觉计算与语言计算拆成两个服务,让视觉侧的并行性和语言侧的自回归特性不再互相阻塞。
从模型家族看,InternVL3.5 延续 InternVL 的 ViT–MLP–LLM 范式:InternViT 产生视觉特征,MLP projector 把视觉 hidden size 映射到 LLM hidden size,LLM 使用 Qwen3 或 GPT-OSS。论文给出的配置覆盖 1B、2B、4B、8B、14B、38B、20B-A4B、30B-A3B、241B-A28B,其中 38B 与 241B-A28B 使用 InternViT-6B,其余多数组合使用 InternViT-300M;语言侧分别初始化自 Qwen3-0.6B/1.7B/4B/8B/14B/32B、GPT-OSS-20B、Qwen3-30B-A3B 和 Qwen3-235B-A22B。这个设计让论文可以讨论 dense 与 MoE 两条扩展路线,而不是只报告单一旗舰模型。
Figure 2 解读:图中左侧是 Dynamic High Resolution 的输入预处理:输入图像按预定义长宽比切成多个 patch,例如 2:3 的 896×1344。中间是 InternViT-300M/6B、MLP projector、text tokenizer 和 LLM 的标准 InternVL pipeline。右侧是 InternVL3.5-Flash 的差异:Visual Resolution Router 在 single-image、multi-image、video 等输入上为每个 patch 选择 high/low resolution。它解决的不是“是否要高分辨率”的全局问题,而是“哪些 patch 值得保留更多 token”的局部问题。
这套想法的关键直觉是:MLLM 的瓶颈来自不同层次,单一技术无法同时解决。Cascade RL 主要提升“答得对、推理链更稳”;ViR 主要减少“视觉 token 太多导致 prefill 慢”;DvD 主要缓解“ViT 与 LLM 在同一部署路径上互相等待”。因此论文不是把效率作为训练后的附属优化,而是在模型结构和 serving 设计中同时考虑。实验也按这个逻辑组织:先展示 InternVL3.5 在 35 个 benchmark 上的总体能力,再用 reasoning ablation 说明 Cascade RL 的增益,用 ViR/DvD ablation 说明速度收益和性能保持。
3. Method (方法)
3.1 模型架构:ViT–MLP–LLM 与模型家族
InternVL3.5 继续使用 InternVL 系列的 ViT–MLP–LLM 架构。给定图像,系统先按 Dynamic High Resolution 选择与原图长宽比匹配的 patch 网格;每个视觉 patch 经过 InternViT,丢弃 CLS token 后得到 patch-level hidden states;再通过 pixel shuffle 降采样和 MLP projector 把视觉 token 映射到 LLM 的 embedding 空间;最后用特殊的 image context token 占位,把视觉 embedding 写入语言模型输入序列。论文中的训练目标仍然是 next token prediction (NTP),但只在文本/回答 token 上计算损失:
为减轻长短回答样本的权重偏置,论文沿用 square averaging:
其中 是该训练样本中需要计算 loss 的 token 数。released code 中,GPT-OSS 20B 的 stage1 pretrain 脚本显式设置 --loss_reduction "square",并使用 --max_seq_length 32768、--force_image_size 448、--max_dynamic_patch 12、--down_sample_ratio 0.5、--min_num_frame 8、--max_num_frame 32。8B SFT 脚本也设置 --max_seq_length 32768、batch size 默认 512、学习率 8e-5;8B MPO 脚本则把 --max_seq_length 16384、batch size 默认 256、学习率 2e-7。这些数字来自具体 launch script,而不是 base config 默认值。
released code 中对应的模型路径为 internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py。InternVLChatModel 在初始化时创建 vision_model、language_model 和 mlp1;extract_feature() 读取 ViT hidden states,去掉 CLS token,reshape 成二维网格,调用 pixel_shuffle(),再用 mlp1 投影;forward() 在 input_ids == img_context_token_id 的位置把文本 embedding 替换成视觉 embedding,并把结果交给 language model。这个实现与论文的 ViT–MLP–LLM 描述一致。
def internvl_visual_embedding(pixel_values, input_ids, img_context_token_id, vision_model, projector):
vit_tokens = vision_model(pixel_values).last_hidden_state[:, 1:, :]
h = w = int(vit_tokens.shape[1] ** 0.5)
grid = vit_tokens.reshape(vit_tokens.shape[0], h, w, -1)
# released code uses pixel_shuffle(scale_factor=down_sample_ratio), e.g. 0.5
compressed_grid = pixel_shuffle(grid, scale_factor=0.5)
visual_embeds = projector(compressed_grid.reshape(compressed_grid.shape[0], -1, compressed_grid.shape[-1]))
text_embeds = language_model.get_input_embeddings()(input_ids).clone()
selected = input_ids == img_context_token_id
text_embeds[selected] = visual_embeds.reshape(-1, text_embeds.shape[-1])
return text_embeds3.2 三阶段训练:Pre-training、SFT、Cascade RL
训练 recipe 总览
Figure 3 解读:训练 recipe 分成三条主干。第一阶段是 native pre-training,用大规模文本与多模态语料做视觉-语言对齐。第二阶段是 SFT,用更高质量的 instruction-following、Thinking-mode reasoning 和能力扩展数据适配下游任务。第三阶段是 Cascade RL,用 offline MPO 和 online GSPO 继续提升 reasoning。InternVL3.5-Flash 额外在 ViCO consistency training 和 router training 中学习 ViR。
Pre-training / SFT 数据构成
Pre-training 数据分为 multimodal 与 text-only 两类。多模态数据主要继承 InternVL3 训练语料,覆盖 image captioning、general VQA、数学、科学、图表、OCR、知识 grounding、文档理解、多轮对话和医疗数据;text-only 数据基于 InternLM 系列语料并加入 open-source datasets。论文报告 pre-training 规模约 116M samples、250B tokens,text-only 与 multimodal 约为 1:2.5,最大序列长度 32K。SFT 阶段仍使用 NTP 和 square averaging,数据约 56M samples、130B tokens,text-only 与 multimodal 约为 1:3.5。SFT 的三类数据很重要:一是复用 InternVL3 的 instruction-following 数据以保持广覆盖;二是加入 Thinking mode 多模态推理数据,这些数据由大规模 reasoning model 采样 rollouts,再过滤事实正确性、推理清晰度、冗余和格式;三是能力扩展数据,包括 GUI interaction、embodied interaction、SVG understanding/generation 等。
Cascade RL:offline 到 online
Cascade RL 是方法核心。论文认为 SFT 和 pre-training 主要学习正样本分布,而 RL 可以引入 negative samples,剪掉低质量输出区域。单独 offline RL 的优点是训练效率高、稳定,但上界受限;单独 online RL 可以基于当前模型 rollouts 继续抬高上界,但代价大、训练慢。因此 InternVL3.5 用 Cascade 结构:先用 MPO 作为 offline RL warm-up,使模型进入较好的策略区域并产生更高质量 rollouts;再用 GSPO 做 online RL,基于同一 query 的多响应组内归一化 reward 更新策略。
Offline RL:MPO loss
Offline RL 的 MPO loss 在论文中写为:
MPO components and released code
其中 是 DPO loss, 是 BCO loss, 是 LM generation loss。released code 中,internvl_chat/internvl/train/internvl_chat_mpo.py 调用 MultimodalDPOTrainer,数据样本包含 chosen 与 rejected 两条回答;trainer_dpo.py 的 get_batch_loss_metrics() 支持逗号分隔的 loss_type,逐项调用 dpo_loss() 后按 *_loss_weight 加权,再记录 chosen/rejected rewards、reward accuracy 和 margin。8B MPO launch script 从 OpenGVLab/InternVL3_5-8B-Instruct 初始化,设置 --force_image_size 448、--max_dynamic_patch 12、--down_sample_ratio 0.5、--learning_rate 2e-7,说明 released script 确实锚定了视觉动态分辨率与 MPO 训练路径。
#### MPO pseudo-code
def mpo_offline_step(batch, policy, reference, loss_types, loss_weights, lm_weight=None):
chosen = batch["chosen_input_ids"]
rejected = batch["rejected_input_ids"]
policy_chosen_logps, policy_rejected_logps, nll = policy.concat_forward(chosen, rejected)
ref_chosen_logps, ref_rejected_logps = reference.concat_forward(chosen, rejected)
total = 0.0
for loss_type in loss_types: # e.g. sigmoid DPO + bco_pair
pair_loss, chosen_reward, rejected_reward = dpo_loss(
policy_chosen_logps, policy_rejected_logps,
ref_chosen_logps, ref_rejected_logps,
loss_type=loss_type,
)
total = total + loss_weights[loss_type] * pair_loss.mean()
if lm_weight is not None:
total = total + lm_weight * nll
return totalOnline RL:GSPO objective
Online RL 使用 GSPO。论文先对同一 query 采样 个响应 ,然后用组内 reward 均值与标准差做 advantage: GSPO objective 使用 sequence-level importance ratio:
Released code mapping
released verl-internvl 的 8B online RL script 与论文说法基本一致:algorithm.adv_estimator=grpo 用组内 reward 归一化估计 advantage,actor_rollout_ref.actor.policy_loss.loss_mode=gspo 使用 GSPO policy loss,algorithm.use_kl_in_reward=False、actor_rollout_ref.actor.use_kl_loss=False 表明该脚本没有 reference-model KL reward 约束;
Online RL script config
data.train_files=${CURRENT_PATH}/MMPR-Tiny/mmpr_tiny.parquet,actor_rollout_ref.model.path=OpenGVLab/InternVL3_5-8B-MPO,data.max_prompt_length=8192,data.max_response_length=32768,N_SAMPLES_PER_PROMPT=16,ROLLOUT_BATCH_SIZE=512。
GRPO / GSPO implementation
在 verl/trainer/ppo/core_algos.py 中,GRPO advantage 先把 token-level rewards 沿 response 求和,再按 prompt index 聚合均值/方差并广播到 response mask;GSPO policy loss 计算 sequence-level log importance ratio,clip 后用 seq-mean-token-mean 聚合。
def gspo_online_step(prompts, old_policy, policy, reward_fn, n_samples=16):
responses = old_policy.generate(prompts, n=n_samples, max_response_length=32768)
rewards = reward_fn(prompts, responses)
grouped = group_by_prompt(prompts, responses, rewards)
advantages = []
for group in grouped:
mean = group.rewards.mean()
std = group.rewards.std().clamp_min(1e-6)
advantages.extend((group.rewards - mean) / std)
old_logp = old_policy.log_prob(prompts, responses)
new_logp = policy.log_prob(prompts, responses)
seq_ratio = torch.exp(((new_logp - old_logp) * response_mask).sum(-1) / response_mask.sum(-1))
unclipped = seq_ratio * advantages
clipped = seq_ratio.clamp(1 - eps, 1 + eps) * advantages
return -torch.minimum(unclipped, clipped).mean()3.3 ViCO 与 Visual Resolution Router (ViR)
ViR 是 InternVL3.5-Flash 的关键。普通 Dynamic High Resolution 只根据图像宽高决定怎么切块;ViR 进一步判断每个 patch 的语义丰富度。论文把每个 patch 的候选表示设成两种压缩率: 时一个 patch 表示为 256 tokens, 时表示为 64 tokens。为了避免压缩直接损害模型输出,作者先做 Visual Consistency Learning (ViCO):冻结一个 reference model,reference 总是使用较高视觉 token 预算;policy model 在不同压缩率下训练,使其输出分布接近 reference: Router training 随后把 ViR 训练成二分类器:若压缩后与未压缩输出的 KL/loss ratio 太高,说明该 patch 信息密集,需要保留 ;若 ratio 低,则可压到 。论文中还使用历史滑动窗口中的 值确定阈值 ,让路由目标不依赖一个固定全局阈值。这样得到的 Flash 版本可以把 visual tokens 减少约 50%,同时在表 19 中维持接近 100% 的效果:例如 InternVL3.5-8B overall 80.2,8B-Flash 79.8;38B overall 83.9,38B-Flash 83.4;241B/235B-MoE overall 85.0,Flash 84.5。
def train_visual_resolution_router(batch, reference_model, policy_model, router):
# consistency training: make compressed visual inputs imitate high-token reference outputs
with torch.no_grad():
ref_logits = reference_model(batch.images, compression="1/4").logits
compression = random.choice(["1/4", "1/16"])
policy_logits = policy_model(batch.images, compression=compression).logits
vico_loss = kl_divergence(ref_logits, policy_logits)
# router targets: compare uncompressed vs compressed loss for each patch
loss_256 = token_loss(policy_model(batch.images, compression="1/4"), batch.labels)
loss_64 = token_loss(policy_model(batch.images, compression="1/16"), batch.labels)
ratio = loss_64 / loss_256.clamp_min(1e-6)
target = (ratio > adaptive_threshold(ratio_history)).long() # 1 means keep high resolution
router_loss = F.cross_entropy(router(batch.patch_features), target)
return vico_loss + router_loss论文公式与 released code 实现差异:当前检出的 OpenGVLab/InternVL main@2410d1db 代码包含基础 InternVLChat 的 dynamic image size、pixel shuffle、SFT/MPO launch scripts,以及 README 中指向的 CascadeRL offline/online 路径;Weiyun1025/verl-internvl main@3950bc4f 包含 InternVL3.5 online RL launch scripts 与 GSPO/GRPO 训练实现。但在该 commit 的文本代码搜索中,没有找到以 Visual Resolution Router、ViR 或 DvD 命名的独立实现,也没有找到 vision server/language server/RDMA 等 DvD serving 代码;因此本笔记对 ViR/DvD 的机制解释主要依据论文与 source figures,代码映射只锚定到已公开可检出的 dynamic-resolution/pixel-shuffle、Cascade RL 和 online GSPO 路径。
3.4 DvD:解耦视觉与语言部署
Figure 4 解读:DvD 将传统 MLLM serving 中混在一起的视觉编码和语言推理解耦。vision server 负责 ViT、MLP projector,以及 Flash 版本中的 ViR;language server 只负责 LLM。视觉侧批处理图像并输出 BF16 visual features,通过 TCP 单向传输,必要时用 RDMA 提升吞吐。图中的关键不是“多放几张 GPU”,而是把 vision processing、feature transmission、language prefilling/decoding 做成异步三阶段流水线,减少互相等待。
DvD 的动机来自视觉编码器和语言模型的计算特性差异。ViT 对图像 patch 的处理高度并行,不需要长期 history state;LLM 的自回归 decoding 依赖前序状态,对显存带宽和 latency 更敏感。在普通部署中,高分辨率图像会让视觉侧长时间占用同一批 GPU,语言侧 prefill/decoding 被阻塞;而在纯文本请求中,LLM 本可以更高效运行。DvD 的做法是让视觉服务先把图像压成紧凑 visual embeddings,再传给语言服务与文本上下文融合。这样语言服务更接近纯 LLM serving,视觉服务也可以独立做批处理。论文表 18 的吞吐实验以 16 requests/s 压测,language models 均部署在 8 张 A100 上:在 896 分辨率下,InternVL3.5-38B baseline 为 2.71 requests/s,+DvD 为 5.06(1.87×),+DvD+ViR 为 10.97(4.05×);241B-A28B baseline 为 2.54,+DvD 为 4.73(1.86×),+DvD+ViR 为 8.81(3.47×)。这说明 ViR 减少 token 与 DvD 解耦流水线是互补的。
def dvd_serving_pipeline(request_batch):
# vision service: parallelizable, stateless over decoding history
image_batches = batch_images(request_batch.images)
visual_features = vision_server.encode(image_batches) # ViT + MLP + optional ViR
send_async(visual_features, dst="language_server", dtype="bf16")
# language service: focuses on prefill and autoregressive decoding
text_context = tokenizer(request_batch.prompts)
fused_inputs = insert_visual_features(text_context, recv_async("vision_server"))
prefill_cache = language_server.prefill(fused_inputs)
return language_server.decode(prefill_cache)3.5 测试时扩展与代码映射
论文还沿用 InternVL3 的 Test-Time Scaling (TTS)。对于 reasoning tasks,作者使用 Best-of-N (BoN):采样多个候选推理答案,用 VisualPRM-v1.1 作为 critic 选择最佳响应。这是训练后提升 reasoning breadth 的方法,和 Cascade RL 的关系是互补的:Cascade RL 改变模型策略本身,BoN 在 inference 时从多个候选中挑选更好的路径。实验显示 parallel thinking 可以继续带来增益,例如 InternVL3.5-4B、8B、241B-A28B 的 overall reasoning 分别再提升 +2.6%、+2.1%、+1.8%。
| Paper Concept | Source File | Key Class/Function |
|---|---|---|
ViT–MLP–LLM 基础架构与 image token 替换 | OpenGVLab/InternVL/internvl_chat/internvl/model/internvl_chat/modeling_internvl_chat.py | InternVLChatModel, extract_feature, pixel_shuffle, forward, generate |
| Dynamic High Resolution / pixel shuffle 参数 | OpenGVLab/InternVL/internvl_chat_gpt_oss/shell/internvl3_5_qwen3/internvl3_5_8b_sft.sh | --force_image_size 448, --max_dynamic_patch 12, --down_sample_ratio 0.5, --max_seq_length 32768 |
| Offline RL / MPO | OpenGVLab/InternVL/internvl_chat_gpt_oss/shell/internvl3_5_qwen3/internvl3_5_8b_mpo.sh | internvl/train/internvl_chat_mpo.py, learning rate 2e-7, --max_seq_length 16384 |
| Pairwise preference loss composition | OpenGVLab/InternVL/internvl_chat/internvl/train/trainer_dpo.py | MultimodalDPOTrainer.get_batch_loss_metrics, multi-loss_type weighted sum |
| Online RL / GSPO | Weiyun1025/verl-internvl/shell/internvl3_5_8b.sh | algorithm.adv_estimator=grpo, policy_loss.loss_mode=gspo, N_SAMPLES_PER_PROMPT=16 |
| GRPO advantage 与 GSPO policy loss | Weiyun1025/verl-internvl/verl/trainer/ppo/core_algos.py | compute_grpo_outcome_advantage, compute_policy_loss_gspo |
| DvD/ViR serving 与 router | paper source only in checked commits | 未在上述 released code commit 中找到同名独立实现 |
4. Experimental Setup (实验设置)
论文的实验设置覆盖 35 个 benchmark,并按四类能力组织:General Tasks、Reasoning Tasks、Text-Centric Tasks 和 Agentic Tasks。General 包括 MMStar、MMVet、MMBench V1.1 (en)、MTVQA、AI2D、OCRBench、WildVision、MME-RealWorld、HallusionBench、MVBench、VideoMME、MLVU、LongVideoBench;Reasoning 包括 MMMU、MathVista、MathVision、MathVerse、DynaMath、WeMath、OlympiadBench、LogicVista;Text-Centric 包括 MATH500、AIME24、AIME25、GPQA、MMLU-Pro、C-Eval、GAOKAO、IFEval;Agentic 包括 SGP-Bench、ScreenSpot、ScreenSpot-v2、OSWorld-G、VSI-Bench、ERQA、SpaCE-10、OmniSpatial 等。这样划分的好处是避免只用一个“总榜”掩盖能力结构:InternVL3.5 的强项不仅是 OCR 或普通 VQA,而是 reasoning、文本推理、GUI grounding 和 embodied/spatial tasks 的组合。
对比模型包括两个 InternVL3.5 旗舰变体:InternVL3.5-30B-A3B 与 InternVL3.5-241B-A28B;开源前沿模型包括 GLM-4.1V、Kimi-VL-A3B-2506、Qwen2.5-VL-72B、GLM-4.5V、Step-3;闭源对照包括 GPT-5。论文同时对小规模模型与前代 InternVL3 做比较,用于证明 Cascade RL 的可扩展性。例如在 reasoning ablation 中比较 InternVL3、InternVL3.5-Instruct、InternVL3.5-MPO 和 InternVL3.5-CascadeRL,覆盖 1B、2B、4B、8B、14B、30B-A3B、38B、241B-A28B 等尺度。效率实验则聚焦 38B 与 241B-A28B,在 448、896、1344 三种输入分辨率下比较 baseline、+DvD、+DvD+ViR 的 request throughput。
数据与训练设置方面,pre-training 使用约 116M samples/250B tokens,text-only:multimodal 约 1:2.5,最大序列长度 32K;SFT 使用约 56M samples/130B tokens,text-only:multimodal 约 1:3.5。Cascade RL offline 阶段使用 MMPR-v1.2 作为训练数据,约 200K sample pairs;online 阶段从 MMPR-v1.2 的 rollouts 估计每个 query 的 accuracy,筛选 accuracy 在 0.2 到 0.8 之间的 query,再扩展近期多模态数据,构成 MMPR-Tiny,约 70K queries。ViCO consistency training 主要复用 SFT 数据以保持原能力;router training 使用 SFT 子集,重点是 OCR 与 VQA,因为这些样本视觉信息密集、常需要高分辨率理解。
训练基础设施使用 XTuner,并组合 FSDP、data packing、FP8 training(DeepGEMM)、liger-kernel fused cross-entropy、FlashAttention-3、TMA-Adaptive FP8 Grouped GEMM 等优化。online stage 使用 verl。released code 中,online RL script 使用 Ray job submit,8 GPU/node,ROLLOUT_BATCH_SIZE=512,PPO_MINI_BATCH_SIZE=32,TENSOR_PARALLEL=1,SEQUENCE_PARALLEL=4,vLLM rollout,gpu_memory_utilization=0.8。这些细节说明论文的系统贡献不仅在模型结构,也在大规模训练/推理基础设施上。
5. Experimental Results (实验结果)
5.1 综合能力:开源领先并接近 GPT-5
综合表中,InternVL3.5-241B-A28B 在 general tasks overall 得到 74.1,与 GPT-5 的 74.0 基本持平;reasoning overall 为 67.1,低于 GPT-5 的 74.3,但明显高于多数开源对照;text overall 为 85.3,低于 GPT-5 的 91.3,但高于 Step-3 的 76.9 和 GLM-4.5V 的 79.8;agentic overall 为 66.2。30B-A3B 作为 MoE 中等规模模型,general overall 为 71.0,reasoning overall 为 59.5,text overall 为 78.9,agentic overall 为 60.6。论文强调的“与 GPT-5 总体差距 3.9%”来自 Figure 1 的多类平均,而不是单一任务。
具体 benchmark 上,InternVL3.5-241B-A28B 在 MMMU(val) 得到 77.7,MathVista 82.7,MathVision 63.9,MathVerse vision-only 68.5,DynaMath 46.5,WeMath 62.3,LogicVista 66.7;30B-A3B 在 MMMU(val) 为 75.6,MathVista 80.9。文本侧,241B-A28B 在 MATH500 为 98.0,AIME24 为 84.7,AIME25 为 75.6,GPQA 为 73.2,MMLU-Pro 为 81.3,GAOKAO 为 94.5,IFEval 为 83.7。这些数字说明 InternVL3.5 的“reasoning”并不只来自视觉数学题,还包括纯文本数学、考试和指令遵循。
5.2 Cascade RL ablation:MPO 稳定 warm-up,GSPO 继续抬上界
Figure 5 解读:这张图展示从 InternVL3 到 InternVL3.5-Instruct、MPO、CascadeRL 的平均 reasoning 增益。最重要的趋势是:SFT 已经大幅增强推理,但 MPO 和 CascadeRL 仍能在 strong SFT baseline 上继续提升;CascadeRL 对小模型和大模型都有效,说明它不是只对 241B-A28B 旗舰模型有用。
表 17 给出的 reasoning ablation 更清楚;其中 8B 模型从 InternVL3-8B 的 44.3 提升到 InternVL3.5-8B-CascadeRL 的 60.3,正好对应论文摘要强调的 +16.0% overall reasoning gain。1B 模型中,InternVL3-1B overall 25.1,InternVL3.5-1B-Instruct 25.7,MPO 29.1,CascadeRL 33.8;2B 从 Instruct 38.5 到 CascadeRL 50.7,提升 12.2;
8B 从 InternVL3-8B 的 44.3 到 InternVL3.5-8B-Instruct 53.6,再到 MPO 56.3,CascadeRL 60.3;38B 从 InternVL3-38B 的 52.8 到 CascadeRL 66.0;241B-A28B 从 Instruct 60.4 到 MPO 62.4,再到 CascadeRL 66.9。论文也比较 GPU hours:8B 上,MPO 只需约 0.3K GPU hours,把 overall 从 53.6 提到 56.3;单独 GSPO 1 episode 约 5.5K hours 得到 57.3,2 episodes 约 11.0K hours 得到 58.2;
CascadeRL 约 5.8K hours 得到 60.3。这是 Cascade 的主要证据:用接近一轮 online RL 的成本获得更高收益。
5.3 ViR 与 DvD:吞吐提升不等于牺牲性能
ViR 的性能保持在表 19 中体现。InternVL3.5-8B overall 80.2,8B-Flash 79.8;38B 为 83.9,38B-Flash 83.4;30B-MoE 为 82.6,Flash 82.2;235B-MoE 为 85.0,Flash 84.5。在具体任务上也没有出现系统性崩溃:例如 8B 的 DocVQA 92.3→91.9,ChartVQA 86.7→86.6,MMMU 73.4→72.9,MathVista 78.4→78.0。这说明 patch-aware 压缩不是简单砍 token,而是通过 ViCO 与 router training 学会保留关键视觉信息。
DvD 与 ViR 的效率收益在高分辨率下更明显。38B 在 448 分辨率下 baseline 12.39 requests/s,+DvD 14.69(1.19×),+DvD+ViR 18.62(1.50×);在 896 分辨率下 baseline 2.71,+DvD 5.06(1.87×),+DvD+ViR 10.97(4.05×);在 1344 分辨率下 baseline 1.48,+DvD 2.92(1.97×),+DvD+ViR 5.14(3.47×)。241B-A28B 同样在 896 分辨率下从 2.54 提到 8.81(3.47×)。结论是:当视觉分辨率升高时,视觉侧阻塞更严重,DvD 的解耦价值更大;当 ViR 同时减少 visual tokens 时,语言侧 prefill 的负担也下降。
5.4 Agentic、GUI 与 embodied 能力
GUI 结果显示 InternVL3.5 不只是静态图片问答模型。InternVL3.5-241B-A28B 在 ScreenSpot 为 89.8,ScreenSpot-v2 为 92.9,OSWorld-G 为 53.2,WindowsAgentArena 为 18.0,WebArena-Lite-v2 为 11.7。论文特别指出,它在 ScreenSpot-v2 上比专门 GUI 模型 UI-TARS-72B 高 2.6%,与 Seed1.5-VL 的 95.2 接近;在 WindowsAgentArena 上比 Qwen2.5-VL-72B 高 8.3%,而 GPT-4o 在该 benchmark 上只有 3.5。Embodied/spatial 类任务中,VSI-Bench、ERQA、SpaCE-10、OmniSpatial 等结果表明模型对复杂动态环境和空间关系有一定泛化潜力。
这些结果的意义在于:InternVL3.5 的 SFT 能力扩展数据与 reasoning RL 并没有局限在“考试题”。GUI、embodied、SVG、长视频、多图和 OCR 都要求模型处理高分辨率、多步推理和动作/位置语义;如果一个模型只在 MMMU/MathVista 上提高,而 GUI 或 embodied 表现下降,说明它可能只是过拟合 reasoning 数据。InternVL3.5 的实验覆盖说明其训练 recipe 更像一个 generalist MLLM family,而不是单一 reasoning checkpoint。
5.5 局限与读者使用建议
第一,论文报告是系统/模型家族论文,很多内部数据与完整训练基础设施无法完全从公开代码复现。公开代码提供了重要锚点:SFT/MPO launch scripts、InternVLChat model、online GSPO scripts、MMPR 数据链接和 README 中的 CascadeRL 路径;但本次代码搜索没有在当前 commit 中找到独立的 ViR/DvD serving 实现。因此,如果读者想复现论文完整速度收益,需要把论文描述的 vision server/language server pipeline 自行工程化,不能只运行基础 InternVLChat inference。
第二,Cascade RL 的收益来自数据筛选与 reward/verifier 质量。MMPR-Tiny 只保留 accuracy 在 0.2 到 0.8 的 queries,这个范围排除了太容易和太难的问题;若迁移到其他领域,必须重新构建 query difficulty 分布,否则 online RL 可能浪费在无梯度信号或噪声 reward 上。第三,ViR 的 50% token reduction 是在 ViCO consistency + router training 之后得到的,不能简单用固定低分辨率替代;对 OCR、图表和细粒度空间关系任务,错误压缩 patch 会直接伤害答案。
我的理解是,InternVL3.5 最值得借鉴的部分不是“241B-A28B 又刷新了榜单”,而是它把开源 MLLM 的训练和部署经验整理成可迁移的 recipe:用 strong SFT 构建广覆盖能力,用 offline MPO 快速引入 preference signal,用 online GSPO 提升模型自身 rollout 的高难推理上界,用 ViR 在视觉 token 上做语义级预算分配,用 DvD 避免视觉与语言服务互相阻塞。对于后续做 VLM pretraining/architecture 的工作,这篇论文的价值在于提供了一个端到端 design pattern:模型结构、RL post-training、数据筛选和 inference systems 必须一起设计,才能让开源 MLLM 在真实应用中同时可用、可扩展、可部署。