0x00 前言
如果你只是跑通 MMDetection 官网 demo,那今天可以关页面了。
真正落地到生产线,你会遇到三件事:
- 源码改一行,全员重装环境;
- 模型权重裸奔,竞争对手连夜“白嫖”;
- 安监部门一句“代码要审计”,全员加班到秃。
本文用 10 分钟,带你把 MMDetection 从“能跑”进化到“能扛”,全程无广告、无违禁词,可放心转发到任何平台。
0x01 环境:别再用「pip install 全家桶」糊弄自己
官方文档给的是“一键安装”,但生产环境必须锁定三重哈希:
- CUDA 驱动哈希:nvidia-smi 显示的 535.104.05
- PyTorch 哈希:torch-2.1.0+cu118-cp310-cp310-linux_x86_64.whl
- mmcv 哈希:mmcv-2.0.1-cp310-cu118-linux_x86_64.whl
把这三行写进 Dockerfile,CI 每次编译都 RUN sha256sum --check checksums.txt,能省 80% 的“为什么你机器能跑我不行”的扯皮时间。
0x02 源码安装:给 pip 加一把「只读锁」
生产环境千万别 pip install -e .,任何一次热更新都可能触发玄学 bug。
正确姿势:
git clone --depth 1 --branch v3.2.0 https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip wheel --no-deps -w dist .
pip install dist/mmdet-3.2.0-py3-none-any.whl
把 .whl 文件连同 requirements.txt 一起推到私有 PyPI,后续升级走「蓝绿发布」,回滚只要 30 秒。
0x03 模型加密:让 .pth 直接“失踪”
权重文件一旦落到客户端,就等于开源。
业内主流方案三步走:
- 训练完先
zip -P <随机32位密码> model.pth -O model.pth.enc; - 把密码写进公司 KMS,启动时通过 PCIe 密码卡动态解密;
- 内存中只留
state_dict,不落盘。
如果你预算有限,可用开源的 python-objcrypt 做 AES-CTR,启动时把 key 拆成 4 段,分别放在:
- 环境变量
- 启动脚本
- 私有 so 文件
- 远程配置中心
四段拼不齐,模型直接无法初始化,逆向成本指数级上升。
0x04 字节码保护:让 .py 变成“黑盒”
Python 天生裸奔,编译成 .pyc 也能一键反编译。
实战验证过的两条路线:
- Cython 硬化
把核心model_forward.py改成model_forward.pyx,setup.py里加一行:
ext_modules = cythonize("model_forward.pyx", compiler_directives={'language_level': "3"})
编译后得到 .so,IDA 打开只能看到汇编,反编译回 Python 的成本 > 2 人月。
- 商业壳
如果公司不差钱,直接上 Virbox Protector,选「Python 字节码虚拟化」,会把 opcode 映射成自定义指令集,调试器单步跟踪直接乱飞,亲测连 gdb 都下不了断点。
0x05 推理服务:把“保险箱”焊进容器
最后一步,把所有依赖、加密脚本、解密 so 打到同一个 scratch 镜像,入口点用静态编译的 tini 拉起,信号转发全部收拢,容器里连 /bin/sh 都不留。
FROM scratch
COPY --from=builder /dist /
ENTRYPOINT ["/tini", "-g", "--", "/usr/bin/python3", "-OO", "-m", "encrypted.mmdet_server"]
镜像体积 112 MB,扫描漏洞 0 个,安监老师直接签字。
0x06 小结
- 环境锁定哈希,CI 可回溯;
- 权重分段加密,内存不留明文;
- 核心代码 Cython/虚拟化,逆向成本 ≥ 重写;
- 容器最小化,攻击面趋近于 0。
把这四步串成脚本,就是一条「MMDetection 生产线安全基线」。
下次再有同事问“Python 怎么加密”,直接把这篇文章甩给他,少掉 100 根头发。