zl程序教程

您现在的位置是:首页 >  工具

当前栏目

torchserver模型本地部署和docker部署

Docker部署 模型 本地
2023-09-11 14:14:26 时间

https://www.zhihu.com/question/389731764
https://zhuanlan.zhihu.com/p/263865832
https://blog.csdn.net/qq_28613337/article/details/110438060
https://jishuin.proginn.com/p/763bfbd2c54d
https://zhuanlan.zhihu.com/p/344364948
https://zhuanlan.zhihu.com/p/344364948
真实案例介绍:
https://blog.csdn.net/weixin_34910922/article/details/114550772
https://blog.csdn.net/weixin_34910922/article/details/114550772

torch serverGPU部署

https://www.icode9.com/content-4-1139862.html

本地运行三个关键步骤

步骤一、安装环境,下载目录

pip install torchserve torch-model-archiver
git clone https://gitee.com/AI-Mart/serve.git

步骤二、打包模型文件

torch-model-archiver 命令来打包模型
1.checkpoint.pth.tar
从命名就应该知道,这就是我们在训练过程中通过 torch.save 获得的模型权重文件,注意该文件内容只能包含模型的权重。参考文件:https://github.com/louis-she/torch-serve-mnist/blob/main/mnist/mnist.pth.tar

  1. model.py

该文件应该包含单个模型的类,该模型类应该可以使用 load_state_dict 来成功加载 checkpoint.pth.tar 提供的权重。参考文件 https://github.com/louis-she/torch-serve-mnist/blob/main/mnist/model.py

  1. handler.py (可选)

如果希望加入一些自定义的 preprocessing 和 postprocessing,可以加入该文件。比如,对于视觉类任务,我们至少需要对输入图片进行一些 resize,归一化操作,还会对模型输出做一些后处理。这些都可以在 handler.py 中来定义。

torch-model-archiver --model-name mnist --serialized-file mnist.pth.tar --model-file model.py --handler handler --runtime python3 --version 1.0

这里的参数都比较容易理解,但注意 --model-name 参数我们可以取一个有意义的名称(但最好不要加中文或空格),该参数会影响到我们之后的调用服务的 URL 链接。

调用过后我们将会获得一个 mnist.mar 文件,这就是我们打包好的文件。

步骤三、启动模型服务

1启动服务

创建一个目录,名称为 model-store,将第一步打包好的 .mar 复制到这个目录中,然后我们就可以启动 TorchServe 服务器程序了:

torchserve --start --model-store $model-store-path

$model-store-path 替换为 model-store 的绝对路径即可。

2 注册模型

服务进程启动后,model-store 中的 mar 文件不会自动注册到 TorchServe 中,我们需要通过 TorchServe 提供的 Management API 来注册 model-store 中的 mar 文件。

API 的调用都将使用 curl 命令,如果你对该命令不熟悉,也可以使用 http GUI 客户端。
首先注册 mar 文件,这里依然以 MNIST 为例子:

curl -X POST "http://localhost:8081/models?url=mnist.mar"

注意 url= 后面的值必须是在 model-store 目录中有的文件。

3 分配进程

然后为 mnist 分配工作进程,你可以根据 CPU 核心数来分配

curl -v -X PUT "http://localhost:8081/models/mnist?min_worker=1&max_worker=1&synchronous=true"

4访问接口

现在我们的 mnist.mar 就可以对外提供服务了,准备一张手写数字图片 test.png,

curl "http://127.0.0.1:8080/predictions/mnist" -T test.png

{
“8”: 0.9467765688896179,
“3”: 0.023649968206882477,
“5”: 0.019438084214925766,
“9”: 0.008277446031570435,
“2”: 0.001520493533462286
}
这里注意 url 的格式为 /predictions/$model-name,因为我们之前指定的 model-name 是 mnist,所以链接为 /predictions/mnist

看到这里你应该已经猜到,我们甚至可以同时注册多个模型,只要将打包好的 mar 文件放入 model-store 目录中,然后调用 Management API 后即可。

案例实战

1 切换目录

cd /mart/pt_server/serve/examples/image_classifier

2 下载模型权重

wget https://download.pytorch.org/models/densenet161-8d451a50.pth

3 打包模型文件

torch-model-archiver --model-name densenet161 --version 1.0 --model-file densenet_161/model.py --serialized-file densenet161-8d451a50.pth --handler image_classifier --extra-files index_to_name.json

4 将模型放入存储目录

mkdir model_store
mv densenet161.mar model_store/

5 启动serve

torchserve --start --model-store model_store --models densenet161=densenet161.mar

注册服务,并且设置参数
https://blog.csdn.net/weixin_34910922/article/details/114552407
6 测试一张图
在这里插入图片描述

curl http://127.0.0.1:8080/predictions/densenet161 -T examples/image_classifier/kitten.jpg

结果
在这里插入图片描述

7 测试完毕后,关闭服务、删除日志

在服务终端,ctrl+C结束。

使用torchserve --stop,关闭服务。
在这里插入图片描述

DOCKER运行部署三个关键步骤

端口号说明

-p8080:8080 -p8081:8081 -p 8082:8082 -p 7070:7070 -p 7071:7071 TorchServe uses default ports 8080 / 8081 / 8082 for REST based inference, management & metrics APIs and 7070 / 7071 for gRPC APIs. You may want to expose these ports to the host for HTTP & gRPC Requests between Docker & Host.

1 下载项目文件

git clone https://github.com/pytorch/serve.git
cd serve/docker

2 构建docker image CPU

镜像下载列表https://hub.docker.com/r/pytorch/torchserve/tags?page=1&ordering=last_updated

docker pull pytorch/torchserve:latest

2 构建docker image GPU

1、需要安装nvidia docker,参照https://blog.csdn.net/qq_15821487/article/details/122664031?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164319182916780264058928%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=164319182916780264058928&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-122664031.nonecase&utm_term=docker%E9%83%A8%E7%BD%B2pytorch+gpu&spm=1018.2226.3001.4450
2、镜像下载列表https://hub.docker.com/r/pytorch/torchserve/tags?page=1&ordering=last_updated
nvidia-smi,根据机器得出的cuda型号下拉特定版本的镜像
cuda10.1版本只能下拉这个版本的镜像,其他的版本都是10.2以及以上

docker pull pytorch/torchserve:0.1-cuda10.1-cudnn7-runtime

3 切换目录

cd /mart/pt_server/serve/examples/image_classifier

4 下载模型权重

wget https://download.pytorch.org/models/densenet161-8d451a50.pth

5 新建模型保存文件夹

mkdir model-store

6 打包模型文件,生产可部署的模型文件

在这里插入图片描述
handler 可用用默认的torchserve自带的处理函数,下拉镜像里面已经自带了,所以参数为对应的函数名即可
如果需要自定义,就自己编写相关的handler.py文件即可,参数也是这个文件,自定义的话文本类继承text_handler的基类,图像类继承vision_handler的基类

torch-model-archiver --model-name densenet161 --version 1.0 --model-file densenet_161/model.py --serialized-file densenet161-8d451a50.pth --export-path model-store  --handler image_classifier --extra-files index_to_name.json -f
--model-name: 模型的名称,后来的接口名称和管理的模型名称都是这个
--serialized-file: 模型环境及代码及参数的打包文件
--export-path: 本次打包文件存放位置
--extra-files: handle.py中需要使用到的其他文件
--handler: 指定handler函数。(模型名:函数名)
-f 覆盖之前导出的同名打包文件

7.启动docker服务,CPU

docker run --rm -it -p 3000:8080 -p 3001:8081 --name densenet161 -v /mart/pt_server/serve/examples/image_classifier/model-store:/home/model-server/model-store pytorch/torchserve:latest
# docker 可选参数 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
# 切换到后台运行
ctrl + p + q

7.启动docker服务,GPU

docker run --rm -it --gpus all -p 3000:8080 -p 3001:8081 --name densenet161 -v /mart/pt_server/serve/examples/image_classifier/model-store:/home/model-server/model-store pytorch/torchserve:0.1-cuda10.1-cudnn7-runtime
# docker 可选参数 --shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 \
# 切换到后台运行
ctrl + p + q

进入容器
docker exec -it densenet161 /bin/bash

验证cuda是否可用以及版本号,发现和本地的版本不一致,会导致不可用,重新下拉镜像
import torch
print(torch.__version__)
print(torch.version.cuda)
print(torch.backends.cudnn.version())
torch.cuda.is_available()
#cuda是否可用;

torch.cuda.device_count()
#返回gpu数量;

torch.cuda.get_device_name(0)
#返回gpu名字,设备索引默认从0开始;

torch.cuda.current_device()
#返回当前设备索引

/home/model-server/model-store 是docker映射地址,不能更改
进入容器,可以发现各个端口的意义,8080是通信访问接口,8081是管理服务配置接口,8082是服务监控接口
在这里插入图片描述
和本地的版本匹配,gpu可用
在这里插入图片描述

8.torchserver配置接口

# 查询已注册的模型
curl "http://localhost:3001/models"

# 注冊模型并为模型分配资源
curl -v -X POST "http://localhost:3001/models?initial_workers=1&synchronous=false&url=densenet161.mar"

# 修改分配worker数量
curl -v -X PUT "http://localhost:3001/models/densenet161?min_worker=3"

# 查看注册模型基本信息
curl "http://localhost:3001/models/densenet161"

# 使用以下代码注销模型
curl -X DELETE http://localhost:3001/models/densenet161/

# 模型版本控制
要对模型进行版本控制,请在调用时torch-model-archiver,将版本号传递给--version,请参见以下代码:

torch-model-archiver --model-name densenet161 --version 1.0 ...

8模型预测接口(handler.py文件中的逻辑)

curl http://localhost:3000/predictions/densenet161 -T /mart/pt_server/serve/examples/image_classifier/kitten.jpg

在这里插入图片描述

9.进入docker 镜像停止或运行程序

# 进入docker容器
docker exec -it [容器名称] /bin/bash

# 停止服务
torchserve --stop

# 启动服务
torchserve --start --ncs --model-store /home/model-server/model-store --models densenet161.mar

在这里插入图片描述

在这里插入图片描述
通过TorchServe,可以轻松地在生产环境中大规模部署PyTorch模型。它以低延迟提供轻量级服务,因此您可以部署模型以进行高性能推理。它为最常见的应用程序提供了默认处理程序,例如目标检测和文本分类,因此您不必编写自定义代码即可部署模型。借助强大的TorchServe功能,包括多模型服务,用于A / B测试的模型版本控制,用于监视的指标以及用于应用程序集成的RESTful端点,您可以将模型从研究阶段快速投入生产。TorchServe支持任何机器学习环境,包括Amazon SageMaker,Kubernetes,Amazon EKS和Amazon EC2。

TorchServe采用Java开发,
而TensorFlow Serving一样采用更好性能的C++

讲一下这个框架的发展史:最开始本来是给MXNet做的。后来因为性能不好,同组大佬 (25年Java开发经验) 用netty在一个周末 (2万5千行) 重构了整个MXNet Model Server 也就是后来的 Multi Model Server 也就是后来的 TorchServe。当时PT感觉这个架构很好用,然后AWS和FB就一起针对Torch做了很多优化开发了这个东西。它运行速度相当快,而且支持热插拔,快速导入模型进行推理,无需重启机器。------ 后话然后大佬觉得,用Java host Python的server还是有 restful call的bottleneck。然后,然后一年多以后,我们一起就写了 DJL,一个完全用Java重构的框架。。——补充为什么要用Java host。1.基于Java的服务器目前来看还是市场占有第一。2. Java的Netty很稳定,用户量也大,社区较好。同比c++相同体量一个能打的都没有。然后,benchmark过,c++速度和jvm基本是一样的(offload benchmark).