商汤开源 SenseNova Loop-9B:32 层权重跑 56 次计算,"9B 打 27B"这笔账怎么算
2026 年 10 月 30 日,商汤开源了日日新 SenseNova Loop-9B-Preview,Apache 2.0 许可,权重在 Hugging Face,代码在 GitHub。这是国内第一个把 Looped Transformer 做到 9B 量级、还带原生多模态的开源模型。
官方口径很直接:仅 9B 参数,媲美 27B 参数模型。在 WorkBuddy Bench、RaccoonPPT Bench、AutomationBench 三个基准上超过 Qwen3.5-27B。
这个说法值得拆。不是因为它是吹牛,而是因为"9B 打 27B"背后有一笔明确的工程账——参数量省了,但计算量没省。省下来的是显存,花出去的是时间和电。
本文按一次前向传播的顺序走一遍:从入口层进去,穿过循环体两遍,从输出头出来。每一站停下来核对一次规格,最后给一份自己就能跑的验收清单。
一、规格表:它到底是个什么东西
先把官方写清的参数摊开。以下全部标注来源档位:**【官方】指仓库 README 或商汤官方发布稿原文;【推算】指本文根据官方参数推导;【未披露】**指公开材料没有说明。
| 项目 | 数值 | 来源 |
|---|---|---|
| 发布时间 | 2026-10-30 | 【官方】GitHub News |
| 许可证 | Apache 2.0 | 【官方】仓库 LICENSE |
| 总参数 | 约 9B | 【官方】 |
| 推理等效参数 | 约 14.6B | 【官方】 |
| 独立解码器层 | 32 层 | 【官方】 |
| 每前向层执行次数 | 56 次 | 【官方】 |
| 循环区间 | 层 [4, 28),共 24 层,权重执行 2 遍 | 【官方】 |
| 循环形式 | B(B(h)) | 【官方】 |
| 隐藏维度 | 4,096 | 【官方】 |
| FFN 维度 | 12,288 | 【官方】 |
| 词表大小 | 248,320 | 【官方】 |
| 全注意力头 / KV 头 | 16 / 4 | 【官方】 |
| 注意力结构 | 每 4 层一组:3 层线性注意力 + 1 层全注意力 | 【官方】 |
| mHC 残差流数 | 2 | 【官方】 |
| mHC Sinkhorn 迭代 | 20 次 | 【官方】 |
| 训练上下文 | 最长 262,144 token | 【官方】 |
| 输入 / 输出 | 文本 + 图像 / 文本 | 【官方】 |
| 导出精度 | 主干 BF16,mHC 路由参数 FP32 | 【官方】 |
| 技术报告 | 未发布 | 【交叉】公开材料均未见论文链接 |
几个数字之间是对得上的,这说明规格表内部自洽,不是拼凑出来的宣传数字:
- 层执行总数 = 入口 4 层 + 循环 24 层 × 2 遍 + 尾部 4 层 = 56,与"56 次层计算"完全吻合。
- 单层参数推算 = (9B − 词表嵌入 248,320 × 4,096 ≈ 1.017B) ÷ 32 ≈ 249.5M/层;56 次执行等效 13.97B,加回嵌入约 15.0B,与官方"推理约 14.6B"同一量级,误差来自实际参数分配与 mHC 参数。【推算】
所以"约 14.6B 推理参数"不是权重体积,是等效计算参数——权重只存 32 层(约 18 GB BF16),但每个 token 要算 56 遍。这句话很容易被误读成"模型其实有 14.6B",实际不是。
二、为什么"参数不涨、深度涨"成了新战场
Looped Transformer 不是商汤发明的。这条线的历史比多数人以为的长:
| 时间 | 工作 | 核心做法 | 规模 |
|---|---|---|---|
| 2018 | Universal Transformer | 单层 Transformer 沿深度循环 + 动态停止 | 小规模 |
| 2025-02 | Huginn(Geiping 等,arXiv 2502.05171) | prelude–recurrent block–coda 三段式,训练时随机采样循环次数 | 3.5B,800B token |
| 2025-10 | Ouro / LoopLM(字节,arXiv 2510.25741) | 预训练阶段就引入循环,熵正则学习每个 token 该循环几次 | 1.4B / 2.6B,7.7T token |
| 2026-10 | Looped LM 综述(557 篇核心论文,822 条实证) | 元分析:矛盾的根源是"参数匹配"还是"算力匹配" | — |
有两个结论需要提前记住,因为它们决定你该不该用这类模型:
第一,循环提升的是"操作知识"的能力,不是"存储知识"的容量。 Ouro 团队的控制实验显示,循环模型和普通模型的参数知识容量都在约 2 bit/参数 这个量级,几乎没差别。但循环显著改善了组合事实、多跳推理、模运算这类需要反复加工的活。换句话说:背下来的东西没变多,会用背下来的东西的本事变强了。
第二,循环到底值不值得,取决于你缺什么。 2026 年 10 月那份综述的元分析给出了一个不太讨喜的结论:在算力匹配的比较里,一次循环的价值低于一个全新的参数层。循环真正划算的场景是——参数(也就是显存)是硬约束,而延迟和吞吐可以退让。
把这两条套到商汤这个模型上,官方的"9B 打 27B"就有了合理的解释维度:它不是"同算力打赢 27B",而是"同显存打赢更大的稠密模型"。如果你的瓶颈是单卡 24 GB,这个交换是合算的;如果你的瓶颈是 QPS 和首 token 延迟,这个交换是亏的。选型判断从这一句就能分流。
三、第 0 站|入口层:为什么偏偏是 4 层
模型进来先过层 0–3,这 4 层是独立的、不参与循环的。
为什么是 4 而不是 3 或 5?官方没解释。但从注意力结构能反推:解码器以四层为一组,每组三线性 + 一全注意力,循环边界必须与完整的四层组对齐,否则第二遍进来时注意力模式就错位了。所以入口层数必须是 4 的倍数,最小的自然选择就是 1 组 = 4 层。【推断,官方未说明】
尾部同理,层 28–31 也是 4 层,之后接输出头。
一次前向传播的层执行序列
─────────────────────────────────────────────────────
[0 1 2 3] [4 5 6 7 ... 27] [4 5 6 7 ... 27] [28 29 30 31] → 头
入口4层 循环第1遍 循环第2遍 尾部4层
独立权重 24 层共享权重 同一套权重 独立权重
│ │ │ │
└────────────────┴─────────────────┴────────────────┘
合计 4 + 24×2 + 4 = 56 次层计算
权重只存 32 层
─────────────────────────────────────────────────────
这个结构跟 Huginn 的三段式(prelude / recurrent / coda)是同一套骨架,商汤的差别在于中间这个 recurrent block 是用连续层的权重共享实现的,而不是单独设计一个循环块。好处是不用改 checkpoint 的组织方式,标准 32 层解码器的权重布局就能直接复用。

四、第 1 站|循环体:用时间换深度
进了层 4,事情开始不寻常。同一个块连着算两遍:
# 官方 README 写法
# B 表示被重复的块(层 4–27),h 是它的输入
h_out = B(B(h))
第一遍的输出直接作为第二遍的输入,权重不变。24 个层做两次,等于 48 次层计算。
这笔账要算清楚,因为它决定了部署成本:
| 维度 | 数值 | 说明 |
|---|---|---|
| 权重存储 | 32 层 ≈ 18 GB(BF16) | 与普通 9B 模型相同 |
| 每 token 层计算 | 56 次 | 是 32 层稠密模型的 1.75 倍 |
| 等效计算参数 | 约 14.6B | 官方口径,本文推算 13.97B |
| 显存增量 | 0(权重不复制) | 这是循环架构唯一的红利 |
| 时间增量 | 约 +75% 层计算 | 这是循环架构的成本 |
所以"9B 打 27B"这句话,准确的说法是:**用约 9B 的显存,付约 15B 的算力,去争 27B 的效果。**三个数字,缺一不可。营销稿只讲第一个,评测稿只盯第三个,工程落地必须三个一起看。
还有一处细节值得注意:循环两遍会不会需要两套 KV cache?官方规格里没有明说。按 B(B(h)) 的串行语义,第二遍的输入是第一遍的输出,hidden state 不同,KV 理论上不能复用。如果实现上确实各存一套,KV 占用要按 16 个等效层算——这个差别在长上下文下是双倍的。【未披露,本文在第六节给出两种口径】
五、第 2 站|mHC:把一个 DeepSeek 的稳定性补丁搬进循环体
这是整个模型里技术含量最高、也最容易被略过的一块。
双流 mHC,全称 Manifold-Constrained Hyper-Connections,流形约束超连接。要讲清它,得先讲它的三段前史:
| 阶段 | 工作 | 做了什么 | 遗留问题 |
|---|---|---|---|
| 起点 | 标准残差连接(ResNet, 2016) | x + F(x),恒等映射保证信号无损 | 信息通道宽度被隐藏维度锁死 |
| 第一步 | Hyper-Connections(字节 Seed,arXiv 2409.19606,2024-09) | 把残差流从 1 条扩成 n 条子流,用可学习矩阵控制读/写/混合 | 矩阵无约束,深层连乘后信号爆炸;显存墙 |
| 第二步 | Frac-Connections(字节,arXiv 2503.14125) | 用 Split 代替 Repeat,压显存开销 | 破坏恒等映射的根本问题没解决 |
| 第三步 | mHC(DeepSeek-AI,arXiv 2512.24880,2026 元旦) | 用 Sinkhorn-Knopp 把混合矩阵投影到 Birkhoff 多胞形,强制双随机 | 稳定性解决,但只在标准深层网络上验证,未涉及循环架构 |
据公开技术解读对 DeepSeek 论文的复述:27B 模型在 60 层复合映射下,原版 HC 的信号增益达到约 3000 倍,训练在约 12k 步时损失突然跳升并持续偏离基线;mHC 把增益压回可控范围,最终损失比基线再低 0.021,n=4 时额外时间开销压到 6.7%。**【交叉】**以上数值来自第三方解读,未逐条回原文核对。
商汤做的事,是把第三步的成果挪到循环计算这个新场景里。
这个挪动不是顺手,是必须。因为循环等于人为把有效层数翻倍——原来 32 层的信号路径,现在要穿过 56 次层计算。而 mHC 恰好就是为解决"多层连乘导致信号发散"设计的。循环越深,这套约束越不可省。
具体到参数上:商汤用 2 条残差流(DeepSeek 实验用的 n=4),Sinkhorn 迭代 20 次。每条流在层计算前后各有可学习映射负责读出、混流、写回,混流矩阵被 Sinkhorn 归一化约束成双随机矩阵——谱范数不超过 1,且双随机矩阵相乘仍是双随机矩阵,所以无论循环多少遍,信号能量都在可控范围内。
消融数据是这块最硬的证据:
| 基准 | Δ(w/ mHC − w/o mHC) |
|---|---|
| GPQA Diamond | +4.42 |
| TeamBench | +13.34 |
| 官方消融图另三项 | +2.36 / +2.22 / +3.60 |
前两项由商汤官方文字稿点名,可信度最高。TeamBench 上 +13.34 这个幅度值得单独看一眼——从命名与消融幅度推断,它对应多步骤协作场景,而多步任务正好是循环计算最该受益的地方(每一步都要基于上一步重新加工)。涨 13 分说明 mHC 在长链路上确实稳住了信号,而不只是修了个数值 bug。【推断,官方未公开 TeamBench 的评测构成】
后三个数字来自官方消融图,公开材料里图表的列名与数值对应关系不完整,本文不做逐项归属。【交叉】
六、第 3 站|混合注意力:四层一组,KV 账在这里
解码器不是全注意力。它按四层一组排布:三层次线性注意力,一次全注意力。
层组结构(重复 8 次,覆盖全部 32 层)
──────────────────────────────────────────
组内第 1 层 线性注意力 ┐
组内第 2 层 线性注意力 ├─ 不存完整 KV,状态大小与序列长度无关
组内第 3 层 线性注意力 ┘
组内第 4 层 全注意力 ← 只有这层需要按 token 存 KV
──────────────────────────────────────────
32 层 ÷ 4 = 8 组 → 8 个全注意力层
──────────────────────────────────────────
这个设计对长上下文是决定性的。全注意力层数和线性层数的比例,直接决定了 256K 上下文的可行性——如果 32 层全是全注意力,KV cache 会翻四倍,单卡根本装不下。
按官方参数推算 KV 占用(head_dim = 4096 ÷ 16 = 256,KV 头 4 个,BF16):
| 上下文长度 | KV(单遍,8 层) | KV(双遍,16 层) | 权重 + KV 合计(双遍口径) |
|---|---|---|---|
| 8K | 0.25 GB | 0.5 GB | 约 18.5 GB |
| 32K | 1 GB | 2 GB | 约 20 GB |
| 128K | 4 GB | 8 GB | 约 26 GB |
| 256K | 8 GB | 16 GB | 约 34 GB |
**【推算】**假设:仅 8 个全注意力层需存 KV、KV 为 BF16、不含激活值与框架开销、循环两遍各存一套。若框架能复用循环两遍的 KV,上表按"单遍"列读。

这解释了为什么官方示例给的是 4 卡 LightLLM 部署(--tp 4),而不是单卡:9B 权重本身单张 24 GB 卡放得下,但配上长上下文就跑不动了。想单卡跑,32K 是相对舒服的上限。
七、第 4 站|部署:三条路径,三个必须踩的坑
官方给了三条推理路径,成熟度不一样:
| 路径 | 状态 | 关键约束 |
|---|---|---|
| Transformers | 官方示例,已验证 | 必须 trust_remote_code=True,依赖 transformers 5.18.0 / PyTorch 2.11.0 / CUDA 13.0 |
| LightLLM | 官方给出四卡 Docker 示例 | --tp 4、LOADWORKER=4 |
| SGLang | 需用 PR #47281 的分支 | 主分支尚不含实现,得手动 fetch PR |
第一条路径的坑最容易被低估。官方示例这段代码看着平淡,实际上有三个变量决定能不能跑起来:
model_id = "sensenova/SenseNova-Loop-9B-Preview"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
model_id,
trust_remote_code=True, # 不加这行,循环实现不会被加载
dtype=torch.bfloat16,
device_map={"": "cuda:0"},
).eval()
prompt = tokenizer.apply_chat_template(
messages, tokenize=False, add_generation_prompt=True,
enable_thinking=False, # 想要推理模式改成 True
)
三个坑:
trust_remote_code=True不是可选项。 官方明确写了,循环与 mHC 的实现是自定义代码,靠这个开关加载。原样拷 Hugging Face 的通用加载模板会得到一个普通的 32 层模型,输出看着像模像样,实际上没有循环——不报错,只是效果差一截。这是最隐蔽的失败模式。- checkpoint 里带着"执行配置",不是纯权重。 官方规格表点明:循环区间、遍历遍数、mHC 路由参数都属于 checkpoint 的执行配置,兼容的推理实现必须加载这些参数并复现相同的执行顺序。换推理引擎时如果只搬了权重张量、丢了这套配置,跑出来的是个残缺模型。
- mHC 路由参数是 FP32,主干是 BF16。 混精度转换时如果一刀切成 BF16,Sinkhorn 的 20 次迭代会在低精度下累积误差,双随机约束可能失效——而这个失效是静默的,不会抛异常。
版本号也别省:transformers 5.18.0 是官方核对过的环境,低于这个版本的自定义模型接口未必兼容。
八、第 5 站|出站之后:微调与加速的边界
微调走的是商汤自己 fork 的 torchtitan,8 卡单节点:
git clone https://github.com/OpenSenseNova/torchtitan.git
cd torchtitan
MODEL_PATH=/path/to/SenseNova-Loop-9B-Preview DATASET=/path/to/train.jsonl \
bash examples/train/SenseNova-Loop-9B-Preview/mhc2_loop2_titan.sh
脚本名 mhc2_loop2 已经把配置写死了:mHC 2 流、循环 2 遍。要改循环遍数,得连训练脚本和推理实现一起改——这也是循环架构的代价:循环次数不是一个推理期可以随便调的旋钮,它绑在权重上。这一点跟 Huginn 那种"训练时随机采样迭代次数、推理时可自由增减"的设计不同,商汤这版是固定 2 遍。
官方表述里"后续将继续探索自适应迭代次数"也说清了现状:现在不支持。
推理加速三个方案,只有一个能用:
| 方案 | 状态 |
|---|---|
| MTP(多 token 预测) | 可用 |
| Dspark | 训练中 |
| Dflash2 | 训练中 |
三个加速器里两个还在训练,意味着当前版本的解码速度没有额外红利——56 次层计算的成本要照付。做延迟预算时按无加速算,别按最好的情况算。
九、第 6 站|验收:五条自建基准
官方口径不能直接当结论用,原因不在真假,在比较方式。给一份可执行的验收清单:
| # | 验什么 | 怎么验 | 为什么这条重要 |
|---|---|---|---|
| 1 | 同参数量对比 | 9B-Loop 2 遍 vs 9B/12B 稠密模型,同任务同 prompt | 官方对比的是 27B,算力不对等;同参数才是"循环值不值"的对照 |
| 2 | 同算力对比 | 9B-Loop 2 遍 vs 32 层稠密模型 ×1.75 倍宽度,FLOPs 对齐 | 综述的元分析说这个口径下循环不占优,得自己验 |
| 3 | 循环深度饱和点 | 官方只提供 2 遍版本,无 1/3/4 遍对照;可关注后续版本,或按 mhc2_loop2 脚本自行重训对照 |
循环架构的全部经济学建立在"多算几遍还能涨分"上,饱和点决定加算力是否值得 |
| 4 | 长上下文实效 | 32K / 128K / 256K 下的 retrieval 准确率,不要只看"支持" | "支持 256K"和"256K 还能用"是两件事 |
| 5 | Agent 长链路 | 10 步以上的工具调用任务,看端到端通过率而非单步准确率 | TeamBench +13.34 是官方自研基准,需要自己的复现 |
第 3 条最关键,也最难做——循环遍数绑在权重上,不像 Huginn 那样能推理期直接调,想验就得重训一个小尺寸对照。但这一步省不掉:如果第 3 遍开始饱和,那 56 次层计算就是在为边际收益付全价。综述里说的"在算力匹配下循环不如新层",本质说的就是这个饱和点来得太早。
第 1 条和第 2 条要分开做,因为它们的结论方向相反:同参数下循环大概率赢,同算力下循环大概率输。你的业务落在哪一侧,取决于你缺显存还是缺吞吐。
十、官方没说的部分
把公开材料里缺失的信息列成清单,避免把推测当事实:
| 项目 | 状态 |
|---|---|
| 技术报告 / 论文 | 未见,权重先开 |
| 训练 token 总量 | 未披露 |
| 预训练数据构成 | 未披露(只提到包含文本、图像、代码、工具轨迹) |
| 循环 2 遍的选型依据 | 未披露(为什么不是 3 遍或 4 遍) |
| 两遍是否各存一套 KV | 未披露 |
| 单卡最低显存要求 | 未披露 |
| 第三方独立评测 | 未披露(现有分数均来自官方发布) |
| "开源"的边界 | Apache 2.0,权重与推理代码可商用;训练数据未开 |
另有一条口径需要收窄。商汤官方稿里写"社区尚缺乏可直接面向日常使用的 Looped Transformer 模型"——字节的 Ouro 1.4B/2.6B(2025-10)和 Huginn 3.5B(2025-02)都已开放权重。准确的说法是:9B 量级 + 原生多模态 + 面向 Agent 工作流这个组合此前缺位。前两代开源循环模型要么规模偏小,要么只做纯文本。"首个"这个词用在这里不成立,"首个这一格的"才成立。
十一、结论:五种处境,一句话分流
| 你的处境 | 建议 |
|---|---|
| 单卡 24–48 GB,要跑 Agent / 文档理解,能接受延迟 | 值得试。省显存是它的核心红利,32K 上下文在 24 GB 卡上可行 |
| 高并发在线服务,首 token 延迟敏感 | 先跳过。56 次层计算 + 无加速器,延迟成本实打实 |
| 要长上下文(>128K) | 先算显存。按推算双遍口径需 26 GB 以上,还得留激活余量 |
| 要微调适配垂直场景 | 可以,但要按 mhc2_loop2 的配置改,循环遍数不是可调旋钮 |
| 做架构研究 | 必读。公开权重里,把 mHC 用到循环架构上的案例此前几乎没有 |
这个模型的价值不在于"9B 打赢 27B",而在于它把一条显存换算力的兑换通道做成了可用产品。选不选它,先回答一个问题——你现在缺的是显存,还是时间。
- 点赞
- 收藏
- 关注作者
评论(0)