使用Torchserve部署模型实战
依赖:
python >= 3.8
jdk > 11.0
本文使用本地编译torchserve方式
1. 下载torchserve项目
git clone https://github.com/pytorch/serve.git
2. 安装项目相关依赖
如果需要支持cuda, 则添加参数--cuda=cuda版本
# Install dependencies # cuda is optional python ./ts_scripts/install_dependencies.py --cuda=cu111
3. 安装torchserve
pip install torchserve torch-model-archiver torch-workflow-archiver
4. 打包模型
这里以 text_classification 模型为例说明:
4.1 下载模型源码和数据,完成模型训练
python run_script.py
训练完成后,在目录下生成model.pt模型文件以及index_to_name.json、source_vocab.pt两个相关文件
4.2 torch-model-archiver工具打包模型,输出MAR模型文件
torch-model-archiver --model-name my_text_classifier --version 1.0 --model-file model.py --serialized-file model.pt --handler text_classifier
-r requirements.txt --extra-files "index_to_name.json,source_vocab.pt"
打包几个参数的说明:
--model-name: 模型名称,导出后的模型文件是“模型名称.mar”
--serialized-file: 模型序列化文件,这里有两种文件数据,一种是eager mode模式下,包含状态字典的.pt或者.pth文件;另一种是TorchScript条件下的可执行模块。
--model-file: 模型结构框架,通常只包含一个类,类是torch.nn.modules的子类。
--handler: torchserver 的入口程序。
--extra-files:额外文件,模型运行等其它额外文件都可以,可以包含多个,用逗号将不同文件拼接成一个字符串。
--run-time:选择运行的python版本。
--archive-format:选择压缩文件的格式, {tgz,no-archive,default} 。可以是tgz压缩文件,也可以是mar文件。
--export-path:mar存档文件的保存地址,未设置则保存在当前目录。
-f: 强制覆盖。
-v --version: 模型的版本
-r, --requirement-f: requirements.txt依赖包,模型环境相关的依赖包
4.3 压缩模型文件
注意:
压缩后的模型文件被torchserve解压加载后,不论压缩前是几级目录,解压后都是在解压根目录,无法保留原始目录结构;
压缩文件中包含一个MAR-INF/MANIFEST.json文件,文件内容:
{ "createdOn": "23/06/2022 17:21:42", "runtime": "python", "model": { "modelName": "sensorner", "serializedFile": "sensorner_ner_params.pth", "handler": "bert_ner_handler.py", "modelFile": "bert_ner_model.py", "modelVersion": "1.0", "requirementsFile": "requirements.txt" }, "archiverVersion": "0.6.0" }
5 模型管理
Torchserve提供了一个管理API,并默认在8081端口监听,用于对模型进行管理,默认情况下只能从localhost访问(但是可更改),功能包括:
- 列出已注册模型
- 添加新注册模型到服务器
- 取消注册当前模型
- 增加或减少每个模型worker数量
- 描述模型状态
- 添加版本
- 设置默认版本
首先, 创建torchserve模型文件夹model_store, 将要托管的多个模型MAR文件,移动到model_store路径下.
mkdir model_store mv my_text_classifier.mar model_store/
然后, 启动torchserve服务,并注册一个新模型,也可以同时注册多个模型
5.1 启动服务并注册单模型
torchserve --start --model-store model_store --models my_tc=my_text_classifier.mar
5.2 启动服务并注册多模型
torchserve --start --model-store model_store --models sensorner=sensorner.mar --models unitcls=unitcls.mar
5.3 停止torchserve服务
torchserve --stop
5.4 查询已注册的模型
curl "http://localhost:8081/models"
5.5 注销模型
curl -X DELETE http://localhost:8081/models/模型名称
5.6 添加注册新模型
curl -X POST "http://localhost:8081/models?url=添加的模型名称.mar"
打印结果:
{ "status": "Model \"maskrcnn\" Version: 1.0 registered with 0 initial workers. Use scale workers API to add workers for the model." }
5.7 查看是否注册成功
curl "http://localhost:8081/models"
5.8 查看注册模型的基本信息
curl "http://localhost:8081/models/模型名称"
5.9 设置模型min_worker数
curl -v -X PUT "http://localhost:8081/models/模型名称?min_worker=2"
5.10 模型版本控制
要对模型进行版本控制,请在调用时torch-model-archiver,将版本号传递给--version,请参见以下代码:
torch-model-archiver --model-name fastrcnn --version 1.0 ...
6 模型预测
默认只支持本机模型推理,要支持远程需要修改配置。
curl方式:
curl http://127.0.0.1:8080/predictions/my_tc -T examples/text_classification/sample_text.txt
curl -X POST http://10.10.58.32:8080/predictions/unitcls --data "data=测试字符串"
python文件:
res = requests.post("http://10.10.58.32:8080/predictions/unitcls", data ={'data': "测试字符串"})
print(res.text)
res = requests.post("http://localhost:8080/predictions/my_tc", \ files={'data': open('examples/text_classification/sample_text.txt', 'rt')}) print(res.text)
7 远程访问
如果需要支持远程访问,则需要修改配置文件中inference_address变量绑定的为0.0.0.0或者特定访问的IP地址。如修改config.properties配置
inference_address=http://0.0.0.0:8080 management_address=http://0.0.0.0:8081 metrics_address=http://0.0.0.0:8082
启动torchserve --ts-config config.properties覆盖默认配置。
torchserve --start --ts-config config.properties --model-store model_store --models my_tc=my_text_classifier.mar
再进行预测
curl http://本地主机IP:8080/predictions/my_tc -T examples/text_classification/sample_text.txt
8 支持HTTPS
https验证支持使用 Java 密钥库或证书。这里我选择后者。
首先,使用 openssl 创建一个证书和一个私有密钥。
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout mykey.key -out mycert.pem
然后,更新配置文件来定义证书和密钥的位置,将 TorchServe 与其默认的安全端口绑定(不要忘记更新安全组)。
model_store=model_store load_models=xxxx.mar inference_address=https://0.0.0.0:8080 management_address=https://0.0.0.0:8081 private_key_file=mykey.key certificate_file=mycert.pem
重新启动 TorchServe,然后就可以使用 HTTPS 调用它了。由于使用了自签名证书,需要将“–insecure”标志传递给 curl。
curl --insecure -X POST https://本地IP:8080/predictions/xxx -T xxx