深度学习TensorFlow生产环境部署(环境准备篇)
最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑。特意总结一下,当做前车之鉴。
1 系统背景
系统是ubuntu16.04
ubuntu@ubuntu:/usr/bin$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l
或者
ubuntu@ubuntu:/usr/bin$ uname -m && cat /etc/*release
x86_64
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.5 LTS"
NAME="Ubuntu"
VERSION="16.04.5 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.5 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial
显卡是Tesla的P40
ubuntu@ubuntu:~$ nvidia-smi
Thu Jan 3 16:53:36 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130 Driver Version: 384.130 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P40 Off | 00000000:3B:00.0 Off | 0 |
| N/A 34C P0 49W / 250W | 22152MiB / 22912MiB | 0% Default |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 108329 C python 4963MiB |
| 0 133840 C tensorflow_model_server 17179MiB |
+-----------------------------------------------------------------------------+
TensorFlow则是当下最新的1.12.0版本。
2 背景知识
在介绍如何部署之前,先来了解一下相关的概念。
2.1 TensorFlow Serving
参考资料
- tensorflow serving技术架构
- tensorflow serving使用教程
TensorFlow Serving是google提供的一种生产环境部署方案,一般来说在做算法训练后,都会导出一个模型,在应用中直接使用。
正常的思路是在flask这种web服务中嵌入tensorflow的模型,提供rest api的云服务接口。考虑到并发高可用性,一般会采取多进程的部署方式,即一台云服务器上同时部署多个flask,每个进程独享一部分GPU资源,显然这样是很浪费资源的。
Google提供了一种生产环境的新思路,他们开发了一个tensorflow-serving的服务,可以自动加载某个路径下的所有模型,模型通过事先定义的输入输出和计算图,直接提供rpc或者rest的服务。
- 一方面,支持多版本的热部署(比如当前生产环境部署的是1版本的模型,训练完成后生成一个2版本的模型,tensorflow会自动加载这个模型,停掉之前的模型)。
- 另一方面,tensorflow serving内部通过异步调用的方式,实现高可用,并且自动组织输入以批次调用的方式节省GPU计算资源。
因此,整个模型的调用方式就变成了:
客户端 ----> web服务(flask或者tornado) --grpc或者rest--> tensorflow serving
如果我们想要替换模型或者更新版本,只需要训练模型并将训练结果保存到固定的目录下就可以了。
2.2 Docker
参考资料:
- docker教程
- docker实战
docker简单来说就是一种容器技术,如果有做过技术支持的朋友肯定了解安装软件的痛苦——各种系统环境,导致各种安装报错...docker解决的问题就是,只要你再服务器上安装上docker,那么它会自动屏蔽所有的硬件信息,拉取一个镜像,就能直接启动提供服务。
搭建docker也很简单,如果是mac直接下载dmg文件就可以双击运行;如果是ubuntu直接运行
sudo apt-get install docker
不过Ubuntu安装后只能通过root使用,如果想让其他用户使用,需要调整docker组,细节百度一下即可。
常用的命令也比较少:
# 查看当前部署的服务
docker ps
# 运行一个容器服务
docker run
# 删除一个服务
docker kill xxx
2.3 Nvidia-docker
参考资料:
- nvidia-docker github官网
因为docker是虚拟在操作系统之上的,屏蔽了很多底层的信息。如果想使用显卡这种硬件,一种思路是docker直接把操作系统上的驱动程序和算法库映射到容器内,但是这样就丧失了可移植性。
另一种方法就是在docker启动的时候挂载一个类似驱动的插件——这就是nvidia-docker的作用。
总的来说,如果想要在docker中使用tensorflow-gpu,需要首先安装docker-ce(社区版,其他版本nvidia-docker不一定支持),然后安装nvidia-container-runtime,最后安装nvidia-docker2。
当使用的时候,需要直接指定nvidia-docker2运行, 如:
sudo nvidia-docker run -p 8500:8500 --mount type=bind,source=/home/ubuntu/data/east_serving/east_serving,target=/models/east -e MODEL_NAME=east -t tensorflow/serving:1.12.0-gpu &
3 部署实战
下面就进入部署的实战篇了:
3.1 Docker\Nvidia-Docker、Tensorflow部署
主要参考:
- 1 nvidia-docker2-deploy-ubuntu-16.04LTS.md
- 2 nvidia-docker github官网
首先安装docker-ce:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo apt-key fingerprint 0EBFCD88
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install docker-ce
sudo service docker restart
如果之前安装了nvidia-docker1需要删除掉:
docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
sudo apt-get purge -y nvidia-docker
修改docker的镜像地址vi /etc/docker/daemon.json
:
{"registry-mirrors":["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}
然后重启docker配置服务systemctl restart docker.service
。
更新nvidia-docker地址:
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/ubuntu16.04/amd64/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update
执行安装命令:
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
测试:
ubuntu@ubuntu:~$ sudo nvidia-docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
Thu Jan 3 09:52:06 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130 Driver Version: 384.130 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P40 Off | 00000000:3B:00.0 Off | 0 |
| N/A 35C P0 49W / 250W | 22152MiB / 22912MiB | 0% Default |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
+-----------------------------------------------------------------------------+
可以看到,已经能再docker内部看到显卡的使用信息了。
在docker容器外,执行nvidia-smi
可以看到有个tensorflow serving的服务
ubuntu@ubuntu:~$ nvidia-smi
Thu Jan 3 17:52:43 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 384.130 Driver Version: 384.130 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 Tesla P40 Off | 00000000:3B:00.0 Off | 0 |
| N/A 35C P0 49W / 250W | 22152MiB / 22912MiB | 0% Default |
+-------------------------------+----------------------+----------------------++-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 108329 C python 4963MiB |
| 0 133840 C tensorflow_model_server 17179MiB |
+-----------------------------------------------------------------------------+
注意正常需要配置docker占用的显存比例!
4 总结
搞深度学习还是需要全栈基础的,涉及到各种linux底层动态库、硬件、容器等等相关的知识,虽然踩了不少坑,但是很多概念性的东西都得到了实践,这才是工作最大的意义。
深度学习TensorFlow生产环境部署(环境准备篇)相关推荐
- 深度学习TensorFlow生产环境部署(模型部署篇)
前一篇讲过环境的部署篇,这一次就讲讲从代码角度如何导出pb模型,如何进行服务调用. 1 hello world篇 部署完docker后,如果是cpu环境,可以直接拉取tensorflow/servin ...
- 深度学习小白入门教程-基础环境篇
深度学习小白入门教程-基础环境篇 如有图片显示失败,请回小主主页查看~ Anaconda 安装包下载方式一:官网(科学上网比较慢,不推荐) 安装包下载方式二:清华镜像(推荐) 具体安装步骤(跟着箭头来 ...
- 训练好的深度学习模型是怎么部署的?
训练好的深度学习模型是怎么部署的? 来源:https://www.zhihu.com/question/329372124 作者:田子宸 先说结论:部署的方式取决于需求 需求一:简单的demo演示,只 ...
- 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(八)(TensorFlow基础))
[神经网络与深度学习-TensorFlow实践]-中国大学MOOC课程(八)(TensorFlow基础)) 8 TensorFlow基础 8.1 TensorFlow2.0特性 8.1.1 Tenso ...
- 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(四)(Python语言基础(2))
[神经网络与深度学习-TensorFlow实践]-中国大学MOOC课程(四)(Python语言基础(2)) 第4讲 Python语言基础(2) 4.1 内置数据结构 4.1.1 序列数据结构(sequ ...
- 百度云-深度学习tensorflow搭建
百度云上部署Tensorflow进行模型训练 上半年就了解过百度云但是还是tf1.0版本的,而谷歌3月份的升级到1.2改动挺大的,百度云上更新滞后,所以尽管有tf平台,版本落后每小时付费还是有点小贵, ...
- 深度学习算法移动端部署设备--NVIDIA英伟达开发套件
深度学习算法移动端部署设备--NVIDIA英伟达开发套件 简介 NVIDIA Jetson AGX Xavier CSI Camera USB or CSI 简介 以下产品分模块(module)和开发 ...
- 使用深度学习TensorFlow框架进行图片识别
Apsara Clouder大数据专项技能认证:使用深度学习TensorFlow框架进行图片识别 本认证系统的介绍了深度学习的一些基础知识,以及Tensorflow的工作原理.通过阿里云机器学习PAI ...
- 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(十二)(人工神经网络(1)))
[神经网络与深度学习-TensorFlow实践]-中国大学MOOC课程(十二)(人工神经网络(1))) 12 人工神经网络(1) 12.1 神经元与感知机 12.1.1 感知机 12.1.2 Delt ...
最新文章
- NET MVC3 中的枚举多语言实现,DescriptionPairAttribute
- 第二节:Css重写样式
- python 调用mysql_Python调用Mysql
- gulpfile笔记
- input回车触发事件_JavaScript学习笔记(十五)-- Event事件(上)
- Unity5 Survival Shooter开发笔记2
- MD1——2 Corner
- Java的Socket编程C/S小例子
- 利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
- 无线路由器网络测试软件,简单快速测试家里无线路由器的网速和性能
- 《焦虑心理学》——综述篇
- postgresql 中文azw3_制作mobi格式的PostgreSQL文档
- Python 随机漫步
- 用matlab画树叶,matlab画漂亮的树叶
- Chrome 开发者工具官方中文文档
- 数据压缩作业:LZW词典编码
- 如何提高项目交付效率
- 脑电数据的实验范式及EEGLAB分析预处理
- linux 模拟器安卓版下载,ONS模拟器下载
- linux-pam 编译,PAM后门编译安装