FHE 密态推理技术生态探秘:Lattigo、HEIR 与 LattiAI 三库全景解析

摘要 :全同态加密(Fully Homomorphic Encryption, FHE)允许在加密数据上直接计算,是实现"数据可用不可见"的终极密码学手段。然而从原始密码原语到"一行命令跑通密文推理",中间横亘着巨大的工程鸿沟。本文以三个开源项目为样本------Go 密码库 Lattigo 、MLIR 编译器工具链 HEIR 、以及端到端密态推理平台 LattiAI,系统讲解它们在 FHE 技术栈中的角色定位、内部架构、相似之处与核心差异。全文以流程案例、图表与性能数据呈现,无需密码学背景即可通读,帮助读者建立对 FHE 软件生态的整体认知。

目录

  1. [背景:FHE 是什么,为什么需要"三个库"](#背景:FHE 是什么,为什么需要"三个库")
  2. 主角登场:三个项目的速览
  3. Lattigo:密码学"发动机"
  4. [HEIR:FHE 领域的 LLVM](#HEIR:FHE 领域的 LLVM)
  5. [LattiAI:面向 AI 工程师的密态推理平台](#LattiAI:面向 AI 工程师的密态推理平台)
  6. 三者关系:分层价值链与流水线分工
  7. 相似性:共同的密码学基因
  8. 区别:从定位到实现的全维度对比
  9. 选型建议:我该用哪个?
  10. 总结与展望

1. 背景:FHE 是什么,为什么需要"三个库"

1.1 一个类比

想象你有一台永远打不开的保险箱 ,但有人能在不打开保险箱的情况下,往里面塞纸片、叠纸鹤、甚至拼出一幅完整的画。等箱子还给你、你打开它的那一刻,里面的纸片已经变成了你想要的最终作品------这就是全同态加密

用密码学的语言说:给定加密算法 Enc 和运算函数 f,存在一个同态评估算法 Eval,使得:

复制代码
Dec( Eval(f, Enc(x)) ) = f(x)

即:密文上计算的结果,解密后等于明文上计算的结果。2009 年 Gentry 的博士论文首次证明其可行性,此后经过十余年优化,如今已经走到深度学习推理(CNN 密态推理)的实用边缘。

1.2 当前主流 FHE 方案

方案 代数结构 数据形态 典型应用
BFV / BGV 整数环上的模运算 整数 统计、检索、加密数据库
CKKS 浮点近似运算(含误差) 复数/实数向量 深度学习推理(最主流)
CGGI / TFHE 布尔电路 / 门级加密 比特 逻辑运算、密文数据库查询

其中 CKKS 天然支持浮点数 + SIMD(单指令多数据,一个密文可打包 N/2 个槽位并行计算),是深度学习密态推理研究与工程实践中最常用的方案。

1.3 从"密码原语"到"密文推理"有多远?

下图是密文推理的基本交互模型,它同时是本文三个项目共同的安全假设:

在这个流程中,把"第 4 步的密文计算"落到真实硬件上,需要解决一串连锁难题:

  1. 密码层:NTT(Number Theoretic Transform,快速数论变换)、RNS(Residue Number System,剩余数系统)、密钥切换、模数提升、噪声控制......
  2. 算法层:卷积如何用"旋转-乘-加"实现?矩阵乘怎么打包进 SIMD 槽位?非线性激活(ReLU/Sigmoid)怎么用多项式近似?乘法深度耗尽后 Bootstrapping 插在哪?
  3. 工程层:PyTorch 模型怎么转成密文可执行形式?参数怎么规划?多线程/GPU 怎么调度?用户要不要懂密码学?

没有任何一个项目能独立优雅地解决所有三层 ------于是出现了三个定位互补的开源项目:Lattigo 解决第 1 层,HEIR 解决第 2 层的"通用编译",LattiAI 把第 2、3 层打包成产品。


2. 主角登场:三个项目的速览

项目 一句话定位 主导方 主要语言 许可证 代码规模
Lattigo 基于格(RLWE)的同态加密 Go 密码库 EPFL 实验室 → Tune Insight Go Apache 2.0 约 250 个 Go 文件
HEIR 基于 MLIR 的 FHE 通用编译器工具链 Google(社区驱动) C++(MLIR)+ Python Apache 2.0 30+ 方言、1200+ MLIR 测试
LattiAI 面向 AI 开发者的端到端密态推理平台 深圳 CipherFlow(格物致慧) C++17 + Python Apache 2.0 50+ C++ 算子、80+ Python

三个项目均为开源、Apache 2.0、都聚焦 CKKS 密态推理------但它们的抽象层次截然不同。先记住一句话比喻,后续展开:

Lattigo 是"发动机"(密码库),HEIR 是"汽车设计平台"(编译器),LattiAI 是"为 AI 推理定制的整车"(应用平台)。


3. Lattigo:密码学"发动机"

官方定位lattigo 是一个 Go module,实现基于全 RNS(Residue Number System)的 RLWE 同态加密原语与多方安全计算协议。

3.1 分层架构

Lattigo 是严格分层设计的,自底向上形成一条线性依赖链:

  • ring:最底层,提供分圆多项式环上的模运算(NTT、RNS 基扩展、RNS 重缩放、高斯/三元/均匀采样)。
  • core/rlwe:所有方案共用的 RLWE 基础:明文/密文结构、密钥生成、加密解密、密钥切换、RLWE-repacking 等。
  • schemesbfvbgvckks 三种具体方案(BFV 实际是 BGV 的包装)。
  • circuits :面向应用的"高阶电路",例如 ckks/polynomial(多项式求值)、ckks/bootstrapping(任意精度、批处理自举)、ckks/minimax(极小极大多项式逼近)、ckks/comparison(sign/max/step 比较电路)、ckks/dft(离散傅里叶变换)等。
  • multiparty:多方分布式密钥生成与门限解密。

3.2 核心特点

  • 纯 Go 实现 :跨平台编译,甚至可编译为 WASM 在浏览器客户端运行,性能与主流 C++ 库(如 SEAL/OpenFHE)可比。
  • 方案覆盖全:BFV/BGV/CKKS + 多方协议,还支持 RGSW、外部乘积与 LMKCDEY 盲旋转(盲旋转是 TFHE 风格电路的基础)。
  • 面向 Go 生态:Go 的并发模型天然适合分布式系统与微服务架构中的密码计算。

3.3 最小案例:一个密文加法

下面是用 Lattigo 手工编写密文程序的最小示例(v6 API),可见使用门槛------开发者需要理解参数、密钥、编码、加密、评估、解密的全链路:

go 复制代码
// 1. 选择参数 → 2. 生成密钥 → 3. 编码+加密 → 4. 同态运算 → 5. 解密+解码
params, _ := ckks.NewParametersFromLiteral(ckks.ParametersLiteral{LogN: 14, ...})
kgen := ckks.NewKeyGenerator(params)
sk, pk := kgen.GenSecretKeyNew(), kgen.GenPublicKeyNew(sk)
encoder := ckks.NewEncoder(params)
enc, dec, eval := ckks.NewEncryptor(params, pk), ckks.NewDecryptor(params, sk), ckks.NewEvaluator(params, nil)

pt := ckks.NewPlaintext(params, params.MaxLevel())
encoder.Encode([]float64{1.0, 2.0, 3.0}, pt)  // 编码明文
ct := enc.EncryptNew(pt)                      // 加密

ptOne := ckks.NewPlaintext(params, params.MaxLevel())
encoder.Encode([]float64{1, 1, 1}, ptOne)     // 明文 [1,1,1]
ctAdd := eval.AddNew(ct, ptOne)               // 密文 + 明文

res := dec.DecryptNew(ctAdd)                  // 解密
got := make([]float64, 3); encoder.Decode(res, got) // 解码 ≈ [2, 3, 4]

可以想象:如果让 AI 工程师用这种方式写一个 ResNet 的密文推理,无异于要求司机用螺丝刀组装发动机。


4. HEIR:FHE 领域的 LLVM

官方定位 :HEIR(Homomorphic Encryption Intermediate Representation)是一个基于 MLIR 的 FHE 编译器工具链,目标是成为 FHE 领域的行业标准编译器------正如 LLVM 之于通用编程。

4.1 核心设计:分层方言(Dialect)

MLIR(Multi-Level Intermediate Representation,多级中间表示)的核心理念是"方言 + 渐进降级":把高层程序逐层降低为低层代数运算,每一层都有独立优化机会。HEIR 在 lib/Dialect/ 下实现了 30+ 个方言,构成一条"机密性 → 代数 → 后端"的降级链:

层次 代表方言 作用
高层语义 SecretTensorExtPreprocessing 标记哪些数据是密文(secret)、张量类型推导
底层代数 LWERNSModArithPolynomialRandom 建模密文背后的环/多项式算术(与 Lattigo 的 ring 层一一对应)
方案层 CKKSBGVCGGI 具体 FHE 方案的算子和类型
后端层 OpenfheLattigoTfheRustJaxite 生成各密码库的调用代码

4.2 使用方式

  • heir-opt:跑编译 pass(降级、优化、打包规划)。
  • heir-translate:翻译成指定后端的源码(OpenFHE C++ / Lattigo Go / tfhe-rs Rust / Jaxite)。
  • heir-py:Python 包,支持在 Python 中标注 secret 类型后直接编译。
  • 前端支持:Python、PyTorch(经 torch-mlir 导入为 linalg)、ONNX(经 onnx-mlir)、TensorFlow(经 StableHLO)。

4.3 支持矩阵

后端库 BGV BFV CKKS CGGI
OpenFHE
Lattigo
tfhe-rs
Jaxite

4.4 工作流程:从 PyTorch 模型到 Lattigo 代码

HEIR 的端到端流程非常简洁,只需三步(无需编写任何密码学代码):

  1. 前端导入 :用 torch-mlir 把 PyTorch 模型导出为 linalg 方言的 MLIR 中间表示;
  2. 编译优化 :运行 heir-opt --torch-linalg-to-ckks,自动完成降级、打包方案选择、乘法深度规划;
  3. 代码生成 :运行 heir-translate --emit-lattigo,输出可直接编译链接 Lattigo 的 Go 源码。

tests/Examples/lattigo/ 下已有 30+ 个端到端测试(MNIST 分类、向量点积、批矩阵乘、卷积、Bootstrapping、Sigmoid 等),每个测试都是"MLIR → Go → 编译 → 运行 → 校验精度"全链路闭环。

HEIR 的价值:方案与后端可替换。同一份高层程序,今天输出 Lattigo Go,明天可输出 OpenFHE C++,后天可面向 FPGA/GPU 加速器生成代码------这是它作为"基础设施"的核心竞争力。


5. LattiAI:面向 AI 工程师的密态推理平台

官方定位 :LattiAI 是构建于 LattiSense FHE 框架之上的隐私保护 AI 推理开发平台,覆盖"PyTorch 明文模型 → 密文推理部署"的完整流水线。目标用户是不懂密码学的 AI 工程师

5.1 五大模块

  1. 模型适配(Model Adaptation) :把 FHE 不友好的算子替换为可计算形式------ReLU/SiLU → 低阶多项式(RangeNormPoly2d/PolyAct),MaxPool → AvgPool,BatchNorm 融合进卷积(省一次密文乘法)。替换后通过单阶段微调(PolyAct-RN 算子)恢复精度,实测 ResNet/MobileNet/YOLO 上精度几乎无损。
  2. 模型编译器 :输入 .pth/.onnx,输出 CKKS 兼容的 DAG(Directed Acyclic Graph,有向无环图)计算图,自动完成 FHE 参数选择、Bootstrapping 插入位置搜索(128 组并行实验择优)、level/scale 逐层分配。
  3. HE 算子库:C++ 实现的密态卷积/反卷积/全连接/AvgPool/BatchNorm 等,利用 SIMD 槽位打包 + Bootstrapping 支撑任意深度网络。
  4. 运行时:按编译器生成的图自动调度推理,支持多线程 CPU 与 GPU(集成 HEonGPU)加速。
  5. 部署组件gen_mega_ag.py 生成低层指令;InferenceClient(密钥/加密/解密)+ InferenceServer(密文计算)开箱即用。

5.2 特色算法:广义交错打包(GIP)

传统打包方案(连续打包/通道穿插/间隔打包)在高分辨率图像 (单通道像素数超过单密文槽容量 N/2)时会失效。LattiAI 提出通道打包因子 g = H/Ĥ(图像分辨率与基础打包尺寸之比),自适应切换三种形态(g>1 分解子通道、g<1 通道穿插、g=1 连续打包),并设计了保持打包结构的密态卷积/反卷积/上采样算子------这是它相对 HEIR 通用流水线的重要差异化能力之一。

5.3 使用流程:ResNet-20 密文推理全流程

LattiAI 的端到端流程对 AI 工程师非常友好,只需四步命令行操作:

  1. 训练 baseline:用 PyTorch 正常训练一个带 ReLU 的 ResNet-20;
  2. 算子替换 + 微调 :运行 train.py --poly_model_convert,自动完成 ReLU→多项式、MaxPool→AvgPool 替换,并执行单阶段微调恢复精度;
  3. 编译 :运行 run_compile.py,输入 ONNX 模型,自动完成 DAG 生成、Bootstrapping 规划、打包策略选择;
  4. 部署运行 :运行 gen_mega_ag.py 生成指令,再用 InferenceClient/InferenceServer 完成密文推理。

整个过程无需编写任何密码学代码,也无需理解 CKKS 参数、多项式逼近、打包方案等底层细节。

5.4 官方性能数据(128bit 安全,Xeon 6226R + RTX 5880 Ada)

任务 模型 Baseline 精度 FHE 精度 16 线程 CPU GPU
CIFAR-10 分类 ResNet-20 91.9% 92.0% 310.3 s 13.5 s
ImageNet 分类 MobileNetV2 71.8% 70.1% 1210.0 s 82.4 s
血细胞检测 YOLOv5n 92.2% mAP 92.0% mAP 1519.3 s ---

注:密文精度甚至偶尔"反超"baseline,源于微调使模型重新适应了多项式激活。这组数据也直观展示了密文推理的现实成本------比明文慢几个数量级,因此"编译器/算子优化 + GPU 加速"才如此重要。


6. 三者关系:分层价值链与流水线分工

6.1 三层模型与依赖关系

把三者放到同一个坐标系中,它们构成 FHE 软件生态的"三层模型":

依赖关系详解:

  • LattiAI → Lattigo:直接依赖(最强耦合) 。LattiAI 的底层框架 LattiSense 通过 fhe_ops_lib/lattigo 子模块引入 Lattigo v6,其编译器里的 CKKS 参数直接取材于 Lattigo 的 params.go。LattiAI 的 C++ 算子本质是"包在 Lattigo 密码原语之上的神经网络算子层"。
  • HEIR → Lattigo:代码生成目标(可替换)。HEIR 把 IR(Intermediate Representation,中间表示)翻译为 Lattigo Go 源码(同时也能出 OpenFHE C++、tfhe-rs Rust),对 HEIR 而言 Lattigo 只是若干后端之一。
  • HEIR ↔ LattiAI:无直接依赖,同为"上层建筑" 。两者都消费 Lattigo,但走不同路线:HEIR 做通用编译 (什么程序都能编),LattiAI 做垂直深耕(只做 CNN 密态推理,但做到极致)。

6.2 同一条推理链上的流水线分工

以"MNIST/CIFAR-10 图像分类"为例,把三者放到同一条推理流水线上看各自的职责边界:

阶段 Lattigo HEIR LattiAI
模型适配与微调 ✅(单阶段微调,精度基本无损)
模型/程序编译 ✅(通用编译器) ✅(专用编译器)
密码学计算 ✅(全部由它承担) ✅(生成代码后由它承担) ✅(经 Lattigo 承担)
部署运行时 ❌(需集成) ✅(Client/Server + GPU)

结论很清晰:Lattigo 是地基,HEIR 与 LattiAI 是两根不同的柱子------前者用"通用编译器"支撑所有 FHE 场景,后者用"垂直平台"专攻 AI 推理。


7. 相似性:共同的密码学基因

7.1 同一套数学底层

三者全部构建在 RLWE 格密码 + 全 RNS 多项式算术之上:

概念 Lattigo 中的载体 HEIR 中的载体 LattiAI 中的载体
多项式环算术 ring 包(NTT/RNS) RNSModArithPolynomial 方言 直接调用 Lattigo
RLWE 原语 core/rlwe LWESecret 方言 直接调用 Lattigo
CKKS 方案 schemes/ckks CKKS 方言 直接调用 Lattigo

7.2 相同的核心关切

无论哪个项目,都要回答同一批 FHE 关键问题:

  1. 乘法深度(level)管理:每次同态乘法消耗一个 level,耗尽后必须 Bootstrapping;
  2. Bootstrapping 插入规划:插在哪、插几次,直接决定端到端延迟;
  3. SIMD 槽位打包:怎么把张量装进密文槽,是性能的分水岭;
  4. 非线性层多项式近似:ReLU/SiLU/Sigmoid → 低阶多项式,并配套微调恢复精度;
  5. 经典算法同源:Gazelle 卷积(旋转-乘-加)、对角线打包矩阵乘、HEAAN 多项式逼近等,在三个项目的文档/代码中都能找到。

7.3 相同的商业模式要素

  • 全部 Apache 2.0 开源;
  • 都支持跨平台,其中 Lattigo 纯 Go 可编译 WASM,在浏览器客户端做加密;
  • 都走"客户端加密 → 服务端密文计算 → 客户端解密"的非交互式安全模型,同时保护数据隐私与模型知识产权。

8. 区别:从定位到实现的全维度对比

8.1 总览对比表

维度 Lattigo HEIR LattiAI
本质 密码学基础库(API) 编译器基础设施(IR/工具链) 应用平台(端到端产品)
解决的核心问题 怎么用代码做同态加密 怎么把任意程序自动、高效地编译成密文程序 怎么把 AI 模型一键变成密文推理服务
输入 Go 代码 Python / PyTorch / ONNX → linalg MLIR .pth / .onnx 模型
输出 可运行的密文计算逻辑 Lattigo / OpenFHE / tfhe-rs / Jaxite 源码 DAG + 参数 + H5 权重 + 推理运行时
FHE 方案 BFV / BGV / CKKS BGV / BFV / CKKS / CGGI 仅 CKKS
后端库 自身即后端 OpenFHE / Lattigo / tfhe-rs / Jaxite 仅 Lattigo(+ HEonGPU)
主要语言 纯 Go C++ (MLIR/LLVM) + Python C++17 + Python
构建系统 Go module Bazel(依赖 LLVM 源码) CMake(submodule 管理)
是否含训练/微调 (PolyAct-RN 单阶段微调)
是否含运行时 (多线程 CPU / GPU)
是否含硬件加速器代码生成 部分支持(Jaxite/TPU 架构后端;GPU/FPGA 代码生成是设计目标,仍在演进) 否(但内置 GPU 运行时)
用户画像 密码学研究者、Go 后端开发者 编译器工程师、研究者、硬件厂商 AI 应用工程师、业务部署方
密码学上手门槛 高(需全面理解) 中(需理解编译流程) 低(对 AI 工程师近乎透明)

8.2 三个维度上的"能力光谱"

  • 密码学深度 :Lattigo > HEIR > LattiAI(Lattigo 拥有 multiparty 多方协议、盲旋转、scheme switching 等前两者没有的能力);
  • 通用性:HEIR > Lattigo > LattiAI(HEIR 支持多方案 × 多后端 × 多前端;Lattigo 支持多方案但单一语言;LattiAI 绑定 CKKS + Lattigo);
  • AI 工程完整度:LattiAI 领先,是三者中唯一提供"训练→编译→部署→运行"全链路与 GPU 运行时的项目;HEIR 与 Lattigo 定位不同(编译器 vs 密码库),不宜直接比较。

8.3 关键差异的直观示例

同一件事------"给密文向量做 Sigmoid":

项目 实现方式 代码形态
Lattigo 手工选参数、编码、选多项式逼近(ckks/minimax 或 Chebyshev),逐算子评估 几十行 Go,需理解密码学
HEIR 高层写 sigmoidheir-opt 自动降级为多项式并出后端代码 高层描述 + 命令行编译
LattiAI 模型里的 Sigmoid 在训练侧自动替换为多项式,运行时透明执行 完全无感

9. 选型建议:我该用哪个?

9.1 使用前需要知道的事

三个项目都仍在快速演进,选型前请了解它们的现实约束:

  • Lattigo :v6 处于快速迭代期,官方明确表示大版本内仍会有不兼容的 API 变更,生产环境升级版本需评估迁移成本;
  • HEIR:依赖 LLVM 源码编译,首次完整构建约 30 分钟,对工程环境要求较高;部分优化 pass 仍在活跃开发中;
  • LattiAI :与 Lattigo 深度绑定(submodule 方式),上游大版本升级存在适配周期;密文推理延迟在数十秒到二十分钟量级,适合离线/准实时场景,暂不适合强实时交互场景。

9.2 场景选型表

你的场景 推荐 理由
研究 FHE 算法、自定义密码协议、做多方安全计算(MPC) Lattigo 原语最全、纯 Go、有 multiparty,可直接在密码层面做实验
探索通用 FHE 编译(跨方案/跨后端)、为硬件加速器做代码生成、做 FHE 编译器研究 HEIR MLIR 基础设施、多后端可替换、社区与论文支撑
快速把 ResNet/MobileNet/YOLO 部署为密态推理服务(面向业务) LattiAI 全自动流水线、内置训练适配与运行时、性能数据最接近落地
想理解"密文推理到底怎么算出来的"(学习/教学) 三者结合 Lattigo 学密码、HEIR 学编译、LattiAI 学工程
生产环境深度定制(如自己选后端库、改打包策略) HEIR + Lattigo HEIR 出码 + Lattigo 做运行时,组合最灵活

10. 总结与展望

10.1 总结

  • Lattigo 是 FHE 的密码学基础层:纯 Go、全方案(BFV/BGV/CKKS)、含多方协议,解决"同态加密怎么算";
  • HEIR 是 FHE 的编译器中间层:MLIR 方言体系、多前端多后端,解决"任意程序怎么自动编成密文";
  • LattiAI 是 FHE 的应用产品层:训练适配 + 专用编译 + C++ 算子 + 推理运行时,解决"AI 工程师怎么零门槛用上密态推理"。

三者共用 RLWE/CKKS 同一套数学地基,共享 level 管理、Bootstrapping 规划、SIMD 打包、多项式近似同一批核心算法,但在抽象层次、用户画像、方案覆盖度、工程完整度上形成清晰的互补分工。对个人开发者,读懂这三层,就基本读懂了当今 FHE 软件生态的全貌。

10.2 展望

三个项目都在向各自方向的下一站演进:

  • Lattigo:持续快速迭代,circuits 层的电路族(bootstrapping、多项式求值、比较)不断完善,多方协议是其区别于 C++ 库的独特优势;
  • HEIR:沿"通用 FHE 编译器"路线推进,硬件加速器(GPU/FPGA/ASIC)代码生成是其路线图上的重要目标,学术社区围绕它的研究也在快速增长;
  • LattiAI:在已验证的 ResNet/MobileNet/YOLO 之外,正在扩展更多网络架构的转换策略,GPU 加速链路的成熟有望把密文推理延迟进一步压到分钟级以内。

可以预期,随着底层密码库、中间编译器、上层平台三条线并行推进,"密文上跑 AI"将从技术演示逐步走向规模化落地。


附:参考与延伸