基于flask和docker的深度学习模型部署


前言

最近使用了flask和docker部署了一个深度学习的模型,做的是nlp的情感分析,经历了九九八十一难终于算是部署成功了,自己也总结了这次模型部署的流程,记录下来供自己和大家参考。

一、前期准备工作

将相关代码,按如下文件夹方式放置。
在这里插入图片描述
其中最重要的内容就是服务代码和推理代码,服务代码是基于flask构建的服务,推理代码是我们深度学习模型的代码。因为本篇内容主要是讲如何部署深度模型的,所以代码的这块内容就不细讲了,如果看不懂以上内容的话,那参考一下这个项目:https://pan.baidu.com/s/1wbDk8sVT6_uXhnTSXYIJAw?pwd=hzv5,打开项目把每个文件点开看看,了解每块内容是干啥的基本上就ok了,然后根据自己的项目去改动相应的模块。

二、模型的部署

  1. Dockerfile的编写
FROM iva3682/cuda11.2-python3.7:latest  # 继承基础镜像iva3682/cuda11.2-python3.7:latest

# 创建文件夹
RUN mkdir -p /app/app 
RUN mkdir -p /app/bin
RUN mkdir -p /app/logs

# 将本地的文件上传到容器中
ADD ./app /app/app
ADD ./bin /app/bin

# 设置安装依赖包的镜像以及安装相关的依赖包,需要安装的依赖包以及版本提前在requirements.txt文件里写出来
RUN pip3 config set global.index-url https://mirrors.aliyun.com/pypi/simple/
RUN pip3 install -r /app/app/requirements.txt

ENV PYTHONUNBUFFERED=1

# 设置权限以及工作目录
RUN chmod +s /app/bin/chowner
RUN chmod +x /app/bin/*
WORKDIR /app/bin

# 访问的端口以及执行的命令
EXPOSE 8888
CMD ["bash","tower_recognize_start.sh"]
  1. 将准备好的app,bin,logs,Dockerfile四个文件,四个文件的构建参考上面发的百度网盘里的项目,把这四个文件传到服务器里,在服务器里cd进入包含这四个文件的目录
  2. 运行代码:“sudo docker build -t address_recognize:v1.0 .”,创建名字为address_recognize,版本为v1.0的镜像,注意v1.0后面有一个点,且两者之间有一个空格
  3. 运行容器,sudo docker run -it -d -p 8881:8888 address_recognize:v1.1 bash。这里端口8881和8888之间是一个映射关系。如果是在容器中运行service,那么在pycharm中测试访问的port是8881,这是因为建立容器的时候进行了端口的映射;如果只是在服务器中运行service的话,pycharm中测试访问的port还是8888。bash是直接进入到工作目录下。这一步完成之后就创建了一个容器,会返回容器的长id,记录下来
  4. 先启动容器:sudo docker start <容器id>;再进入容器:sudo docker exec -it <容器id> bash,直接进入到工作目录下,可以在工作目录下直接启动服务
  5. 启动服务:bash address_recognize_start.sh,address_recognize_start.sh是启动命令
  6. 进行访问测试,测试服务是否能正常运行以及是否达到预期,具体的测试脚本参考restful_test.py
  7. 测试无误后,先将容器提交成镜像:docker commit address_recognize:v1.0;然后运行镜像:docker run address_recognize:v1.0;最后打包成压缩包并放到服务器里指定的目录下:docker save -o /home/address_recognize_v1.0.tar address_recognize:v1.0

三、注意事项

  1. 提前看好需要的python版本,找到合适的基础镜像,最好就是本地调试用的什么版本的python,基础镜像就还用同样的版本
  2. 查看一下依赖包版本之间是否有冲突,尤其是torch和torchvision版本冲突,python版本和flask版本冲突。各个版本之间的适配关系都能查的到
  3. 记得把创建的镜像和容器的id都记录下来,以及端口号啥的。虽然这些都能查到的,我新手还是喜欢自己记录下来,这样以后查看的时候每个项目的镜像以及需要运行的容器就一目了然啦
  4. 如果我们的代码做了修改,就需要上传新的代码到容器中,在上传之前把之前的代码先删除掉,如rm test.txt,删除test.txt文件;rm -rf src,删除文件夹src。本地服务器往镜像里传文件:sudo docker cp 本地文件目录 :镜像文件目录;镜像往本地服务器传文件:sudo docker cp :镜像文件目录 本地文件目录。比如往镜像里传文件sudo docker cp app_sentiment_recognize/app/sentiment_recognize_service.py :/app/app,你需要先来到app_sentiment_recognize所在的目录下才能传输文件,否则会报错找不到文件。
  5. 如果在创建镜像安装依赖包遇到版本报错问题,那就直接在Dockerfile里面写上相应的版本,比如我当时创建镜像安装其他依赖包的时候每次都报错protobuf版本太低,我就直接在Dockerfile里面写上RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple protobuf==3.20.0,这样就不会报相关的错误了。

总结

以上就是全部的内容了,这是基于我自己做的项目部署来记录的,所以有一定的格式规范,比如需要准备app bin等文件。不知道是否写的足够清楚,如果有啥疑问欢迎留言,大家一起交流。

猜你喜欢

转载自blog.csdn.net/m0_62603533/article/details/130503347