NVIDIA Dory 1.0 4B 怎么跑:3.7GB GGUF 四档算力实测

一句话结论:NVIDIA Nemotron Labs 的 Dory 1.0 4B 用一份 3.7GB 的 GGUF 权重就能跑出四档算力,从 1 圈到 4 圈共享同一个检查点,切换靠推理时的一个参数,不重训也不换模型。

过去两年小模型的路线很固定。要么做大参数换准确率,要么砍小换速度,两头都在互相挤。NVIDIA Nemotron Labs 10 月 16 日发布的 Dory 1.0 4B 换了个思路,把层堆拆成输入块、循环块、输出块三段,中间那 20 层做成可复用的共享块,推理时决定它跑几遍。跑一遍省算力,跑四遍换准确度,同一份权重服务全部四档需求。

这批成绩单在 11 月被一份 llama.cpp 实操指南带进了大众视野,指南把整条链路从编译、下载、校验一路跑到服务端实测。下面按架构、跑分、显存、部署四层把它拆开。

36 层拆成 8 + 20 + 8 的循环架构

Dory 1.0 4B 的架构官方称为 looped (latent-recurrent) normalized-GPT,底层是 nGPT 骨架,交替使用滑动窗口注意力与完整注意力层。总参数量 4B,上下文长度最高 256K,官方支持语言为英语。

关键在层堆的三段划分。输入块 I 有 8 层,循环块 R 有 20 层,输出块 O 有 8 层。R 块不是一个复制四遍的副本,而是一组共享权重,每一轮循环都会把输入重新注回去。

这个设计带来两个直接后果。参数量在所有档位下恒定,循环增加的是每个 token 的计算量,而不是权重规模。另一层后果更反直觉,NVIDIA 的模型卡明确写了,循环次数增加时模型完成同一批任务所需的生成 token 反而更少,多出来的算力被花在了隐空间推理上,而不是更长的输出里。

训练侧还有一条容易被忽略的信息。Dory 的预训练原生跑在 NVIDIA 自家的 NVFP4 四位浮点格式上,之后再切到 BF16 继续训练。数据规模是 6 万亿 token 预训练加 3000 亿 token 上下文扩展,强化学习阶段用了 GRPO,覆盖数学、代码、科学、指令遵循、多步工具调用、多轮对话与结构化输出。

发布格式一共四种。BF16 是原版,基准分都出自这一版。MXFP8 是 8 位权重 16 位激活,NVFP4 是 4 位权重 16 位激活。给本地跑的还有 Q5_K_M 的 GGUF 量化版。在 DGX Spark 上相对 BF16,MXFP8 的推理加速在 1.69 倍到 1.84 倍之间,NVFP4 是 2.17 倍到 2.44 倍。

循环档位的真实分数差:官方跑分全表

下面是 NVIDIA 在统一评测框架下测出的完整分数。表内前三列是 Dory 自己在 1 圈、2 圈、4 圈下的成绩,后四列是对照模型。

任务 Dory 1 圈 Dory 2 圈 Dory 4 圈 Qwen3.5-4B Qwen3.5-9B Gemma 4 26B A4B Qwen3.6-35B-A3B
SciCode 27.3 34.94 35.11 25.82 28.21 40.32 37.24
SWE-bench Verified 50.3 59.5 61.8 54.7 61 57.40 73.4
Terminal-Bench 2.1 12.5 18.1 22.2 15 24 35 43
τ³-bench (Banking) 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
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
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
AA-Omniscience (准确率) 10.03 10.08 10.03 15.02 18.05 21.13 19.95

表里有几处值得停下来看。

代码类任务对循环最敏感。SWE-bench Verified 从 1 圈的 50.3 涨到 4 圈的 61.8,提升 11.5 分,Terminal-Bench 2.1 从 12.5 涨到 22.2,接近翻倍。4 圈的 Dory 在这两项上都压过了 Qwen3.5-4B 与 Gemma 4 26B A4B。

但循环不是万能药。GPQA Diamond 在 2 圈是 72.41,4 圈反而回落到 72.16。HLE 同样是 2 圈 10.89 领先,4 圈退到 10.43。通用知识项 AA-Omniscience 三档几乎完全没动,10.03 / 10.08 / 10.03。模型卡给出的解释是,循环带来的准确率增益大部分来自第二圈,第三圈往后收益迅速变小。NVIDIA 推荐把 2 圈作为默认起点。

对照里最扎眼的是 AA-Omniscience 一列。Qwen3.5-4B 拿 15.02,Qwen3.5-9B 拿 18.05,Gemma 4 26B A4B 拿 21.13,Dory 三档全在 10 出头。4B 规模的知识储备就是知识储备,靠循环补不回来。终端指令类的 IFBench 是另一面,Dory 1 圈 74.29 已经压过 Qwen3.5-9B 的 59。

值得单独记一笔的是 GDPval-AA-V2 的 Elo。Dory 从 1 圈的 815 跳到 2 圈的 946,再到 4 圈的 967,已经逼近 Qwen3.6-35B-A3B 的 987,而后者参数是它的近九倍。真实工作交付能力上的差距,比知识题上的差距要小得多。

两种 KV 缓存模式,显存差出几倍

一般的循环架构有个通病。权重共享了,但每一圈仍要各存一份 KV cache,循环次数一加,显存就跟着涨。Dory 为此提供了 last-loop 缓存模式,每个循环注意力层只保留最后一份 KV 状态。

启用后,无论循环设几圈,KV 缓存占用都保持在与 1 圈等效的水平,等于把循环的额外成本完全压回计算侧。NVIDIA 内部实验记录,last-loop 与 per_loop 的准确率接近,输出长度也几乎没有差别。

两种模式在参数层面就是一个开关。per_loop 是 dory.recurrent_kv_cache_mode=str:per_loop,last_loop 是把值换成 last_loop。模型卡同时提到,per_loop 模式下每加一圈内存就涨一档,last_loop 模式下则保持 1 圈的尺寸不变。

对小模型本地部署来说这一点分量很重。KV cache 常年是长上下文场景的显存大头,同样是 8K 上下文,per_loop 的 4 圈配置和 last_loop 的 4 圈配置在显存账上是两张完全不同的表。站内关于固定 KV 缓存与并发实测的讨论可以参考 EdgeRock-4B 开源:72 MiB 固定 KV,AIME 82.9 分,同一套显存账的算法在更小的模型上更极端。

3.7GB 的 GGUF 怎么跑起来

现在到实操环节。截至目前 llama.cpp 上游还没有合并 Dory 的支持,相关 PR 仍是草稿状态,所以必须按模型卡指定的 commit 编译,不能直接用发行版。

指定分支是 NVIDIA 工程师 Brian Chmiel 的 fork,commit 为 98a74c97ea09ac72f6ceda1559808fc0a2f447ce。Apple Silicon 编译要带上 Metal 相关 flag,CUDA 机器则需要按自己显卡的算力版本编译内核。

权重文件是 NVIDIA-Nemotron-Labs-Dory1.0-4B-Q5_K_M.gguf,预期大小 3,673,288,864 字节。校验值给了 SHA-256,可以直接对着比。

echo "96080be49ffd67b916018b7bdef8c484762576fb52780e10ab98ac4978a660e0  dory-q5_k_m.gguf" | shasum -a 256 -c -

服务端的启动参数里,真正决定档位的是 –override-kv 那一段。dory.num_loops 设成 1、2、3、4 任一整数都行,dory.recurrent_kv_cache_mode 决定用哪种缓存。完整命令大致是这样。

./build/bin/llama-server -m ./dory-q5_k_m.gguf --alias dory \
  --host 127.0.0.1 --port 8080 -ngl 999 \
  --ctx-size 4096 --parallel 1 \
  --batch-size 512 --ubatch-size 512 \
  --cache-type-k f16 --cache-type-v f16 \
  --flash-attn off --no-context-shift \
  --jinja --reasoning on \
  --temp 1.0 --top-p 0.95 --top-k 0 --min-p 0 --repeat-penalty 1 \
  --override-kv "dory.num_loops=int:2,dory.recurrent_kv_cache_mode=str:last_loop"

服务起来后 Web 界面在 8080 端口,OpenAI 兼容接口同样在 8080 的 /v1 路径下,模型标识取 –alias 设的名字。采样参数官方建议温度 1.0、top_p 0.95。

如果是多卡或要压吞吐,vLLM 侧也有对应支持,但当前同样在 PR 阶段,需要按 PR 号安装。相关的部署细节,站内 Ollama 并发怎么设:NUM_PARALLEL 实测与四种崩法 那篇讲的本地服务并发调优,对照着看能少踩一些坑。

什么场景该用几圈

把上面的分数翻译成决策规则,其实不复杂。

日常问答、分类、摘要这类不吃知识的活,1 圈足够。4 圈在 AA-Omniscience 上和 1 圈一样是 10.03,多花三倍算力换不到任何东西,纯亏。

代码修改、终端操作、多步工具调用这类要动手的活,2 圈是甜点。SWE-bench 从 50.3 跳到 59.5,Terminal-Bench 从 12.5 到 18.1,两项都是最大单跳增幅。

只有当准确率压过一切时才上 4 圈。SWE-bench 4 圈 61.8,GDPval Elo 967,都是全场最高,但 GPQA 和 HLE 反而不如 2 圈,而且吞吐会按比例往下掉。

显存紧张的机器优先开 last_loop 缓存,这样 4 圈和 1 圈的缓存占用一样,代价只是算得更慢。上下文长度也要匹配着调,模型卡给的 256K 是上限,本地实跑的常见起点是 4096。

同一档位内部还有选择空间。4B 这个体量放在消费级卡上跑得动,但要不要选它,取决于你的任务是不是本地推理。本地模型选型的显存账怎么算,站内 Qwen-Image 与 FLUX 显存对比:22GB 卡跑 1024 实测 里算的是图像任务,换成文本任务时口径会松一些,但权重大小先决定能不能装下的道理是通的。像 Recursive Flint 开源:40B 只激活 2.5B,本地跑 131 tok/s 那样用稀疏激活压低实际算力需求,和 Dory 用循环换准确度,是同一张牌的两面。

常见问题

Dory 1.0 4B 到底是什么,和普通小模型的最大区别在哪

它是一个 4B 参数的 looped 小模型,核心差别是中间 20 层做成共享块,可以在推理时决定跑 1 到 4 遍。同一份权重因此能服务四档算力预算,不需要重训也不需要换模型,普通模型的速度与能力取舍在训练时就固化了。

循环开到 4 圈就一定更好吗

不一定。代码类任务确实持续变好,SWE-bench Verified 从 50.3 涨到 61.8。但 GPQA Diamond 4 圈 72.16 比 2 圈 72.41 低,HLE 也从 10.89 退到 10.43。NVIDIA 自己的建议是 2 圈起步,收益的大头在第二圈。

本地跑 Dory 需要什么硬件

一份 3.7GB 的 Q5_K_M 量化权重加一张消费级显卡就能起步,Apple Silicon 走 Metal。但需要自己按指定 commit 编译 llama.cpp,官方发行版目前还加载不了这个模型。官方没给明确的最低显存要求,实际占用取决于上下文长度、循环档位和是否开 last-loop 缓存。

小结

Dory 1.0 4B 把小模型的一个长期矛盾换了个问法。以前要速度就得把模型做小,要能力就得把模型做大,现在可以在推理时按任务调节计算量,一份权重覆盖从 1 圈到 4 圈的需求,而且加圈数不掉参数不掉显存(前提是开 last-loop 缓存)。

它当然不是万能答案。知识储备那一栏它就是打不过同规模的 Qwen 与 Gemma,4 圈也补不上。真正亮眼的是代码与终端任务,以及 GDPval 那个 967 的 Elo。编码智能体在这个尺寸上的能力基线有多高,可以对照 Recursive Flint 开源 与 Hy-Nomas 拆解 两篇本地实测看看。