写在前面: 本专栏仅以onnx以及weights文件举例
第一次发专栏没什么经验,有什么吐槽和建议本up都收着了。本来是想做成视频形式,后来事情叠事情拖了很久,也没什么兴趣做剪辑特效,就这样了。
这几年以来,AI 的概念已经火遍大江南北,能用上计算机的各个领域几乎都能用 AI 助力,对于人类来说无论是不喜的还是不用的应该都有所耳闻。那么今天提到的神经网络(https://www.ibm.com/docs/zh/spss-modeler/SaaS?topic=nodes-neural-networks),就属于人工智能的分支之一机器学习的子集。具体的专业知识可以百度、知乎里找,本专栏不再赘述(up主也懒得介绍 鉴于up可怜的知识储备也无法系统性地讲解明白)。
就应用方面,比较常见的神经网络模型文件格式有 .pt/.pth (PyTorch框架),.weights(.cfg) (Darknet框架),.caffemodel(Caffe框架),.pb(Tensorflow框架) ,.onnx(微软设计的一种针对机器学习所设计的开放式的文件格式)。有些朋友愿意公布自己训练的神经网络模型,那么没问题。但有些朋友做的是商业化或者单纯不想自己辛辛苦苦标注训练出的模型被别人用,这就需要加密了。
本up当然也有过这方面的迷茫,相信不少人也在或者有寻找过如何加密的方式。其实模型文件就是个二进制文件 (binary file),而加密二进制文件的方式要从网上找就轻松多了。
比较入门的级别,就是文件重命名。推理框架在读取神经网络模型时方式之一就是从文件读取,那么只要文件名路径名对了就能顺利读取。鉴于Python打包后文件众多的特点(尤其是dll文件),完全可以取一个像模像样的文件名隐藏于众多动态链接库之中,这样别人找也会费点功夫。
更常用且安全性更高的方式,就是将模型这个二进制文件加密,需要推理时读取并解密到内存再给推理框架读取。比如说OpenCV里的DNN模块,其中读取Darknet框架模型的函数readNetFromDarknet 就包括从缓冲区(buffer)中读取相关配置文件内容以及模型内容的方式。
再比如微软的onnxruntime或者OpenCV的DNN在读取onnx文件时都允许参数直接输入文件的二进制内容。
了解这些之后就是下一个问题: 如何加密?
用Python的同学会很幸福,因为有别人写好开源的模块可以直接拿来用于加密。这里给大家介绍 cryptography 模块,简简单单命令行 pip install cryptography -U 即可安装。说明文档里已经给了最基本的示例,足够我们本次使用。
到此为止,所有准备工作完成。我们开始lu代码。首先加密部分。
接下来是解密读取部分
模型的加解密需要注意几点:
1.解密模块的接口不能暴露,否则竞争对手可以很方便的调用解密模块把模型还原。
2.解密模块需要有验证机制,否则竞争对手可以直接使用库文件和加密模型,用库文件去解密模型。
当然,这里提供的仅仅是针对训练好的模型的一种加解密方式。有能力的朋友可以用其他的库或者自己编写。更多相关可以戳我签名加群交流~