大模型同态加密配置:零基础部署与验证指南
同态加密允许在密文上直接计算,解密后结果与明文计算一致,适合对大模型输入输出有隐私要求的场景。
配置大模型同态加密通常不是改模型本身,而是在推理服务前后增加加解密层,并选择支持同态运算的库。
下面以 Python 环境搭配 TenSEAL 为例,说明从零配置到验证的完整流程。
先确认你的场景是否适合同态加密
同态加密计算开销明显高于明文推理,目前更适合小规模特征或短向量运算,不适合直接加密整个大模型权重做全量推理。
如果你的需求是保护用户输入、在加密数据上做简单统计或线性运算,可以按本文配置;
如果要求加密后跑完整 Transformer 推理,需要评估性能是否可接受,或考虑安全多方计算、可信执行环境等替代方案。
准备 Python 环境与依赖
建议使用干净的虚拟环境,避免与已有包冲突。
以下命令在 Linux 服务器上执行,Python 版本以 3.8 及以上为宜。
python3 -m venv he-venv
source he-venv/bin/activate
pip install --upgrade pip
pip install tenseal numpy
安装完成后用一条命令确认库可导入:
python -c "import tenseal; print(tenseal.__version__)"
如果输出正常版本号,说明基础环境就绪。
若提示找不到模块,检查是否在虚拟环境中执行,或查看 pip list 中是否有 tenseal。
生成并保存同态加密上下文
同态加密需要一组参数(上下文)来定义密钥和运算能力。
下面代码生成 CKKS 方案的上下文,适合浮点数向量运算,并保存密钥供后续加解密使用。
import tenseal as ts
context = ts.context(
ts.SCHEME_TYPE.CKKS,
poly_modulus_degree=8192,
coeff_mod_bit_sizes=[60, 40, 40, 60]
)
context.generate_galois_keys()
context.global_scale = 2**40
with open("secret.context", "wb") as f:
f.write(context.serialize(save_secret_key=True))
print("context saved")
注意 save_secret_key=True 会把私钥一起序列化,生产环境应把密钥文件放在受限目录,不要提交到代码仓库。
需要公开给计算方的上下文可以另存一份不含私钥的版本。
在推理服务中接入加解密层
假设你有一个简单的线性打分函数,可以先用明文验证逻辑,再替换为密文计算。
下面示例展示加密向量与明文权重相乘后解密取结果。
import tenseal as ts
import numpy as np
with open("secret.context", "rb") as f:
context = ts.context_from(f.read())
x = [0.5, 1.2, 3.4]
w = [0.1, 0.2, 0.3]
enc_x = ts.ckks_vector(context, x)
result_enc = enc_x.dot(w)
result = result_enc.decrypt()
print("decrypted result:", result)
预期输出应接近 0.05 + 0.24 + 1.02 = 1.31。
如果结果偏差较大,检查 global_scale 是否设置合理,或降低乘法深度。
验证与排错要点
验证同态加密配置是否成功,重点看三件事:密文能正常序列化与反序列化、加密计算结果解密后与明文结果在可接受误差内、密钥文件权限正确。
常见报错包括 Context is not valid(上下文损坏或版本不匹配)、scale out of bounds(缩放因子设置不当)以及内存不足。
遇到内存问题时,可尝试减小 poly_modulus_degree 或减少向量长度,但需重新评估安全性参数。
生产环境建议记录库版本和上下文参数,便于复现;
变更参数后重新跑一遍加解密验证,不要直接上线。
常见疑问
同态加密能直接加密大模型权重吗? 目前不建议。
全量权重加密后推理开销极大,通常只对输入特征或中间小向量做加密计算。
密钥文件丢失怎么办? 私钥丢失后已加密数据无法解密,必须重新生成上下文并重新加密数据,因此密钥需要单独备份。
是否支持 GPU 加速? 多数同态加密库以 CPU 为主,GPU 支持取决于具体库和版本,部署前查阅对应库的文档确认。
以上步骤覆盖了最小可用的配置流程。
实际落地时先在一个小服务上验证性能和精度,再决定是否扩大到更多接口。