使用Torchserve部署模型实战

Torchserve 官方手册

github官方地址

 

 

依赖:

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

 

posted @ 2022-06-14 15:46  IllidanStormrage  阅读(4075)  评论(0编辑  收藏  举报