把 AI 推理放到云端,通常意味着把输入数据交给服务端。对于医疗记录、金融交易、企业机密或个人行为数据,这个前提并不总是能够接受。Google 正在开源 HEIR(Homomorphic Encryption Intermediate Representation),试图把同态加密计算从密码学专家才能维护的底层工程,变成普通模型开发者也能接入的编译流程。
HEIR 的核心方向很明确:让原本面向明文输入训练和部署的模型,经过编译和转换后,可以在密文数据上执行推理。它并不会消除同态加密的计算成本,但有机会降低模型改造、编译和部署的门槛。
难点不只是“把输入加密”
同态加密允许服务端直接处理密文,并返回密文结果,服务端不需要看到原始输入。这一能力很适合隐私敏感的推理场景,但普通神经网络并不能直接无条件地搬到密文环境中运行。
主要限制包括:
- 密文计算的延迟和内存开销通常高于明文计算。
- 不同方案对整数、定点数、近似实数和乘法深度的支持不同。
- 常见激活函数、归一化层或控制流,可能需要近似、重写或提前融合。
- 参数选择会影响精度、密文大小、安全等级和运行时间。
因此,真正困难的工作往往发生在模型进入加密运行时之前:识别算子、选择可实现的表示、安排底层加密操作,并检查计算深度是否超出参数预算。
HEIR 的价值在于提供一个中间表示和编译工具链,让这些转换可以被系统化处理。模型开发者不必为每个算子手写一套密码学后端适配逻辑,而是可以让编译器在较高层模型描述和具体同态加密实现之间完成 lowering、优化与代码生成。
从预训练模型到密文推理
可以把 HEIR 所面向的流程理解为四个阶段:
- 使用现有机器学习框架训练模型。
- 对模型进行量化、算子替换或结构简化,使其符合同态计算约束。
- 将模型转换为 HEIR 能够处理的中间表示,并选择目标加密方案和参数。
- 生成服务端推理代码,由客户端负责加密输入和解密结果。
这条路径的关键不是“模型完全不用改”,而是把改造工作从分散的手工代码,收敛到可检查、可重复的编译流程。对于已经存在大量预训练模型的团队,这一点尤其重要:模型可以继续沿用熟悉的训练工具,隐私计算能力则作为部署阶段的一层编译目标加入。
需要注意的是,“一键”更接近开发体验目标,而不是意味着任意模型都能零配置运行。模型是否适合密文推理,仍然取决于算子集合、数值精度、模型深度、目标硬件和安全参数。
一个可改造的模型检查配置
在接入实际编译器之前,可以先用一个小型检查脚本,把模型的算子约束和编译目标显式化。下面的示例可以直接运行,也可以改造成 CI 中的预检查步骤。它不执行真实的同态加密编译,而是演示部署前应如何筛选算子、估算乘法深度,并在发现不兼容时提前失败。
运行方式:将代码保存为 check_he_inference.py,然后执行 python check_he_inference.py。
from dataclasses import dataclass
@dataclass
class CompileTarget:
scheme: str
max_multiplicative_depth: int
supported_ops: set[str]
MODEL_OPS = [
("input", 0),
("linear", 1),
("square_activation", 1),
("linear", 1),
("output", 0),
]
def check_model(ops: list[tuple[str, int]], target: CompileTarget) -> None:
depth = 0
unsupported = []
for name, extra_depth in ops:
if name not in target.supported_ops:
unsupported.append(name)
depth += extra_depth
if unsupported:
names = ", ".join(sorted(set(unsupported)))
raise ValueError(f"Unsupported operations for {target.scheme}: {names}")
if depth > target.max_multiplicative_depth:
raise ValueError(
f"Required multiplicative depth is {depth}, "
f"but the target allows only {target.max_multiplicative_depth}"
)
print(f"Target scheme: {target.scheme}")
print(f"Estimated multiplicative depth: {depth}")
print("Model is ready for the next compiler integration step.")
def main() -> None:
target = CompileTarget(
scheme="approximate-real-number-HE",
max_multiplicative_depth=3,
supported_ops={
"input",
"linear",
"square_activation",
"output",
},
)
check_model(MODEL_OPS, target)
if __name__ == "__main__":
main()
实际接入 HEIR 时,可以把 MODEL_OPS 替换为模型导出的算子图,把 supported_ops 和深度限制替换为目标后端的能力描述,再将检查通过的模型交给具体的 HEIR 转换与代码生成命令。这样做的好处是,模型不兼容的问题会在构建阶段暴露,而不是等到线上密文推理耗时数小时后才发现。
工程团队需要关注什么
精度需要单独验收。 同态推理通常需要量化或近似计算。明文环境中的准确率不能直接代表密文环境的准确率,必须使用真实的加密执行路径做回归测试。
参数选择是部署契约。 安全等级、密文大小、乘法深度和运行时间彼此牵制。编译成功只说明程序可以生成,不代表它已经满足生产环境的延迟和成本要求。
模型结构要面向目标后端设计。 如果模型大量使用难以在密文上实现的非线性操作,编译器可能只能进行近似,或者需要开发者重写模型。对于新模型,最好在训练阶段就加入量化、低深度激活函数和算子白名单约束。
客户端和服务端边界必须明确。 客户端通常负责密钥管理、输入加密和输出解密,服务端负责密文计算。密钥生命周期、错误处理、密文传输和结果验证,仍然属于应用系统的责任,不会自动由中间表示解决。
采用建议
HEIR 更适合作为隐私推理基础设施的编译层,而不是一个替代训练框架或加密运行时的单独产品。评估时可以按以下顺序推进:
- 先选择一个算子简单、数据敏感且延迟要求可控的推理任务。
- 固定模型版本、量化策略和目标加密方案,建立明文与密文结果的精度对照。
- 记录编译时间、密文大小、端到端延迟、吞吐量和内存占用。
- 对不支持的算子建立替换策略,而不是在上线前临时修改模型。
- 将模型约束检查纳入 CI,把参数变更和编译产物视为可审计的构建结果。
如果这些基础指标能够达到业务可接受的范围,HEIR 这类中间表示工具就有机会把同态加密从专项密码学项目,推进为模型部署流程中的一个标准目标。