Ubuntu上Docker 部署nginx+TensorFlow-GPU+Flask生产环境

前言

业务需要将神经网络模型布在GPU服务器上当做生产环境,通过调用接口的形式用模型分析图片,同时因为服务器还有其他项目在运作,使用Docker容器

Step1

1.本地需要安装TensorFlow-GPU版本镜像,安装CUDA,等配置,之前已有同事配置好镜像文件,此处略去操作,TensorFlow-GPU 1.14.0,CUDA 10.0
2.需要使用nginx部署,docker pull nginx
在这里插入图片描述

step2

实例化TensorFlow-GPU镜像,在镜像中安装自己依赖的包和使用的工具,这里主要安装Flask和vim以及nettools调试用,在安装系统工具前务必使用apt-get update,否则会安装失败,环境布置好后,将容器保存为新的镜像供后面使用

# 1.实例化容器
docker run -d -p 80:80--gpus all -it --name tf_flask_api tensorflow:1.14.0
# --gpus all -it 是docker启动GPU的命令
# 2.进入容器
docker exec -it 16 bash
# 3.安装环境
apt-get update
apt-get install vim
apt-get install nettools
pip install flask
cd /home
mkdir app
...
...
# 4.退出容器,保存为镜像
docker commit 16 tf_api:1.0

step3

TensorFlow镜像搞定后先布置好nginx

# 启动容器
docker run -d -p 8008:8080 --name my_nginx nginx:latest
# 进入容器
docker exec-it 5a bash
# 同之前安装vim
# 找到配置文件
vi /etc/nginx/nginx.conf
# 在http的大括号内最后写上upstream{}和server{}:
http {
     
	...
	...
	...
# yang是自定义名称,这里即将开通三个TensorFlow的docker容器,容器内映射到本地端口的形式
  upstream yang {
     
    server 192.168.72.10:8001;
    server 192.168.72.10:8002;
    server 192.168.72.10:8003;
  }
# 这里外网监听的是8080端口,需要在服务器打开
  server {
     
      listen 8080;
      charset UTF-8;
      client_max_body_size 75M;
      location /{
     
          proxy_pass  http://yang/;
      }
  }
# 配置好重启nginx
nginx -s reload

这时候就可以外网访问8080端口了,显示502 Bad Gateway就OK了

step4

在外面新建三个文件夹app8001,app8002,app8003,每个文件夹拷贝一份主程序,修改服务启动时的端口

# 启动容器
docker run -d -p 192.168.72.10:8002:8002 -v /home/web/app8002:/home/app --gpus all -it -w /home/app  --name tf_flask_api_8002 tf_api:1.0
# 进入容器
docker exec -it 1a bash
# 执行主程序,后台执行,输出日志
nohup python -u run.py > 8002log.txt 2>&1 &
# 退出容器
exit
cd /home/web/app8002
# 查看日志
tail -f 8002log.txt

这时外部访问8080端口就可以正常使用服务了,重复第四步布完3个容器,后面还可以设置nginx的调度等

End

这里每个TensorFlow容器都使用一张显卡,每个容器使用限度建议20%-30%,这个也和容器的数量有关,后面也可测试,但是这里使用3个容器同时处理图像识别时间并不是很划算,在服务器上识别的时间在一张图片0.2秒左右,但是在本地请求到返回要0.8s甚至更久,反而不如本地的处理效率了.
这里没有使用nginx+uwsgi+flask的布置方式是因为uwsgi太吃内存,并且不会自己清理内存,uwsgi一启动,GPU就没办法启动了.

你可能感兴趣的:(Nginx,Docker,python)