模型部署到客户机房,怎么防止被反编译、权重被提取?CANN 提供了模型加密工具,把.pt/.onnx模型加密成.om离线模型,没有密钥无法加载。
加密流程
原始模型 (.pt) → 加密工具 → 加密模型 (.om) ↑ 密钥文件 (.key)加密后的.om文件只能在有密钥的机器上运行,且密钥跟机器 MAC 地址绑定。
加密步骤
步骤 1:生成密钥
# 生成密钥文件(跟机器 MAC 绑定)atc--mode=3\--output=model.om\--key_file=model.key\--bind_mac=yes# 绑定 MAC 地址model.key是二进制密钥文件,需要妥善保管(丢了无法解密)。
步骤 2:加密模型
# 把 PyTorch 模型转成 ONNX(中间格式)python export_onnx.py--modelmeta-llama/Llama-2-7b-hf--outputmodel.onnx# 加密 ONNX → .omatc--mode=0\--model=model.onnx\--output=model.om\--key_file=model.key\--framework=5# ONNX 格式步骤 3:部署加密模型
fromatbimportLLM# 加载加密模型(需要密钥文件)model=LLM("model.om",key_file="model.key",# 提供密钥device="npu:0",)没有model.key或密钥跟机器 MAC 不匹配,加载失败。
密钥管理
方案 1:密钥跟机器绑定
atc--mode=3--key_file=model.key--bind_mac=yes优点:即使密钥文件泄露,也不能在其他机器上使用
缺点:机器更换网卡后密钥失效,需要重新生成
方案 2:密钥不绑定机器
atc--mode=3--key_file=model.key--bind_mac=no优点:机器更换不影响
缺点:密钥文件泄露后可以随意使用
方案 3:远程密钥服务
# 推理服务启动时从远程拉取密钥(不落盘)importrequests key=requests.get("https://key-server/internal/model.key").contentwithopen("/dev/shm/model.key","wb")asf:f.write(key)# 加载模型model=LLM("model.om",key_file="/dev/shm/model.key")# 用完后删除os.remove("/dev/shm/model.key")密钥不落盘,只存在于内存。即使机器被攻破,密钥也不会泄露。
性能影响
加密模型加载时多了一步解密,推理时零开销(解密后的指令已经加载到 NPU)。
| 操作 | 无加密 | 有加密 | 额外开销 |
|---|---|---|---|
| 模型加载 | 2.5s | 3.1s | +0.6s (24%) |
| 推理(prefill) | 35ms | 35ms | 0 |
| 推理(decode/token) | 0.31ms | 0.31ms | 0 |
加密只影响加载速度,不影响推理速度。
限制
- 只支持离线模型(.om):PyTorch 的
.pt格式不支持加密,需要先转成.om。 - 密钥绑定 MAC:换网卡需要重新生成密钥。
- 调试不便:加密模型无法用 Profiler 查看算子细节(只能看到加密后的 kernel 名)。
跟 ATB 的配合
ATB 的cache_dir会缓存编译后的模型。如果原始模型是加密的,缓存的也是加密的:
model=LLM("model.om",key_file="model.key",cache_dir="./model_cache",# 缓存的也是加密的device="npu:0",)第一次加载需要解密 + 编译(约 30-60s),后续加载只需要解密(约 3-5s)。
模型加密是部署到客户机房的必备步骤。CANN 的加密工具使用简单,性能影响只在前期的模型加载,推理零开销。记得保管好密钥文件。仓库在这里:
https://atomgit.com/cann/ATB