业务需要将神经网络模型布在GPU服务器上当做生产环境,通过调用接口的形式用模型分析图片,同时因为服务器还有其他项目在运作,使用Docker容器
1.本地需要安装TensorFlow-GPU版本镜像,安装CUDA,等配置,之前已有同事配置好镜像文件,此处略去操作,TensorFlow-GPU 1.14.0,CUDA 10.0
2.需要使用nginx部署,docker pull nginx
实例化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
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了
在外面新建三个文件夹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的调度等
这里每个TensorFlow容器都使用一张显卡,每个容器使用限度建议20%-30%,这个也和容器的数量有关,后面也可测试,但是这里使用3个容器同时处理图像识别时间并不是很划算,在服务器上识别的时间在一张图片0.2秒左右,但是在本地请求到返回要0.8s甚至更久,反而不如本地的处理效率了.
这里没有使用nginx+uwsgi+flask的布置方式是因为uwsgi太吃内存,并且不会自己清理内存,uwsgi一启动,GPU就没办法启动了.