TorchServe部署yolov5项目(Docker篇)

一、前言

​ 没啥说的,要不然你也不会对这篇blog感兴趣

二、打包mar

1.下载项目

#下载分支mini版本(推荐先用mini版本上手,然后用完成版本验证)
git clone -b mini https://github.com/lbz2020/torchserve_yolov5.git
#下载完整版本
git clone https://github.com/lbz2020/torchserve_yolov5.git

2.进入项目主目录 torchserve_yolov5(终端命令窗口,我是在Mac OS 下操作的,没能照顾到Windows用户)

注意:如果没有特别说明或指定,全文命令的相对路径都是在项目主目录进行

3.安装依赖

#升级pip
pip install --upgrade pip
#安装依赖(使用国内镜像加速)
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

4.进入子目录 yolov5,将.pt文件转成.torchscript文件

#打开子目录 yolov5
cd yolov5
#由.pt文件导出.torchscript文件
python export.py --weights yolov5s.pt --include torchscript

5.回到项目主目录

#返回上一级目录
cd ..

6.打包成.mar文件

#将所有文件打包成.mar文件
torch-model-archiver --model-name demo --version 1.0 --serialized-file yolov5/yolov5s.torchscript --handler yolov5_model_handler.py --extra-files index_to_name.json

torch-model-archiver参数解释

  • –model-name :模型名字 demo

  • –version:模型版本号 1.0

  • –serialized-file:由.pt生成的.torchscript文件 yolov5/yolov5s.torchscript

  • –handler 针对yolov5模型的处理器,包括预处理、推理、后处理等过程 yolov5_model_handler.py

  • –extra-files 一起打包的额外文件,这里包含了标签索引的映射文件 index_to_name.json

    执行上面命令后,会在项目主目录下生成一个demo.mar文件

7.在项目主文件夹下创建一个文件夹model-store,接着把demo.mar文件放到文件夹model-store里面去。目的是待会用容器启动的时候做一个文件夹的映射。

#注意:以下是Linux命令!!!
#创建一个文件夹model-store
mkdir model-store
#将demo.mar文件移到到文件夹model-store中
mv demo.mar ./model-store

三、docker镜像

这里不建议直接pull官方提供的docker镜像

#拉取torchserve官方镜像(不用管)
docker pull pytorch/torchserve

注意:为什么不直接使用官方提供的镜像呢?因为官方提供的镜像里面只提供最基本的python依赖包。我们在写handler文件的时候一般都会用到其他依赖的,例如opencv等。这些依赖都是官方docker镜像没有提供的。后面我会做一个公开的镜像放在dockerhub上,以便供大家拉取。

1.假设我们都下载并安装了docker

2.制作TorchServe的docker镜像

接下我们制作要做的其实就是在官方Dockerfile里添加yolov5的一些python依赖

RUN python -m pip install matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.1 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 torch>=1.7.0 torchvision>=0.8.1 tqdm>=4.64.0 tensorboard>=2.4.1 pandas>=1.1.4 seaborn>=0.11.0 ipython psutil thop>=0.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/

​ a.修改Dockerfile文件

​ 找到Dockerfile文件:在主目录/serve/docker文件夹里面

​ 然后打开Dockerfile文件,定位到第76行的地方,把下面的命令添加上去

RUN python -m pip install matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.1 Pillow>=7.1.2 PyYAML>=5.3.1 requests>=2.23.0 scipy>=1.4.1 torch>=1.7.0 torchvision>=0.8.1 tqdm>=4.64.0 tensorboard>=2.4.1 pandas>=1.1.4 seaborn>=0.11.0 ipython psutil thop>=0.1.1 -i https://pypi.tuna.tsinghua.edu.cn/simple/

​ b.在终端中执行命令

#打开目录path,主目录/serve/docker
#必须定位到docker目录中,否则会有很多未知问题
cd serve/docker
#创建镜像(Linux)
./build_image.sh

​ windows有很多bug,而且制作镜像的时间较长,大概一个多小时创建完,然后没去尝试了。

two thousands years later ------------------------->>>>

在docker面板上可以看到创建成功的Docker镜像 pytorch/torchserve:latest-cpu

end --------------------------------<<< !

四、部署

​ docker命令要会**亿点点**哈哈哈哈哈哈哈哈哈哈

1.启动docker镜像

#启动命令格式(dev环境,不会后台运行)
docker run --rm -it -p 宿主主机端口:容器内部端号 --name 容器名字 -v 宿主主机文件夹:容器内部文件夹 镜像名:镜像标签号

#自己本地制作的镜像
docker run --rm -it -p 8080:8080 -p 8081:8081 --name object_detector -v model-store文件夹路径:/home/model-server/model-store pytorch/torchserve:latest-cpu
#从我远程pull的镜像
docker run --rm -it -p 8080:8080 -p 8081:8081 --name object_detector -v model-store文件夹路径:/home/model-server/model-store pytorch/torchserve:v1.0

#记得改成自己的路径哦

​ model-store文件夹路径:步骤二 - 7里提到的 model-store 文件夹

​ 容器内部文件夹路径 /home/model-server/model-store 这个路径是固定的,在镜像build的时候创建好的

so,容器启动完成就可以了吗,莫得

还要注册模型,要不然容器里面啥都没。我们通过restapi操作。

2.查询已经注册的模型

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

3.注册模型并且为模型分配资源

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

4.查看注册模型的基本信息

#查看注册模型的基本信息
curl "http://localhost:8081/models/demo"

5.推理(见证奇迹的时候到了)

curl http://localhost:8080/predictions/demo -T docs/zidane.jpg

6.注销模型(不用管)

curl -X DELETE http://localhost:8081/models/模型名称

然后,然后,就恭喜你啦。代码和其它啥的我都放在GitHub上。上面的每一步都是自己操作一步完后写下,然后再操作下一步。所以项目是没问题的。。。。。。

文档我会继续更新的,有很多细节好像都没有提及到。还有一些操作的图片整理到文章里后可能会更加清晰。 --20221012 init

五、总结

​ 没啥好总结的,一个晚上一个奇迹。有时候看着官方文档 就很累。。。。多看官方文档。有啥问题可以给我留言

​ TorchServe难点在于handle.py怎么写,yolov5本身就是工程化的项目,所以handle里面写了许多工程化的处理。其实我这个项目还是不够完善的。。。

六、issue

1.官方提供的镜像有坑?

官方可不能为每一种模型都提供对应环境的模型吧,而且每种模型都有不同的依赖。

2.为什么选择TorchServe部署?而不是选择TF Serving部署,或者选择Flask

根本原因是自己太菜了。。。

直接原因Flask框架部署AI模型存在内存泄漏问题,导致另外一个AI项目在生产环境中运行特别不稳定,而且这个Flask框架简单使用还行,在并发量高一点的场景就垮了。

TF Serving 不知道好不好用,反正我没用了。我只是一个小菜鸡!

3.想到啥问题我再更新,给我留言也可以

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐