异构后端间的数值等价性

CUDA、ROCm、Adreno 和 CPU 永远不会逐位一致。蜂群仍能产出一个连贯的模型,这是设计出来的性质,不是运气。

关键区分

精确(exact)vs 等价(equivalent)——两种不同的性质

  • 同一后端内 — 精确(3.6e-12):把专家拆到各节点再合并,是同一加权和的重组;差异只来自浮点累加顺序。已由 oracle 验证。
  • 跨后端 — 等价(1e-3…1e-6):同一算子在不同硬件上带有约 1e-3–1e-6 的每算子相对误差,且永不为零。蜂群就生活在这个区间里。

"精确"是分解在单台设备内保证的;"等价"是异构硬件给你的。蜂群的任务是不让等价性累积成发散。

实测 · 真实 122B,三个后端

不是理论——在硬件上测得

同一个 Qwen3.5-122B layer-0 专家 FFN,由 linkcpp-expert-worker 在 MI250(ROCm)、手机 ARM CPU(SM-S938N)和 x86 numpy 参考上计算——相同输入、相同权重,不同指令集与归约顺序:

Three backends feeding one comparator where their waveforms overlap within tolerance
后端对max|Δ|cosine
ROCm (GPU) vs numpy (x86)7.9e-70.99996
手机 ARM CPU vs numpy (x86)1.4e-60.99992
ROCm GPU vs 手机 ARM CPU1.5e-60.99990

三套指令集,一个计算——每一对都等价(cosine ≈ 0.9999),没有一对逐位相同(Δ ≈ 1e-6)。残差之所以小,是因为路由器权威钉住了输入与专家选择。

此后在真实 NVIDIA GB10 Grace Blackwell 硬件上的一次运行补全了最后一个后端:CUDA ↔ ROCm 落在 cosine 1.0000000000(max abs 3.5e-10,因两个 GPU 后端共享内核源码而实质逐位相同),CUDA ↔ Grace ARM CPU 为 cosine 0.99975——与上文所见的 GPU↔CPU 同一模式。

后端为何不同

浮点加法不满足结合律

  • matmul 归约顺序 — tensor core、MFMA tile、OpenCL workgroup 和 SIMD lane 以不同顺序与切块累加。
  • FMA 融合 — a*b+c 舍入一次(FMA)或两次,各后端融合方式不同。
  • 累加精度 — F16/BF16 存储配 F32 或 F16 累加器(对发散幅度影响最大的杠杆)。
  • 超越函数近似 — exp(softmax)、silu/sigmoid(swiglu)、rsqrt(norm)的多项式/查表变体不同。
  • 反量化 + matmul 路径 — 先反量化再乘 vs 融合量化内核,中间舍入不同。
  • 非确定内核 — atomic/split-K 归约在同一设备上也可能逐次运行不同。

这些都不是 bug,而是每个加速器的快速路径所付的代价。

为何仍然可行

决策归于单一权威,累加保有足够精度

路由器权威——核心不变式。网络内唯一的离散决策是 MoE 路由(256 选 top-8)。若每个后端都重跑路由器,边界 token 会选出不同的专家,产生真正的发散。Kvasir 让路由器在骨干上只跑一次,只把选中的专家 id 发给 worker。异构蜂群或许在每个专家输出的*幅值*上有差异——但*哪些专家运行*绝不分歧。这把灾难性的离散发散转化为有界的连续误差,是异构专家分片的一致性规则。

  • 离散 argmax:解码是对 logits 取 argmax。1e-3 的抖动只有在两个候选相差不到 1e-3 时才会翻转 token——绝大多数位置的差距远大于此,因此 token 完全一致;罕见的翻转发生在与换一个随机种子无法区分的模糊位置。
  • combine 是加法:部分结果以概率加权求和合并。独立的约 1e-4 误差非相干地相加——按 √k 而非 k 增长——且没有大数相消,残差保持良态。
可能失效之处 · 及阻止它的规则

发散模式与防御

发散模式机制规则
路由不一致各后端对边界 token 选出不同 top-8路由器权威——骨干一次决定,调度 id
轨迹分叉逐 token 的 logit 抖动终会翻转某个 token,序列像换了种子一样分叉解码/采样钉在一个节点
深度累积49 层 × 各约 1e-4 → 最终 logits 可达 1e-2边界与 combine 用 F32 累加
自身非确定atomic/split-K 逐次运行不同combine 用确定性内核;验证用容差
精度不匹配一个节点 F16 累加,另一个 F32累加精度作为能力公示;输出 rank 优先 F32 节点
等价性是一个数字

测量协议

  • 每算子 delta — 相同输入下 A vs B 在 matmul、swiglu、softmax、norm 上的相对误差。
  • 层边界漂移 — 过一层后的 residual delta,逐层堆叠看深度累积是 √L 还是 L。
  • 端到端 logit 发散 — 全前向的 L∞、L2 与 KL 散度。
  • 决策一致率 — top-1 token 一致率加 top-8 路由一致率(验证路由器权威的必要性)。
  • 生成稳定性 — greedy N 个 token,A 与 B 首次分歧的位置。
  • 任务层面 — perplexity 与评测分数的 delta:用户唯一能感知的指标。

合格标准是容差——"top-1 一致率 ≥ 99.x%,KL ≤ ε"。超出容差的节点只被标记为不适合敏感 rank,不会被整体拒绝。

为何这是核心蜂群技术

逐位一致既不可能,也无必要

同构集群可以假设逐位精确;蜂群不行——它的前提是*来什么硬件用什么硬件*。所以 Kvasir 把数值等价当作与协议兼容性完全同级的一等、可测量的契约:后端与累加精度作为节点能力公示,路由器权威作为不变式强制,所有验证用容差而非逐位相等。测得的数值等价 + 单一权威的离散决策——这就是让一个模型同时跑在地球上每块 GPU 上的东西,也就是蜂群。