Skip to content
Bblog
返回博客列表
36 min readEnglish

BOLT:两方 MPC + BFV 的 Transformer 隐私推理

IEEE S&P 2024:用 MPC 与 HE 混合把 Transformer 推理通信降到 1/10.91,并修正 Iron 的 LayerNorm 化简错误。

0. 速览

一句话定位:BOLT 是一个半诚实两方(2PC)的 Transformer 隐私推理系统——服务器 P1 持有微调好的 BERT 权重,客户端 P2 持有输入;它把所有矩阵乘法推进 BFV 密文域(紧凑打包 + BSGS 降旋转 + 密文乘密文),只把非线性层留给 2-out-of-2 秘密共享 MPC,并借 HE 与 MPC 之间的转换顺带重置噪声,从而完全避开 bootstrapping。

这一定位的关键取舍是:HE 省通信但费计算,MPC 省计算但费通信(§2.3 原话即如此)。BOLT 假设算力会继续变便宜、网络带宽才是瓶颈,因此把成本尽量挪进计算侧;它优化的还是**整体(offline + online)**成本,而不是只压在线时间(§3 末尾明确说明)。

指标数值条件出处
端到端通信25.74 GBBERT-base,m=128,12 层,含 W.E.Tab. 3
对比 Iron280.99 GB → 10.91×同上Tab. 3
不含 W.E.59.61 GB,4.71×同上Tab. 3
端到端加速4.8–9.5×5 种网络设置,含 W.E.§7.5,Fig. 5
端到端加速2.6–4.1×不含 W.E.§7.5
通信轮数10901 vs 13663(1.25×)含 W.E.Tab. 3
精度最大掉 1.18 个百分点(STS-B)GLUE 四任务Tab. 2
PC-MM 旋转数756 → 43(17.58×)Linear 1,m=128,d1=768,d2=64,n=8192Tab. 1
BERT-base 超参m=128,d=768,H=12,L=12,110M 参数—§2.2
安全参数128-bit,semi-honestBFV,n=8192§3,§7.1

一句话读法:BOLT 不是“更快的 MPC”,而是“把 MatMul 从 MPC 搬到 HE 之后,重新发现瓶颈落在非线性层”的那篇论文。

1. 问题与定位

1.1 为什么纯 MPC 做 Transformer 特别贵

先前的 PPML 系统(Gazelle、Delphi、Cheetah)优化的是 矩阵-向量乘法(matrix-vector),因为 CNN 的权重矩阵乘一个激活向量就够了。Transformer 不是这个形状(§1 贡献段、§4 开头):

  • 矩阵-矩阵乘法才是主菜。BERT-base 每层至少 7 个 MatMul(Q/K/V 三个投影、Q·Kᵀ、Softmax·V、FFN 两级;按多头再展开还会更多);激活是 128×768,FFN 中间是 128×3072。
  • 2PC 下的 MatMul 用 Beaver triple,通信量随矩阵元素数 × 位宽增长;12 层叠起来就是数量级问题。
  • 非线性同样贵:Iron 自报超过 75% 的总运行时间花在非线性层,因为它把 GELU/Softmax/Tanh 直接翻译成 MPC 里的三角函数、指数、LUT 协议(§5 开头)。

Iron 是 BOLT 之前的 SOTA,也是唯一完整覆盖标准 Transformer 推理的 2PC 系统。它的问题可以直接量化(Iron 未开源,BOLT 自行复现并经 Iron 作者确认,§7.1.4):

Iron 端到端:280.99 GB 通信,216 分钟(100 Mbps / 80 ms WAN),BERT-base 110M
单层通信(Tab. 3):Linear 1 4844 MB + Softmax×V 4918 MB + Softmax 3596 MB
                  + GELU 7960 MB + LayerNorm 871 MB + 其余 ≈ 22449 MB

按 Tab. 3 相加,Iron 单层约 22.45 GB,乘 12 层已约 269 GB,端到端 280.99 GB 自洽。其中 Softmax×V 的 4918 MB 是因为 Iron 用 MPC 做密文×密文矩阵乘法——这正是 BOLT 最想改的一处。

1.2 BOLT 的定位:只改“通信”这一项成本

BOLT 的论证链条是(§1 开头):算力可以被并行化和硬件加速(文中引了多篇 FHE 硬件加速工作),但网络通信不会自动变快,所以要把通信当成首要优化目标。由此推出它的架构选择:

  • 线性层 → 全部用 HE(连密文×密文也放 HE),因为 HE 在通信上便宜;
  • 非线性层 → 全部用 MPC 秘密共享,因为 HE 做复杂非线性要么深度爆炸要么只能查表;
  • 两者之间做 HE 与 MPC 的转换,顺便把 HE 噪声“洗掉”,不需要 bootstrapping(§3)。

一个容易被忽略的细节:BOLT 声明自己优化整体执行成本而非仅在线成本,理由是只压在线时间会引入额外的预计算、内存与存储开销(§3 引 [22])。这也是它和后续纯 HE 方案(在线几乎零通信、但离线/计算极重)在成本哲学上的分水岭。

1.3 四个贡献(按原文顺序)

原文 “Our contributions” 正式列的是三条 bullet,第四条是收尾的合并结果段;这里按四点列出,并注明这一点:

  1. 通信优化且计算高效的线性操作。用「密文-明文 MatMul 的另一种解读」实现紧凑打包(不再留空槽),再用 BSGS 把旋转从输入密文搬到部分和上(BERT-base 上旋转降 2.33×–9.33×),最后给出低乘法深度的密文-密文 MatMul(§4)。
  2. 准确且高效的非线性操作。GELU 用 4 阶多项式、Tanh 用 5 阶多项式(均带分段与对称性利用),Softmax 用无 LUT 的整数指数协议;再加 Motzkin 多项式预处理把 n 阶多项式的乘法数从 n−1 降到约 ⌈n/2⌉(§5)。
  3. 机器学习层优化。用 attention score 做 oblivious word elimination(不经意排序丢掉贡献小的 token,把 m 从 128 降到 64),以及 secure-computation-aware fine-tuning(把定点量化与近似函数放进训练前向),把精度损失压到约 1%(§6)。
  4. 系统级结果(原文收尾段,非 bullet):合并上述优化后通信降 10.91×、端到端快 4.8×–9.5×,代码开源(github.com/Clive2312/BOLT)。

判断:第 1 条是论文的“硬贡献”(可被后续工作当基线逐项对比),第 2、3 条是“让第 1 条可用”的必要条件——如果非线性精度崩了,通信再低也没有意义。Iron 的 LayerNorm bug 恰好说明:在隐私推理里,一个代数上正确的化简可能因为破坏了模型结构而彻底失效。

2. 方法解剖

2.1 两方架构与威胁模型

  • 角色:P1 = 服务器(持有模型权重与推理服务),P2 = 客户端(持有文本输入)。这是标准 MLaaS 的 2PC 化。
  • 威胁模型:双方都是 semi-honest(honest-but-curious),会按协议执行但会从 transcript 里 passive 地挖信息(§3)。选 semi-honest 的理由原文给了两条:服务器提供的是服务,双方本来就得有一定信任;半诚实的性能才实际可用。
  • 公开信息:模型架构、每层参数量与 scale、tokenization 都公开;tokenization 在私有微调时被冻结(因为 BERT 的 tokenizer 是在公开大语料上训的)。推理结果不隐藏,这是 ideal functionality 的一部分,需要的话可叠加差分隐私(§3)。
  • 密码学底座:
    • MPC:2-out-of-2 加法秘密共享,x = ⟨x⟩1 + ⟨x⟩2 mod 2^ℓ,加法本地免费,乘法走 OT(§2.3)。
    • HE:leveled BFV,明确不用 FHE,因为 bootstrap 仍然太贵(§2.3)。
    • 数值:全定点。y = ⌊x·2^s⌋ mod 2^ℓ,MPC 在 Z_2^ℓ 上、HE 在 Z_p 上,所以需要转换。
  • 转换实际只做一个方向(§7.1.2):MPC → HE 这一步被省略,因为共享值溢出概率只有 |x|/2^ℓ,在 ℓ=37 且数值不大时可忽略;实现里因此只保留 HE → MPC 的转换。为降误差,GELU 结果先由 21 bit 扩到 37 bit 再转。每次转换的代价约为一次比较加一次 MUX。

2.2 线性层:把 MatMul 全部塞进 BFV

2.2.1 紧凑打包(§4.1.1)

设 C = A × B,A ∈ Z_p^{m×d1} 是密文、B ∈ Z_p^{d1×d2} 是明文。BOLT 的关键观察不是“内积”,而是按列看:

C 的第 j 列 = Σ_i B[i,j] · A 的第 i 列

也就是 C 的每一列都是 A 的列的线性组合,系数是 B 的标量。于是:

  • A 按列打包(一列 m 个元素放进一个密文,m 恰好是 BERT 的 token 长度 128,而 BFV 的 n 是 2 的幂,槽位利用率高);
  • B 沿用 Gazelle 的对角打包,但把每个 b_ij 重复 m 次,这样一次 SIMD 乘法就能让 A 的一整列乘上同一个标量;
  • 输出 C 天然是按列打包的,槽位全满——“perfectly compact output packing”。

对比之下:Gazelle 要把 d=768 pad 到 1024(浪费 25% 槽位),Iron 的系数打包虽然免了旋转,但结果非常稀疏,大部分系数是废的,通信反而更大(App. A)。Tab. 1 给出同一组维度下的硬数字(m=128,d1=768,d2=64,n=8192):

方案#Mult#Rot#Ct
Gazelle98304967681664
Iron768056
BOLT 无 BSGS76875613
BOLT 有 BSGS7684313

读表要点:Iron 的旋转是 0,但密文数 56 vs BOLT 的 13——Iron 用“更多密文”换“零旋转”,在带宽受限时这笔交易亏了。这也是 BOLT 全文“以通信换计算”的缩影。

2.2.2 BSGS:把旋转从输入搬到部分和(§4.1.2)

紧凑打包带来一个新问题:一个密文里塞了多列,部分和会落在同一个密文的槽位里,必须旋转求和,直接做是 O(d1) 次旋转(d1=768 时量级就是数百次)。

BOLT 把 baby-step giant-step 从矩阵-向量推广到矩阵-矩阵:

  • 把 d1 个列分成 baby-step 与 giant-step 两组;
  • 输入密文只旋转少数几次,其余旋转作用在部分和(partial sums)上;
  • 当右侧明文矩阵是 tall-and-skinny(d1 大、d2 小)时,还能在行方向做额外部分和,这是矩阵-向量场景没有的机会。

原文的例子:输入密文只转 2 次,总旋转数从 6 降到 3。整体上 BERT-base 旋转降 2.33×–9.33×(§1),单头 attention 维度下 756 → 43(17.58×)(Tab. 1,§4.1.2)。App. F 的 Tab. 5 给了全模型四层线性层的具体数:

             Linear 1   Linear 2   Linear 3   Linear 4
w/o BSGS       756        756        756        3024
w/  BSGS       288        168        324         324

注意 Linear 4(128×3072 → 128×768)省得最多(9.33×),而 Linear 3 只有 2.33×——增益强烈依赖矩阵形状与 d1 的因子分解,没有一个对所有层一致的常数。

2.2.3 密文×密文:2D 旋转为什么做不了,以及绕法(§4.1.3)

Transformer 里有两个 MatMul 两边都是密文:Q·Kᵀ 与 Softmax·V。BOLT 坚持用 HE 做(Iron 用 MPC),代价是要在 BFV 里处理两种打包:

  1. 列打包 × 行打包(Q·Kᵀ):用外积视角 C = Σ_i A_i ⊗ B_i,直接乘得到的是 C 的对角线;要凑出其他对角线,需要在 B 的行内旋转——对 BERT-base attention 就是 128×64 的 2D 旋转。
  2. 对角打包 × 列打包(Softmax·V):左矩阵是方阵,右矩阵按列,需要另一种重排。

BFV 为什么做不了 2D 旋转(原文的关键一句):BFV 的旋转是 NTT 空间里的 Galois 自同构,只能按“根的单位幂次”转;真正二维的(行内 + 列间同时转)旋转不被支持——原文甚至说,对 n=8192 是否能找到 orders 64 与 128、且能张成整个空间的生成元,尚不清楚(p. 4758)。

绕法:用部分旋转 + 位掩码拼出 2D 旋转。原文例子把 2×4 矩阵压成 8 维向量,左移一列 = “整体左移 1”与“整体右移 3”两个密文分别乘掩码 ⟨1,1,1,0,1,1,1,0⟩ 与 ⟨0,0,0,1,0,0,0,1⟩ 再相加。掩码乘法会增加乘法深度(原本 depth 4),BOLT 把“修正旋转的掩码”和“紧凑输出的掩码”合并,把深度从 4 压到 3(原文说最优是 2),用更多乘法/旋转换更小的 BFV 参数。第二种打包同理:不 repack(否则 RHS 会膨胀 128×),而是 mask + rotation + addition 就地重排 LHS。

收益直接体现在 Tab. 3:Linear 1 从 4844.14 MB 降到 7.06 MB(686.1×),Softmax×V 从 4918.38 MB 降到 9.88 MB(497.6×)——这是相对倍数最大的两处单点改进(不含 W.E. 口径)。

2.3 非线性层:精度是被“设计”出来的(§5)

非线性层是 BOLT 的第二战场。它的总体套路是:利用函数自身的线性尾部 + 对称性把逼近区间砍半,再用 Remez 找 minimax 系数,最后用 Motzkin 预处理把乘法数砍半。

Motzkin 预处理(§5.1,App. B):Horner 法求 n 阶多项式要 n−1 次乘法;当系数公开已知(推理场景必然如此)时,Motzkin 可把它重构成约 ⌈n/2⌉ 次乘法。具体到本文:4 阶只需 2 次秘密共享乘法,5 阶只需 3 次。

GELU(§5.2):4 阶、三段式。

ApproxGELU(x) = x                                          if x > 2.7
              = a|x|⁴ + b|x|³ + c|x|² + d|x| + e + 0.5x    if |x| ≤ 2.7
              = 0                                          if x < −2.7

三个设计点值得记:

  • 线性尾部:lim GELU(x) = x(正无穷)、= 0(负无穷),所以只有 [−2.7, 2.7] 需要逼近,这已足够保证 1×10⁻³ 的平均绝对误差。
  • 对称性:g(x) = x·erf(x/√2) 是偶函数,只需逼近正半轴。
  • 逼近 x·erf(x) 而不是 erf(x):这是相对 I-BERT 的关键改动。若按 I-BERT 先逼近 erf(|x|) 再乘 x,Motzkin 预处理就吃不满(乘法数不是最优);直接逼近乘积项才能拿到 2 次乘法。
  • 系数用 Remez(迭代最小化最大偏差)而非 I-BERT 的网格搜索插值。

精度:平均 ULP 误差 4(scale 12),对应浮点误差 9.77×10⁻⁴,区间 [−5, 5]。实现上还省了一次比较:只需判断 b = |x| 大于 2.7,输出 b ? RELU(x) : GELUP1(x),其中 RELU(x) = (|x| + x) >> 1。

Tanh(§5.3):5 阶、三段、断点 2.855,奇对称所以只需 2 次比较,Motzkin 后 3 次乘法。精度 ULP 27,对应 6.59×10⁻³。Tanh 只用在 pooler/classifier,不在 12 层主干里,所以精度要求可以松一档。

Softmax(§5.4):完全不用 LUT(Iron 用 SIRNN 的 LUT,输入位长长时通信爆炸)。协议分三步:

1) 减最大值:x̃ = x − x_max,全部变非正
2) 分解:x̃ = (−ln2)·z + p,z 为非负整数,p ∈ (−ln2, 0]
3) 小范围多项式:exp(p) ≈ 0.3585·(p + 1.353)² + 0.344
   然后 exp(x̃) = exp(p) >> z

细节:z 是秘密共享值,所以“右移 z 位”要用一串 MUX 实现;由于 exp(p) ∈ (0, 0.7),可以安全地把 z clip 到 [0, s+1];p 的范围小,位宽还能再砍 s+2。精度 ULP 0.0059,对应 1×10⁻⁶,输入区间 [−1000, −0.001]。倒数只在 d 维上调用,直接复用 SIRNN 的 secure reciprocal。

LayerNorm:BOLT 没有沿用 Iron 的融合化简(见 2.4),而是在 MPC 里算 μ、σ,把与 γ/β 的乘法搬进 HE,并预计算 X − μ 的 MSB 来降低后续乘法的通信(§7.1.3)。这是“结构正确优先于省一次乘法”的直接体现。

转换开销:HE 与 MPC 之间的转换约占端到端运行时间的 2%–9%(§7.5.3);若要用“正确截断”进一步降误差,转换成本翻倍,约 3%–7% 的性能代价。

2.4 ML 优化:修正 Iron 的 LayerNorm 错误(§6、§7.1.4、App. G)

这是全文最值得单独记的一段,因为它是**“代数正确但结构错误”**的教科书案例。

Iron 做了什么:LayerNorm 是

LayerNorm(X)[i,j] = γ_j·(X[i,j] − μ_i)/σ_i + β_j

Iron 为了省一次矩阵乘法,把 γ_j/σ_i 与 β_j 融进下一层线性层的权重里,于是 LayerNorm 的输出被化简成 LayerNorm′(X)[i,j] = X[i,j] − μ_i。单看这一层的代数,完全等价。

错在哪:Transformer 有残差连接——LayerNorm 的输出会与残差分支相加,而残差分支加的是未经 γ/σ 缩放的张量。一旦把缩放折进下一层,残差路径上的数值就全错了,误差逐层累积,模型表现接近随机猜测。BOLT 原文明确写了这一点,并说明已与 Iron 作者确认(§7.1.4、App. G)。

BOLT 怎么改:不是“修 Iron 的融合”,而是直接移除该优化,保留 γ/β 的显式乘法,然后用两个工程手段把成本补回来:

  1. 把与模型权重 γ、β 的乘法移到 HE 里做(密文-明文乘,通信便宜);
  2. 预计算 X − μ 的 MSB,省掉后续求符号/绝对值的通信。

效果:LayerNorm 单层通信从 871.46 MB 降到 290.55 MB(3.0×,Tab. 3,含 W.E.),轮数基本不变(218 → 220)。

fine-tuning(§6.2):定点表示会在浮点模型与定点推理之间造成 gap,BOLT 用量化感知微调补:

  • 对称、静态量化;前向传播时直接用近似函数(GELU/Softmax/Tanh 全部换成 §5 的版本)再量化;
  • 反向传播时“算真实梯度、再把梯度量化”(因为量化不可微);
  • 把 word elimination 放进训练前向,让动态丢 token 也能被反传覆盖;
  • 不做蒸馏。原文对比 MPCFormer:蒸馏在小数据集(如 RTE)会掉 5% 以上,而 BOLT 的精度下降约 1%。

word elimination(§6.1):用 Q·Kᵀ ∈ R^{m×m} 沿一个轴求和得到 score 向量 s,用 bitonic sort 求中位数,再用第二轮 bitonic sort 把低于中位数的 token 换到后面并同步 swap X 与 Att 的行——即“oblivious 地丢掉一半 token”。m 从 128 降到 64,多数组件通信约 2×,Softmax 因为输入是 m×m 而降到 3.2×。

精度结果(Tab. 2,GLUE):

数据集浮点明文IronBOLT 无 W.E.BOLT 有 W.E.
MRPC(F1)90.00 ± 0.2389.8790.5389.95
RTE(Acc)69.70 ± 1.5070.7669.6869.31
SST-2(Acc)92.36 ± 0.5992.7791.7492.78
STS-B(Pearson)89.62 ± 0.3189.4187.9788.44

最大损失出现在 STS-B:89.62 → 88.44,即 1.18 个百分点(原文称 “maximum accuracy loss of 1.3%”)。另一个反常点:无 W.E. 的 SST-2 反而比有 W.E. 低 1.04%,作者归因于定点到素域转换的近似(§7.3),并说加“正确截断”可解,代价是 3%–7% 性能。

2.5 系统实现与评测设置(§7.1–§7.2)

  • 库:EzPC 的 SCI(ring secret sharing)+ SEAL(BFV)。
  • 参数:秘密共享 ℓ=37、s=12(Softmax/LayerNorm);GELU 用 ℓ=21、s=11。HE 统一 n=8192;Linear 1 与 Softmax×V 需要更大噪声预算,取 log p ≈ 29、log q ≈ 218;其余线性层 log p ≈ 19、log q ≈ 180;128-bit 安全;服务器做 noise flooding 保证 circuit privacy;实现上用 lazy relinearization 与 modulus switching 降通信。
  • 硬件/网络:两台 AWS c6i.16xlarge(64 vCPU、128 GB),32 线程;用 Linux tc 模拟 LAN(3 Gbps、0.8 ms)与四组 WAN(100/200 Mbps × 40/80 ms)。
  • 数据集:GLUE 的 MRPC、RTE、SST-2、STS-B;在训练集微调、官方验证集评测。
  • Iron 基线:自行实现,配置 ℓ=37、s=12、n=8192、log q ≈ 180、log p=37(为 noise flooding 留更大 p,因为 Iron 没做 secure-computation-aware fine-tuning)。

3. 关键数字表

指标数值条件出处
端到端通信(BOLT)25.74 GB含 W.E.,m=128,12 层Tab. 3
端到端通信(Iron)280.99 GB同上Tab. 3
通信降幅10.91×25.74 vs 280.99Tab. 3,摘要
无 W.E. 通信59.61 GB,4.71×同上Tab. 3
线性层单层通信4844.14 → 3.18 MB(1524.7×)Linear 1,含 W.E.Tab. 3
Softmax×V 单层4918.38 → 2.82 MB(1741.6×)含 W.E.Tab. 3
GELU 单层7960.00 → 776.84 MB(10.2×)含 W.E.Tab. 3
LayerNorm 单层871.46 → 290.55 MB(3.0×)含 W.E.Tab. 3
通信轮数13663 → 10901(1.25×)端到端Tab. 3
端到端加速4.8–9.5×含 W.E.,5 种网络§7.5,Fig. 5
端到端加速2.6–4.1×不含 W.E.§7.5
端到端秒数(LAN)Iron 475 s,BOLT 185 s / 91 s3 Gbps,0.8 msFig. 5
端到端秒数(WAN 100/80)Iron 12996 s,BOLT 3139 s / 1744 s100 Mbps,80 msFig. 5
端到端秒数(WAN 100/40)Iron 12759 s,BOLT 2855 s / 1343 s100 Mbps,40 msFig. 5
旋转数(单头)756 → 43(17.58×)m=128,d1=768,d2=64,n=8192Tab. 1
旋转降幅(全模型)2.33×–9.33×BERT-base§1,App. F
精度(SST-2)92.78 vs 浮点 92.36含 W.E.Tab. 2
精度(STS-B)88.44 vs 浮点 89.62(−1.18 pp)含 W.E.Tab. 2
GELU 逼近误差ULP 4,9.77×10⁻⁴s=12,区间 [−5, 5]§5.2
Tanh 逼近误差ULP 27,6.59×10⁻³s=12,区间 [−5, 5]§5.3
exp 逼近误差ULP 0.0059,1×10⁻⁶s=12,区间 [−1000, −0.001]§5.4
BERT-base110M 参数,m=128,d=768,H=12,L=12,d′=64—§1,§2.2
25 Gbps 极端网络1.50×(无 W.E.)/ 2.63×(有 W.E.)25 Gbps,0.3 ms§9

两个由表派生的观察(本文计算,非原文数字):

  • 非线性已成绝对大头。含 W.E. 时单层通信约 3.18+2.82+2.26+4.50+6.77+450.74+776.84+290.55+16.64 ≈ 1554 MB,其中 Softmax+GELU+LayerNorm+Tanh 约 1534.77 MB(≈98.7%)。BOLT 把单层线性层合计压到约 19.5 MB 之后,端到端账单几乎全是 MPC 非线性——这正好解释了 THOR/NEXUS 为什么要从纯 HE 侧反攻。
  • 轮数只降 1.25×。10901 轮在 80 ms RTT 下,若完全串行约 872 s,而实测 100 Mbps/80 ms 是 1744 s——说明轮数至少是同一量级的重要成本项,且 BOLT 并没有真正解决它(它的优化目标是带宽,不是延迟)。

4. 与同系列论文的关系

与综述(./01-隐私保护Transformer推理综述.mdx)

综述按 setup(运行结构) 把私有 Transformer 推理分成三类:全 2PC(Iron 等)、2PC+HE 混合(BOLT、BumbleBee)、纯 HE(NEXUS/THE-X/THOR)。BOLT 是混合路线的锚点,它的数字正好夹在两端:

Iron       280.99 GB / 475 s     ← 纯 MPC(LAN)
BOLT        25.74 GB / 185 s     ← 2PC + BFV 混合(LAN)
NEXUS        0.16 GB / 1125 s    ← 纯 HE(100 Mbps / 80 ms)

读综述时应该把 BOLT 当作“成本换口袋”的中间态:通信比纯 MPC 低一个数量级,计算比纯 HE 低,但两头都不极致。它也是综述里“LayerNorm 化简陷阱”和“先切小区间再低阶逼近”这两个可复用技巧的出处。

与 THOR(./03-THOR-纯CKKS推理.mdx)

THOR 是纯 HE、非交互(客户端只在首尾参与)的方案,把 BOLT 当作主基线,宣称在同态矩阵乘法上 PC-MM 快 5.3×、CC-MM 快 9.7×–36×,BERT-base 128 token 单 GPU 端到端约 10 分钟。但要注意两点,否则会误读:

  • THOR 的“快 5.3×/36×”是密钥切换/旋转次数层面的算法级对比,不是含 MPC 非线性的端到端墙钟;BOLT 的 25.74 GB 是整网含非线性的通信。
  • THOR 自己承认一层里约 56% 的时间是 bootstrapping——这正是 BOLT 用 MPC 做非线性、用转换重置噪声所回避的成本。

两者是“同一枚硬币的两面”:BOLT 把非线性留在 MPC 换来低计算,THOR 把一切留在 HE 换来零交互,代价是 bootstrap。THOR 笔记里那张 key-switch 表(Q/K/V:THOR 192 vs BOLT 297;Q·Kᵀ:460 vs 24468;αV:492 vs 21420;输出投影:122 vs 177)说明 BOLT 的 HE MatMul 仍以旋转/密钥切换计费,而 THOR 的 DiagBlock + BSGS 继续把这块往下压。

与 Odin(./04-Odin-THEMIS-LLM同态推理.mdx)

Odin 指向的是另一条路线:FHE LLM(arXiv 2609.12378 的 THEMIS,开源 Llama-3-8B 端到端 CKKS 实现,GPU 加速,只保护输入、不保护权重,服务端单方计算、客户端零交互)。它和 BOLT 的差别不是“快慢”,而是成本结构:

  • BOLT 的 2PC 要求客户端在线参与每一层(否则拿不到秘密共享),这在 LLM 长上下文、多轮对话场景里是部署级障碍;
  • FHE 路线把交互降到 0,但把成本全部压进同态计算(旋转、bootstrap、大参数),且目前公开的端到端实现只到 8B 级(THEMIS 跑的是 Llama-3-8B),再往上参数与计算都难以为继。

所以 BOLT 的价值在“BERT 级 encoder + 强隐私 + 可接受交互”的区间;一旦目标变成 LLM 生成式推理,它的 2PC 假设本身就是瓶颈,而不只是数字不够好。

5. 局限与可追问点

  1. 交互轮数没有实质改善(10901 vs 13663,仅 1.25×)。带宽降了 10.91×,但轮数几乎没动;在高 RTT 网络下这是硬地板。可追问:BOLT 的 round 是否可流水线化?非线性层的 647 轮/层能否批处理?
  2. 半诚实假设 + 无形式化安全证明。S&P 的 meta-review 明确把“没有 formal security proof,只论证由安全组件组合而成”列为 noteworthy concern(App. H)。恶意安全需要 HE 上的 ZK(MUSE 路线),作者自己说代价很高(§9)。
  3. 只做 encoder(BERT)。decoder 可直接套用但必须去掉 word elimination(§9);word elimination 对语义任务(尤其长句、需要全部 token 的任务)的影响论文只给了 4 个 GLUE 任务的结果,粒度偏粗。
  4. 非线性近似的精度代价被“平均 ULP”掩盖。ULP 是平均误差,最坏点误差未报告;GELU 在 |x|=2.7 断点附近的连续性、Softmax 在 z clip 边界的行为都没有单独分析。可追问:worst-case error bound 是多少?
  5. 转换的溢出概率只是“可忽略”的论证,没有给出与任务精度挂钩的界;作者也承认无 W.E. 时 SST-2 掉 1.04% 就是转换近似造成的(§7.3)。
  6. 评测口径:batch=1、128 token、纯 CPU、32 线程;4.8–9.5× 强依赖网络设置,25 Gbps 下缩到 1.5–2.63×。与 Iron 的对比是自实现基线(Iron 未开源),虽然作者与 Iron 作者确认过,但复现质量仍是外部无法独立验证的一环。
  7. “compute-efficient”的说法要打折。BOLT 只报 runtime 与通信,不报 CPU 利用率、能耗、内存峰值;而 HE 的旋转/NTT 本身就是重计算。作者在 §9 也承认极端快网络下应做“按网络自适应选择线性协议”的混合系统——这等于承认计算侧并未被真正优化到极致。
  8. 密文×密文的深度仍是 3(最优 2)。2D 旋转靠掩码模拟,掩码乘法带来额外深度与乘法;这是 BFV 打包方式的固有约束,也是后续工作(THOR 的 DiagBlock)可以继续改进的点。

6. 自测题

Q1. BOLT 为什么把线性层放 HE、非线性层放 MPC?这个分工的代价是什么?

A1. HE 的通信成本低、计算成本高,适合数据量大但只需加乘的 MatMul;MPC(秘密共享)计算便宜但每次乘法都要通信,适合复杂非线性。代价是需要在两种表示之间转换(每轮一次比较 + 一次 MUX,占端到端 2%–9%),并且只做 HE → MPC 单向转换(反向溢出概率可忽略)。

Q2. 紧凑打包依赖的关键观察是什么?为什么输出天然是紧凑的?

A2. 观察是“C 的每一列都是 A 的列的线性组合,系数是 B 的标量”,所以 A 按列打包、B 的每个元素重复 m 次即可用 SIMD 完成一列的乘加。输出 C 的每一列恰好占满一个密文的 m 个槽位,因此输出天然按列紧凑,槽位利用率 100%。

Q3. BSGS 为什么不能照搬矩阵-向量的版本?BOLT 在 BERT-base 上省了多少旋转?

A3. 因为 BOLT 在列级别打包和旋转(一个密文里有多列),而经典 BSGS 是元素级的;此外矩阵-矩阵场景下右侧矩阵 tall-and-skinny 时还能在行方向做部分和,这是矩阵-向量没有的机会。收益:单头维度 756 → 43(17.58×),全模型 2.33×–9.33×(Linear 4 最省,3024 → 324)。

Q4. BFV 为什么做不了 2D 旋转?BOLT 如何绕开,代价是什么?

A4. BFV 的旋转是 NTT 空间里的 Galois 自同构,只能按根的幂次转,无法同时做“行内 + 列间”的二维旋转;n=8192 时是否能找到 orders 64/128 且张成整个空间的生成元也不清楚。BOLT 用“两次部分旋转 + 位掩码 + 求和”模拟 2D 旋转,并把修正掩码与紧凑输出掩码合并,把乘法深度从 4 降到 3(最优为 2),代价是更多乘法/旋转。

Q5. Iron 的 LayerNorm 优化错在哪?BOLT 如何修正?

A5. Iron 把 γ_j/σ_i 与 β_j 融进下一层线性权重,使 LayerNorm 输出变成 X − μ;单层代数正确,但残差连接要求加回的是未缩放的 LN 输出,于是残差分支数值全错、误差累积,模型接近随机猜测。BOLT 直接移除该融合,保留 γ/β 显式乘法,并把与权重的乘法搬进 HE、预计算 X − μ 的 MSB 来补成本,LayerNorm 通信仍降 3.0×。

Q6. BOLT 的 10.91× 与 THOR 宣称的 PC-MM 5.3× / CC-MM 9.7–36× 可以直接比较吗?

A6. 不能。BOLT 的 10.91× 是整网端到端通信(含 MPC 非线性);THOR 的倍数是同态矩阵乘法的密钥切换/旋转次数(算法级),两者口径不同。若要比较,必须对齐到同一指标(端到端通信、端到端墙钟或同一条网络设置),并且注意 THOR 是零交互纯 HE、BOLT 是每层都要交互的 2PC。

7. 原文定位索引

主题章节 / 表号 / 页
动机、Iron 的 280.99 GB / 216 min§1,p. 4753
四条贡献(原文三条 bullet + 结果段)§1,pp. 4753–4754
BERT 结构与 m=128、d=768、H=12、L=12§2.2,Fig. 1,p. 4754
2-out-of-2 秘密共享、BFV、定点编码§2.3,p. 4754
威胁模型、系统架构、整体成本观§3,p. 4755
紧凑打包(列打包 + 对角权重)§4.1.1,Fig. 2,pp. 4756–4757
与 Gazelle/Iron 的操作数对比(756 → 43)Tab. 1,p. 4757
BSGS 降旋转(17.58×)§4.1.2,Fig. 3,p. 4757
2D 旋转不支持、深度 4 → 3§4.1.3,p. 4758
对角打包 × 列打包(Softmax·V)§4.1.3,Fig. 4,p. 4759
BERT 各层如何映射到协议§4.2,p. 4759
Motzkin 预处理(乘法减半)§5.1,App. B,p. 4760 / p. 4769
GELU 4 阶、ULP 4§5.2,Eq. 5–6,p. 4760
Tanh 5 阶、ULP 27§5.3,Eq. 7–8,p. 4761
Softmax 整数指数协议、ULP 0.0059§5.4,Alg. 1,p. 4761
word elimination(bitonic sort 丢 token)§6.1,App. D,p. 4762 / p. 4769
secure-computation-aware fine-tuning§6.2,p. 4762
实现参数(ℓ=37、s=12、n=8192、log p/q)§7.1.1,p. 4763
Iron LayerNorm 优化错误§7.1.4 + App. G,p. 4763 / p. 4770
精度对比(四个 GLUE 任务)Tab. 2,§7.3,p. 4763
逐组件通信与轮数Tab. 3,§7.4,p. 4764
端到端运行时间与分解Fig. 5,§7.5,p. 4765
转换开销(2%–9%)、word elimination 收益§7.5.3,§7.4.3,pp. 4764–4765
与 THE-X/Iron/MPCFormer/PrivFormer/PUMA 对比§8,p. 4765
decoder 适用性、恶意安全、极端网络 1.5–2.63×§9,p. 4766
多项式系数(GELU/Tanh)App. C,p. 4769
各线性层 scale 配置App. E,Tab. 4,p. 4770
BSGS 全模型旋转节省App. F,Tab. 5,p. 4770
meta-review(无形式化安全证明)App. H,p. 4771

相关阅读

评论

评论区尚未配置:部署 Twikoo 后端后,将 envId 填入 lib/site.ts。