本地跑模型的都踩过同一个坑:4B 上下的权重,一张入门显卡就放得下,可一干正经活就露怯,写代码、上终端、跑多步任务都不太撑得住;想往上走 27B、35B,显存又直接见底。摆在你面前通常就两条路------加预算买卡,或者换个更大的权重,再顺带接受慢一点的推理速度。
10 月 16 日英伟达开源的 Dory 1.0-4B,给了第三条路:权重还是 4B 不动,让模型把同一段网络"多跑几圈",用算力去换精度。同一个 checkpoint,服务端改一个参数就能在 1 圈、2 圈、4 圈之间切,不用重新训练,也不用换模型文件。这篇我把它的 10 项官方基准摊开,和 Qwen3.5、Gemma 4 摆在一起,看循环架构到底能不能让一个小模型打穿自己的体重级。
一句话讲清"循环"是怎么回事
常规的 4B 稠密模型,每个 token 固定经过一层层各不相同的网络,出来就完事,算力是死的。Dory 的层被拆成三组:Input 块(8 层)先吃原始 token,中间是占了大头的 Recurrent 块(20 层),最后 Output 块(8 层)把隐层表示换成预测。
关键就在中间那块:它会被反复执行------跑 1 遍、2 遍、4 遍都行。而且每一圈都会把原始输入重新注入,不是只从衰减过的内部状态接着算,所以每一圈都能重新"看"到源上下文,而不是越循环越糊。参数总量一直是 4B 不变,变的只有每个 token 摊到的算力。
这个"循环圈数"是个运行时旋钮,不是训练时定的。这也是它和"把 transformer 层简单垒更多"的本质区别:传统做法是参数和算力一起涨,Dory 是参数据定、只涨算力,等于用一份权重买了三档延迟预算。官方基准表里,同一个模型因此被拆成三列:1 loop、2 loops、4 loops。
三档循环到底赚了多少
先把总表放前面,这是官方模型卡里的数据,我原样搬过来,只加了几列解读:
| 基准 | Dory 1圈 | Dory 2圈 | Dory 4圈 | Qwen3.5-4B | Qwen3.5-9B | Gemma4 26B A4B | Qwen3.6-35B-A3B |
|---|---|---|---|---|---|---|---|
| SWE-bench Verified | 50.3 | 59.5 | 61.8 | 54.7 | 61 | 57.4 | 73.4† |
| Terminal-Bench 2.1 | 12.5 | 18.1 | 22.2 | 15 | 24 | 35 | 43 |
| τ³-bench(银行) | 11.6 | 12.89 | 14.69 | 5.03 | 7.22 | 13.66 | 9.54 |
| GDPval-AA-V2 Elo | 815 | 946 | 967 | 424 | 546 | 751.6 | 987 |
| SciCode | 27.3 | 34.94 | 35.11 | 25.82 | 28.21 | 40.32 | 37.24 |
| IFBench | 74.29 | 77.94 | 79 | 53.83 | 59 | 77.89 | 57.44 |
| AA-LCR(长文) | 63 | 71 | 73 | 64.7 | 68.4 | 64.6 | 68.5 |
| GPQA Diamond | 69.19 | 72.41 | 72.16 | 77.71 | 80.93 | 80.43 | 85.35 |
| HLE(纯文本) | 8.25 | 10.89 | 10.43 | 11.31 | 15.43 | 17.79 | 19.18 |
| AA-Omniscience | 10.03 | 10.08 | 10.03 | 15.02 | 18.05 | 21.13 | 19.95 |
†:Qwen3.6-35B-A3B 的 SWE-bench 分数是官方在自带配置下给出的口径。
乍看能读出两件事。其一,加圈确实在涨,但涨得越来越慢:SWE-bench 从 1 圈的 50.3 到 2 圈 59.5,一口气加 9.2 分;再到 4 圈 61.8,只多挣 2.3 分。其二,收益分配严重不均------编码和 Agent 类任务涨得最多,纯知识类的 GPQA、Omniscience 基本原地踏步,甚至 2 圈到 4 圈还小幅回落(72.41 掉到 72.16)。
英伟达官方给的用法也是这个思路:默认 2 圈,只有在终端操作、软件工程这类吃算力的 Agent 任务上才值得上 4 圈。别把加圈当成无脑的免费午餐,它是在拿延迟换精度,值不值要看具体负载,官方反复提醒"按自己的负载实测端到端延迟"。
如果只想用一条线看懂这个规律,看 GDPval-AA-V2 那行 Elo 最清楚:1 圈 815,2 圈 946,4 圈 967。从 815 到 946 是质变,从 946 到 967 是精修。这条"第二圈吃到最大红利、之后收窄"的曲线,几乎覆盖了表里所有 Agent 类任务,也是你选 2 圈还是 4 圈时最该记在心里的一个形状。
顺带说一句它和英伟达自家 Nemotron 3.5 家族的区别。10 月中的那三款(Super VL 120B、Bolt 74B-A9B、Comet 60B)走的还是传统 MoE/稠密路线,靠稀疏激活降算力;Dory 是 Nemotron Labs 单独放出来的一条循环路线,专门验证"小参数 + 可调算力"这个假设。两者不是替代关系,倒像是同一家公司在本地模型带里下的两注不同的注。
循环的真实代价:真不一定只是"变慢"
有个反直觉的点值得单独展开。加圈确实让每个 token 的算力翻倍,但官方报告里还有个数据:循环圈数越多,模型解决同一个任务时生成的输出 token 反而越少------额外的"思考"发生在隐层空间里逐圈进行,而不是写成一长串可见的推理文字。
所以总延迟不是简单的"圈数 × 单圈时间",而是"更多单圈算力"和"更少输出 token"两个方向在互相抵消。最终会不会更慢、更贵,全看任务类型和推理栈的实现,这也是为什么不能拍脑袋认定圈数越多越好。对高频小任务,1 圈的省算力优势可能比 4 圈的精度更香;对一次性长链路任务,4 圈多花的算力可能被少生成的 token 找回来。
还有个工程坑被顺手填了:KV cache。朴素的循环注意力实现里,每圈都要自己的一份 KV cache,跑 4 圈内存就涨 4 倍,256K 长上下文根本伺候不起。Dory 给了 last-loop 缓存模式------每个循环注意力层只留一份 cache,每圈直接覆盖上一圈,内存占用稳定在一圈的规模。官方称精度和 per-loop 模式几乎一致、输出长度也基本不变,等于免费把循环的精度收益拿到手,还不付内存税,省下的显存还能拿去开更长的上下文或更多并发。
部署试跑:vLLM 和 llama.cpp 都能接
权重给了四种格式:BF16、MXFP8、NVFP4,外加一个 Q5_K_M 的 GGUF 量化版。vLLM 支持还在 PR 里(vllm-project/vllm#60149),要从那个 PR 拉源码装:
VLLM_USE_PRECOMPILED=1 pip install "git+https://github.com/vllm-project/vllm.git@refs/pull/60149/head"
vllm serve --model nvidia/NVIDIA-Nemotron-Labs-Dory1.0-4B-BF16 \
--hf-overrides '{"n_recurrent_loops": 2, "recurrent_kv_cache_mode": "per_loop"}' \
--max-model-len 262144 \
--reasoning-parser nemotron_v3
n_recurrent_loops 就是那个旋钮,改成 1 或 4 就切档。本地 macOS 想跑,走 llama.cpp 那条 PR(ggml-org/llama.cpp#30306),下好 GGUF 后:
./build/bin/llama-server -m ./dory-q5_k_m.gguf --alias dory \
--host 127.0.0.1 --port 8080 -ngl 999 \
--ctx-size 4096 --jinja --reasoning on \
--override-kv "dory.num_loops=int:2,dory.recurrent_kv_cache_mode=str:last_loop"
起来之后就是一套 OpenAI 兼容接口,dory.num_loops 能在 1、2、3、4 之间切,recurrent_kv_cache_mode 换成 last_loop 就把内存压回一圈的规模。调用端完全是标准写法:
from openai import OpenAI
client = OpenAI(base_url="http://127.0.0.1:8080/v1", api_key="EMPTY")
resp = client.chat.completions.create(
model="dory",
messages=[{"role": "user", "content": "写一个 Python 快速排序"}],
max_tokens=16000,
)
这个模型是原生 NVFP4(4-bit 浮点)预训练、再转 BF16 续训的。直接在 4-bit 格式上开训本来就比训完再量化难稳定,但好处是省训练算力和内存,这份底子在牌桌上还换来个意外优势:DGX Spark 上 MXFP8 相对 BF16 有 1.69 到 1.84 倍加速,NVFP4 有 2.17 到 2.44 倍,小卡部署时这个差距挺实在。
上手前有几样东西最好自己先核实,别直接抄了表就上生产。一个是 loop 档位对延迟的真实影响:官方只给了相对趋势,你的 GPU、batch、上下文长度下的实际曲线得自己量。二是 GGUF 那个文件是 Q5_K_M 量化,而上面整张基准表全是在 BF16 上跑的,量化版精度掉多少官方没单独给数,不能拿表里的分去套量化版。三是推理习惯:官方建议 temperature 1.0、top_p 0.95,而且推理模式(reasoning)常开,采样参数照抄,别自己关掉推理开关再抱怨它不如预期。
谁强谁弱,得看任务下菜
把表拆成两类看,Dory 的画像很清晰。在 Agent 和指令遵循那块它是真的能打:4 圈 SWE-bench 61.8,压过 4B 的 Qwen3.5(54.7),打平了 9B 的 Qwen3.5(61);τ³-bench 银行任务 14.69,全场最高,连 35B 的 Qwen3.6(9.54)都被甩开;IFBench 79 更是远远超出 Qwen3.5-4B 的 53.83。这个组合拳说明:循环架构对"需要多步结构化推理、指令严格遵循"的任务加成最大。
反过来,在广撒网的知识和纯推理上,它露了怯:GPQA Diamond 只比 4B 的 Qwen3.5 低一点点,但被 9B、26B、35B 一路拉开;HLE 和 AA-Omniscience 也是全面落后。这个格局很合理------循环再多次,也"想"不出参数里根本没有的知识储备,它擅长的是把已有的推理能力在结构化任务上反复打磨,最怕的是那种"翻字典"式的知识问答。
还有个第三方视角值得记一笔。有评测方指出,英伟达这张对比表用的是 Qwen3.5、Gemma 4 这些上一两代型号,自始至终没有和当前的 Qwen3.8 正面交锋。对一个 4B 模型拿 Qwen3.8-27B(七倍体量)比确实不公平,但也意味着"同代对位"这块数据是空白的,你真要拿来上生产,得自己跑一遍当前这批对手。另外注意它的两个边界:纯文本、英文为主,中文和多模态不在它的射程内。
选型建议
- 跑纯文本、英文为主、Agent 型任务(终端、代码、多步工具调用)------这种"算力可调"的小模型命中率最高,任务高峰期开 4 圈、闲时降回 1 圈省算力,是一张卡能玩出的少见的弹性。
- 需要中文、多模态,或高频事实问答------它不是那块料,回头选 Qwen、Gemma 那类更均衡的权重。
- 在乎许可证:它挂的是 OpenMDW-1.1 自定义协议,不是 Apache 2.0,商用前得让法务过一眼,别当普通开源权重直接拿去卖钱。
- 在乎开箱即用:vLLM 和 llama.cpp 目前都要走 PR 分支编译,离正式 release 还有一步,嫌麻烦就再等等官方合并。
最后说一句趋势层面的判断:MoE 用"稀疏激活"降本,量化用"低精度"降本,循环架构走的是第三条路------参数量恒定、算力弹性伸缩。三者在同一个 4B 到 30B 的本地部署带里彼此错位,互相不替代。往后的本地模型选型,会越来越像个"按负载调算力预算"的工程活,而不是简单的"哪个模型分高买哪个"。
📌 系列文章
- 英伟达三款开源 Agent 模型横评:120B 旗舰、60B 压缩、74B 塞进 24GB
- Muse Spark Open 实测:8160 亿开源模型本地跑,2 台 Mac Studio
- 智能体榜重排:Opus 5.5 Max 上线即领跑,净提升度 15.53%
测了 4 款模型才发现差距这么大。关注我 👆 第一时间获取更多 AI 工具深度横评。