535.4 分压过人类冠军:NVIDIA 把 Nemotron 训成了 IOI 金牌选手
去年的剧情大家还记得:OpenAI 的系统在 IOI 2025 拿到金牌线以上的成绩,但分数仍然排在人类顶尖选手之后。当时很多人(包括我)的判断是——AI 拿金牌可以,想在 IOI 这种比赛里赢过第一名,还得再等几年。
结果等来的不是几年,是一年。
NVIDIA 这篇新论文直接把系统拉到了 IOI 2026 的正式比赛窗口里跑:同样的时间限制、同样断网、同样每题 50 次提交上限,最后得分 535.4 分(满分 600),不仅碾过 361.12 的金牌线,还压过了人类最高分选手的 498.27 分。论文自己声明,这是 AI 系统第一次在 IOI 题集上跑赢最高分人类选手。
核心摘要:这篇论文做了一套端到端的竞赛编程后训练管线——22,000 道精选题、DeepSeek-V4-Flash 蒸馏的上百万条推理轨迹、长上下文 SFT、可执行奖励的 GRPO 强化学习,再加一个反馈驱动的测试时计算策略 GenCorrect。30B-A3B 的 Nano-CC 在 IOI 2025 上从 130 分一路爬到 468 分过金牌线;550B-A55B 的 Ultra-CC 只靠 SFT 就到 502 分。然后他们把这套经验搬到 IOI 2026 实战,现场跑出 535.4 分超过人类冠军。我的判断:这不是底层算法突破,而是把数据、后训练、推理时扩展三件事都做到位的系统工程胜利,含金量在于"每个环节的贡献都拆开量过了"。
论文信息 - 标题:Post-Training Language Models for Gold-Medal Performance in Coding Competitions - 作者:Aleksander Ficek, Sean Narenthiran, Mehrzad Samadi, Somshubra Majumdar, Boris Ginsburg(NVIDIA) - 链接:https://arxiv.org/abs/2609.02849 (2026 年 9 月 2 日提交)
🎯 为什么这件事值得聊
先说句公道话。AI 打竞赛编程这两年进步很快,OpenAI、DeepSeek、包括 NVIDIA 自己之前的 GenCluster 都报道过 IOI/ICPC 金牌级成绩。但仔细看这些系统,有个共同的毛病:你根本不知道金牌是怎么来的。是模型大了?数据多了?推理时堆了 1000 个样本?还是后训练管线的功劳?所有变量搅在一起,闭源系统更是黑盒。
我之前跟做推理训练的朋友聊过,大家最想要的就是一份"分解报告"——SFT 贡献多少、RL 贡献多少、测试时计算贡献多少、模型规模又贡献多少。这篇论文恰好就是这么一份报告,而且最后还附赠了一个实战彩蛋:直接拉到 IOI 2026 现场跑了一次。

图1a:Nano-CC 的完整爬坡曲线。基座 130 分 → 3 个 epoch 的 SFT 爬到 280 → RL 再到 291 → 5 轮 GenCorrect(每轮 10 次提交)一路涨到 468,越过 438.3 的金牌线。注意银牌线 338、铜牌线 252 也都在图上——基座模型连铜牌都摸不到。

图1b:IOI 2026 现场结果。金牌线 361.12,人类最高分选手 498.27,Competition Ultra-CC 现场跑出 535.4。
🏗️ 管线全貌:四段流水线
整套管线分四段,图里画得很清楚。

图2:完整管线。数据策展(22K 竞赛题 + 4K 可执行环境)→ SFT(120 万条 DeepSeek-V4-Flash 轨迹)→ RL(GRPO,可执行奖励)→ 测试时 GenCorrect 迭代提交。Nano-CC 走完整四段,Ultra-CC 跳过 RL。
数据策展。从 16 个地区性和国际性竞赛家族(跨度二十年)加在线判题平台收了 22,000 道题,用自动化管线把每道题打包成可执行评测环境——题面、约束、测试用例、参考解全齐,只保留参考解和生成解判定一致的环境。防污染这块做得比较规矩:IOI 2025、ICPC 2025、LiveCodeBench Pro 的题全部从训练集里剔除并去重;IOI 2026 是严格的前瞻性评估,因为系统在题目公开之前就跑完了。
SFT。用 DeepSeek-V4-Flash 当教师,给 Nano 生成 120 万条推理轨迹,给 Ultra 生成 477,642 条。难度加权采样——难题多配生成量——还混入了"自我改进"轨迹:教师对自己之前生成的解答再做一轮修正。这个设计不是随手加的,它直接在 SFT 数据里预埋了 GenCorrect 推理时要用的迭代修正行为。Nano 训 3 个 epoch,Ultra 只训 1 个 epoch,序列打包到 262K token,全局 batch 64。Ultra 从它的 RLVR-teacher checkpoint 初始化。
RL。只对 Nano 做(Ultra 规模的 RL 算力扛不住)。筛出 3,219 个有可靠可执行环境的题,按父题级别切成 2,847 训练 / 372 验证——防止同一道题的子任务同时漏进两边。用 NeMo RL 跑 GRPO:每步 64 个 prompt × 16 条 rollout = 1,024 条,温度 1.0,生成的 C++17 代码编译执行,满分给 1 否则给 0,token 级裁剪策略梯度,不带参考策略 KL 惩罚(DAPO 那套做法),checkpoint 全靠留出验证集选。
GenCorrect。这是论文里最有意思的部件,值得单独拆。
🔧 GenCorrect:把评测器反馈吃干榨净
一句话版本:GenCorrect 是个闭环——生成一大批候选解,挑出多样性最高的 10 个提交,拿到子任务分数反馈,带着反馈再生成下一批。IOI 场景下跑 5 轮 × 10 次提交,正好卡满官方 50 次提交上限。

图3:GenCorrect 一轮的内部流程。题面进来 → 并行生成 200 个候选解并本地编译 → token-shingle 多样性选择聚出若干簇 → 每簇派代表共 10 个提交 → 收到子任务分数(如图中的 [100, 40, 0, 100, 3])→ 挑 3 个最好的解作为 few-shot 参考进入下一轮。
每轮四步:
- 生成:最多 200 个候选解并行生成,本地编译。第一轮只看题面,后续轮次额外看之前的解和评测反馈。
- 多样性选择:过滤掉无效输出后,用一个不看分数的局部启发式 \(Q(c)\) 初始化中心集,然后迭代选离现有中心最远的候选:
选最多 10 个中心,每个候选归到最相似的中心,每簇派 \(Q(c)\) 最高的当代表。这个"最远点采样 + 簇代表"的路数,跟 AlphaCode 系列的聚类筛选一脉相承,但这里用的是 token-shingle 相似度,轻量。
- 执行:10 个代表提交给评测器。IOI 的反馈是子任务级分数。注意一个细节:当前轮的所有筛选和选择都发生在看到分数之前——没有偷看答案的嫌疑。
- 精炼:累积每个子任务的历史最高分:
下一轮以累积的子任务分数向量 \(A_r\) 为条件,再配上 3 个互补参考解——分别负责保住已解决的子任务、瞄准剩余缺口、维持多样性。
跟之前工作的差别在哪?OpenAI 那套和 GenCluster 是把题拆成子任务让模型逐个打,GenCorrect 是把所有子任务一次性扔给模型,让它自己决定先啃哪块。论文说这样每题需要的生成量少得多。说实话我觉得这个设计更贴近人类选手的真实行为——谁打比赛会把题拆成子任务再逐个解决?都是整体读题、自己规划。

图4:左边是 22K 竞赛题的难度分布(Easy 29% / Medium 39% / Hard 30%),右边是 SFT 轨迹构成——Hard 占 56.3%,难度加权很明显;另有 17.3% 是自我修正轨迹,给 GenCorrect 的迭代行为打伏笔。
📊 实验:每个环节值多少分,全拆开了
主结果先上桌。
| 模型 | IOI 2025 Score@1 | ICPC 2025 Pass@1 | LCB Pro Pass@1 |
|---|---|---|---|
| Nemotron-3-Nano-30B-A3B(基座) | 21.7% | 16.9% | 17.6% |
| Nemotron-Cascade-2-30B-A3B | 37.2% | 42.0% | 45.6% |
| gpt-oss-120b | 40.7% | 45.8% | 66.4% |
| Qwen3.6-35B-A3B | 40.8% | 32.0% | 58.4% |
| Nemotron-3-Ultra-550B-A55B(基座) | 45.5% | 54.0% | 72.6% |
| DeepSeek-V4-Flash | 55.3% | 65.8% | 69.5% |
| DeepSeek-V4-Pro | 56.8% | 69.6% | 78.2% |
| GLM-5.2 | 66.0% | 65.7% | 83.8% |
| Nemotron-3-Nano-CC | 48.5% | 51.0% | 71.6% |
| Nemotron-3-Ultra-CC | 50.7% | 57.4% | 74.5% |
表1:单样本主结果。所有竞赛成绩都是作者用自己的评测框架重新跑的,不是抄各家报告——这点值得加分,横向对比才公平。
几个值得停一秒的数字。Nano-CC 只有 3B 激活参数,IOI Score@1 干到了 48.5%,超过自家 55B 激活参数的 Ultra 基座(45.5%),也压过 gpt-oss-120b 和 Qwen3.6。LCB Pro 上 71.6% 甚至赢了 DeepSeek-V4-Flash(69.5%)——要知道 Nano-CC 的 SFT 数据可就是 V4-Flash 蒸馏出来的,学生超过老师,说明后训练管线确实加了东西。当然,离 GLM-5.2 的 83.8% 还差得远,这个后面细说。

图5:IOI 2025 原始分对比(灰点 Score@1,绿点 Score@200)。高亮的两行是 Nano-CC(291→461)和 Ultra-CC(304→505)。注意并行采样拉开的差距:Ultra-CC 比 Nano-CC 单样本只高 13 分,200 样本下差距拉大到 44 分。
SFT 是最大头

图6:Nano-CC 三个 epoch 的 SFT 曲线。IOI Score@1 从 21.7% 涨到 47.3%,ICPC Pass@1 从 16.9% 到 46.7%,LCB Pro 从 17.6% 一路飙到 70.7%。大部分增益集中在第一个 epoch,第三个 epoch 已经接近饱和。
SFT 一个环节就吃掉了绝大部分增益:IOI 涨 25.6 个点,ICPC 涨 29.8 个点,LCB Pro 涨 53.1 个点。LCB Pro 那个斜率陡得有点夸张——从 17.6% 到 70.7%,说实话我第一反应是检查有没有数据泄漏,但论文明确说了 LCB Pro 的题从训练集剔除并去重过,只能理解为竞赛编程能力向普通代码生成的强迁移。
Ultra-CC 这边是另一个故事:只用 477,642 条样本训 1 个 epoch,IOI 从 45.5% 到 50.7%,ICPC 54.0% 到 57.4%,LCB Pro 72.6 到 74.5%。增幅比 Nano 小得多,但终点比 Nano 高。这就引出论文里我觉得最值钱的一个工程结论:当模型规模和推理成本不是主要约束时,给强基座做轻度 SFT,比给小模型做重度后训练更划算。Nano 吃了 3 个 epoch × 120 万样本再加 RL,还是被只吃了 47.8 万样本的 Ultra-CC 全面压过。
RL 是添头,但不是没用
RL 从第三 epoch 的 SFT checkpoint 出发:IOI Score@1 从 47.3% 微涨到 48.5%,ICPC Pass@1 从 46.7% 到 51.0%,LCB Pro 从 70.7% 到 71.6%。第 39 步用留出验证集选出。

图7:RL 训练曲线。三个基准都在涨但幅度有限,ICPC 涨得最多(约 4 个点)。曲线抖动感比较明显,长轨迹稀疏奖励的典型表现。

图8:四条线分别是无 SFT、SFT 1/2/3 epoch 后启动 RL。无 SFT 时 RL 也能把 IOI 从 21.7% 拉到 24.9%,但 30 步后依然远远追不上 SFT 的起点;从 epoch 1/2/3 启动则分别收敛到 43.0%、47.1%、48.7%。
为什么 RL 只涨这么点?论文给了两个解释,我觉得都在点上。一是二值奖励的 GRPO 只有当一个 rollout 组里既有成功又有失败时才有相对学习信号——SFT 已经把简单题都拿下了,剩下的题要么全会要么全不会,有效梯度天然稀薄。二是 rollout 最长 255K token,只在终点拿一个执行奖励,信用分配链条拉得太长。这个跟我们之前做长链路 agent 训练时碰到的问题一模一样——奖励越稀疏越靠后,RL 的边际收益越小。
但图8 的信息量更大:RL 替代不了 SFT。直接从基座硬上 RL,30 步只涨到 24.9%,而 SFT 一个 epoch 就到 43% 了。原因也直白——教师模型太强,蒸馏直接把能力灌进去了,RL 从0开始探索根本追不上。这个结论对工程选型很有参考价值:有强教师可用时,先蒸再说,RL 是用来挤最后几个点的,不是用来从0造轮子的。
GenCorrect:测试时计算的爆发力
这是全文涨幅最猛的一段。

图9:GenCorrect 五轮的分数爬坡。Nano-CC 从 360.6 涨到 468.2(第四轮过金牌线),Ultra-CC 从 343.9 涨到 502.0(第三轮就过线)。虚线是金银铜牌阈值,阴影是 5 次运行的 min-max 区间。
几个数字值得咂摸。Nano-CC 五轮涨了 107.6 分,Ultra-CC 涨了 158.1 分——比 SFT 全程的贡献还大。而且注意起点:第一轮结束时 Ultra-CC(343.9)还落后于 Nano-CC(360.6),五轮后反超 33.8 分。结合图5 里 Score@200 的差距(461 vs 505),论文的判断是大模型在测试时计算上获益更多:候选池质量更高,利用评测反馈修正的效率也更高。说白了——哦不,你想想看——小模型是"单发精度不够靠多次尝试凑",大模型是"每次尝试的质量都更高,迭代修正的复利也更大"。

图10:ICPC 场景。Nano-CC 从 8.6 题涨到 9.4 题(第三轮起触及金牌线对应的 9 题),Ultra-CC 从 9.0 到 9.6。两个模型都比 IOI 场景更快饱和。
ICPC 上饱和明显更快,论文的解释我很认同:ICPC 是二值反馈(过/不过),IOI 是子任务级分数——反馈的信息量决定了迭代修正能走多远。IOI 告诉你"子任务 3 拿了 40 分",你就知道往哪改;ICPC 只告诉你"错了",修正方向全靠蒙。这个观察对所有做 test-time compute 的人都有用:想靠反馈迭代提分,先想办法把反馈做细。
🚀 IOI 2026 实战:三个针对性改造
通用管线跑完后,作者用 IOI 2025 当开发集,给实战系统做了三个改造。
换教师:GLM-5.2 替掉 DeepSeek-V4-Flash。既然结论是"强基座 + 轻度 SFT 最划算",那教师就要挑最强的。候选教师对比很能说明问题:
| 系统 | IOI 2025 Score@1 | 平均生成长度 |
|---|---|---|
| GLM-5.2 | 66.0% | 85,927 |
| DeepSeek-V4-Flash | 55.3% | 120,456 |
| Ultra-CC(GLM-5.2 蒸馏) | 59.4% | 84,244 |
| Ultra-CC(V4-Flash 蒸馏) | 50.7% | 89,626 |
表2:教师模型对比及蒸馏后的学生表现。GLM-5.2 分更高、输出更短,蒸馏后学生的优势也跟着迁移。
GLM-5.2 比 V4-Flash 高 10.7 个点,输出还短了 30%——输出短意味着固定推理窗口内能生成更多候选,对 GenCorrect 这种堆候选的打法是直接利好。蒸馏后差距保持:GLM 版 Ultra-CC 59.4% vs V4 版 50.7%。教师的天花板就是学生的天花板,再一次验证。
最后一轮扩到 1000 个候选。前四轮维持 200 生成 / 10 提交,第五轮把生成预算拉到 1,000,然后用一套借鉴 GenCluster 的执行式选择来挑:让模型生成 50 个测试输入生成器和校验器,过滤出 100 个有效测试输入,把所有编译过的候选都跑一遍,再让模型按子任务标准写个打分脚本,按分数排名取前 10 提交。因为只有一次现场机会,通用管线第五轮已经饱和,不如把算力全砸在扩大候选池上。
NVFP4 量化换吞吐。这是我觉得最"实战"的一个改造。用 NVIDIA Model Optimizer 的 NVFP4 配方量化 Ultra,1,000 条 32K token 的 SFT 数据做校准。权衡表很直观:
| 精度 | KV Cache | Prefix | MTP | IOI 2025 Score@1 | 吞吐(tokens/s/GPU) |
|---|---|---|---|---|---|
| BF16 | — | — | — | 59.4% | 199.1 |
| NVFP4 | FP8 | Off | 5 | 52.8% | 736.8 |
| NVFP4 | BF16 | Off | 5 | 52.7% | 741.9 |
| NVFP4 | BF16 | On | 5 | 52.9% | 698.5 |
| NVFP4 | BF16 | On | Off | 53.5% | 345.9 |
表3:量化配置权衡。实战选了第一行 NVFP4 配置:牺牲 6.6 个点的单样本精度,换 3.7 倍吞吐。
6.6 个点换 3.7 倍吞吐,单看是亏的,但放进 GenCorrect 的框架里就是赚的——单样本精度掉的那些分,靠更大的候选池和迭代修正能赚回来。比赛窗口内算力是硬约束,吞吐就是候选数,候选数就是分数。现场峰值用了 760 张 GB300 GPU。
最终结果:535.4 / 600,超金牌线 174.3 分,超人类最高分 37.1 分。赛后用通用五轮 GenCorrect 管线补跑,平均 521.72(区间 495.0–545.8)——现场成绩比通用管线均值高 13.68 分,落在正常波动区间内,说明针对性改造确实加了分,但没有脱离管线本身的能力范围。这个交叉验证做得挺扎实。
🤔 我的判断
先泼第一盆冷水:这不是等资源对比。760 张 GB300 跑两个小时,对标的是人类选手一台笔记本五个小时。论文自己在 Limitations 里也承认了这一点——这是系统级对比,不是公平决斗。人类选手不会并行生成 1000 个候选解再挑 10 个提交。所以这个"超越人类冠军"的正确读法是"在给定比赛规则下,AI 系统的分数上限已经超过人类",而不是"AI 的算法能力超过人类冠军"。
第二盆冷水:这次跑分是非官方、无监督的。论文脚注写得很清楚,系统不是 IOI 正式参赛选手,运行没有 IOI 监督,成绩不进官方排名。再加上训练数据因为第三方再分发限制无法完整公开(只放 checkpoint 和 NeMo-Skills 的推理评测配方),外部复现会打折扣。
第三点是关于"第一个"的警惕。论文声明"to our knowledge 第一个在 IOI 题集上跑赢人类最高分的 AI 系统"。OpenAI 去年 IOI 2025 的成绩是金牌线以上但没过第一名,这个声明大概率站得住,但各家都在快速迭代,这个"第一"的窗口期可能很短。
但这些都不妨碍我认为这是今年竞赛编程方向最值得读的论文之一。理由有三。一是归因做得干净:SFT、RL、模型规模、测试时计算各自贡献多少,全部分开量过,"强基座轻 SFT > 弱基座重后训练"、"RL 替代不了蒸馏"、"反馈粒度决定 TTC 上限"这几个结论都有直接数据支撑,对工程选型是真金白银的参考。二是 GenCorrect 的设计足够通用——多样性聚类 + 子任务分数累积 + 参考解续写,这套闭环不限于竞赛编程,任何有自动化评测器的场景(代码修复、SQL 生成、形式化证明)都能搬。三是实战部分展示了一个完整的研究到落地的路径:先用通用管线做消融找出杠杆点,再针对实战约束(单次机会、算力墙、时间窗)做定点改造,量化换吞吐这笔账算得明明白白。
如果你在做代码模型的后训练,这篇的表1、图6、图8 值得截图存下来;如果你在做 test-time compute,GenCorrect 的完整流程和"反馈信息量决定饱和速度"这个结论值得抄走。至于 IOI 金牌本身——说实话,到这个时间点,AI 拿 IOI 金牌已经不是新闻了,怎么拿的、每个环节值多少分,才是。
觉得有启发的话,欢迎点赞、在看、转发。跟进最新AI前沿,关注我