Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >深度学习Tensorflow生产环境部署(上·环境准备篇)

深度学习Tensorflow生产环境部署(上·环境准备篇)

作者头像
用户1154259
发布于 2019-01-07 08:17:09
发布于 2019-01-07 08:17:09
2.1K01
代码可运行
举报
运行总次数:1
代码可运行

最近在研究Tensorflow Serving生产环境部署,尤其是在做服务器GPU环境部署时,遇到了不少坑。特意总结一下,当做前车之鉴。

1 系统背景

系统是ubuntu16.04

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ubuntu@ubuntu:/usr/bin$ cat /etc/issue
Ubuntu 16.04.5 LTS \n \l

或者

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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是google提供的一种生产环境部署方案,一般来说在做算法训练后,都会导出一个模型,在应用中直接使用。

正常的思路是在flask这种web服务中嵌入tensorflow的模型,提供rest api的云服务接口。考虑到并发高可用性,一般会采取多进程的部署方式,即一台云服务器上同时部署多个flask,每个进程独享一部分GPU资源,显然这样是很浪费资源的。

Google提供了一种生产环境的新思路,他们开发了一个tensorflow-serving的服务,可以自动加载某个路径下的所有模型,模型通过事先定义的输入输出和计算图,直接提供rpc或者rest的服务。

  • 一方面,支持多版本的热部署(比如当前生产环境部署的是1版本的模型,训练完成后生成一个2版本的模型,tensorflow会自动加载这个模型,停掉之前的模型)。
  • 另一方面,tensorflow serving内部通过异步调用的方式,实现高可用,并且自动组织输入以批次调用的方式节省GPU计算资源。

因此,整个模型的调用方式就变成了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
客户端 ----> web服务(flask或者tornado) --grpc或者rest--> tensorflow serving

如果我们想要替换模型或者更新版本,只需要训练模型并将训练结果保存到固定的目录下就可以了。

2.2 Docker

参考资料:

docker简单来说就是一种容器技术,如果有做过技术支持的朋友肯定了解安装软件的痛苦——各种系统环境,导致各种安装报错...docker解决的问题就是,只要你再服务器上安装上docker,那么它会自动屏蔽所有的硬件信息,拉取一个镜像,就能直接启动提供服务。

搭建docker也很简单,如果是mac直接下载dmg文件就可以双击运行;如果是ubuntu直接运行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install docker

不过Ubuntu安装后只能通过root使用,如果想让其他用户使用,需要调整docker组,细节百度一下即可。

常用的命令也比较少:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看当前部署的服务
docker ps 
# 运行一个容器服务
docker run
# 删除一个服务
docker kill xxx

2.3 Nvidia-docker

参考资料:

因为docker是虚拟在操作系统之上的,屏蔽了很多底层的信息。如果想使用显卡这种硬件,一种思路是docker直接把操作系统上的驱动程序和算法库映射到容器内,但是这样就丧失了可移植性。

另一种方法就是在docker启动的时候挂载一个类似驱动的插件——这就是nvidia-docker的作用。

总的来说,如果想要在docker中使用tensorflow-gpu,需要首先安装docker-ce(社区版,其他版本nvidia-docker不一定支持),然后安装nvidia-container-runtime,最后安装nvidia-docker2。

当使用的时候,需要直接指定nvidia-docker2运行, 如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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部署

主要参考:

首先安装docker-ce:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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需要删除掉:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
    "registry-mirrors":["https://registry.docker-cn.com","http://hub-mirror.c.163.com"]
}

然后重启docker配置服务systemctl restart docker.service

更新nvidia-docker地址:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

执行安装命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd

测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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底层动态库、硬件、容器等等相关的知识,虽然踩了不少坑,但是很多概念性的东西都得到了实践,这才是工作最大的意义。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-01-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
图解MySQL的语句执行流程
点评:该文章《【MySQL】MySQL安装》提供了一份详尽的MySQL在CentOS系统上的安装指南。文章首先指导用户检查系统中是否已安装MySQL或MariaDB,并提供了卸载旧版本的方法,确保了安装环境的干净。随后,文章详细阐述了如何配置MySQL的yum源,并通过yum包管理器安装MySQL社区版服务器,期间还贴心地提醒了可能遇到的秘钥过期问题及解决方案。
小白的大数据之旅
2024/11/26
1850
图解MySQL的语句执行流程
MySQL执行SQL语句过程详解
开发人员基本都知道,我们的数据存在数据库中(目前最多的是MySQL和Oracle,由于作者更擅长MySQL,所以这里默认数据库为MySQL),服务器通过sql语句将查询数据的请求传入到MySQL数据库。数据库拿到sql语句以后。都是进行了哪些操作呢?这里向大家介绍下我的个人的理解,欢迎大家评论区批评指正。
星哥玩云
2022/08/17
3.8K0
MySQL执行SQL语句过程详解
MySQL的逻辑架构--逻辑架构剖析、SQL执行流程、数据库缓冲池(buffer pool)
TCP连接收到请求后,必须分配给一个线程专门与这个客户端的交互,所以还有个线程池,每一个连接从线程池中获取线程,省去了创建和销毁线程的开销 所以连接管理的职责就是负责认证、管理连接、获取权限信息
才疏学浅的木子
2022/11/22
6990
MySQL的逻辑架构--逻辑架构剖析、SQL执行流程、数据库缓冲池(buffer pool)
麦斯蔻(MySQL)的一生
🐬 在一个遥远的数字王国里,MySQL是一位勤劳的数据库管家,负责管理和守护着庞大的数据宝库。每当有人向王国发出查询请求,就是麦斯蔻(MySQL)大显身手的时刻。
不惑
2024/05/14
4720
麦斯蔻(MySQL)的一生
Mysql语句的执行过程
当你希望MySQL能够以更高的性能运行查询时,最好的办法是弄清楚MySQL是如何优化和执行查询。《高性能MySQL》
_春华秋实
2018/08/17
2.7K0
Mysql语句的执行过程
MySQL探秘(二):SQL语句执行过程详解
 昔日庖丁解牛,未见全牛,所赖者是其对牛内部骨架结构的了解,对于MySQL亦是如此,只有更加全面地了解SQL语句执行的每个过程,才能更好的进行SQL的设计和优化。  当希望MySQL能够以更高的性能运行查询时,最好的办法就是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,很多查询优化工作实际上就是遵循一些原则能够按照预想的合理的方式运行。  如下图所示,当向MySQL发送一个请求的时候,MySQL到底做了什么:
程序员历小冰
2018/08/30
1.9K0
MySQL探秘(二):SQL语句执行过程详解
MySQL架构与执行流程
  MySQL数据库自己用了也有两三年了,基本上只是掌握增删改查的sql语句,从没有思考过MySQL的内部到底是怎么根据sql查询数据的,包括索引的原理,只知道加了索引查的就快,不知道为什么加上索引效率就会提升,包括索引的限制和优化也知之甚少,所以决定开一专题来学习与记录MySQL。
会说话的丶猫
2020/08/06
8500
MySQL架构与执行流程
MySQL执行流程
server层:连接器,查询缓存,解析器,预处理器,优化器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图,函数等,还有一个通用的日志模块 binglog日志模块。
阿珍
2024/12/12
2340
MySQL执行流程
从Mysql架构看一条查询sql的执行过程
首先,MySQL必须要运行一个服务,监听默认的3306端口。在我们开发系统跟第三方对接的时候,必须要弄清楚的有两件事。
架构狂人
2023/10/26
3350
从Mysql架构看一条查询sql的执行过程
浅谈MySQL的整体架构
由于换工作,找房子这一系列事情都推在了一起,所以最近停更了一个多月。现在所有的事情都已尘埃落定,我也可以安安静静的码字啦。
陈琛
2020/06/12
4360
浅谈MySQL的整体架构
【SQL】Mysql中一条sql语句的执行过程
先来看下MySQL的体系结构,下图是在MySQL官方网站上扒下来的,所以有很高的权威性和准确性。
人不走空
2024/03/01
6460
【SQL】Mysql中一条sql语句的执行过程
重生之MySQL SQL 执行的 7 大关键步骤,解锁新技能
我的名字是萧剑臣,一个 34 岁的普通人。2024 年接近尾声,浅圳这座钢铁森林依旧喧嚣。
码哥字节
2024/11/23
760
重生之MySQL SQL 执行的 7 大关键步骤,解锁新技能
MySQL原理简介—1.SQL的执行流程
如果Java系统要访问数据库,首先得与数据库建立一个网络连接。那么这个连接由谁来建立呢?其实就是由MySQL驱动来建立的,它会在底层与数据库建立网络连接。有了网络连接才能去发送请求给数据库服务器,如下图示:
东阳马生架构
2025/02/04
1380
一条SQL查询语句是如何执行的?
MySQL是典型的C/S架构(客户端/服务器架构),客户端进程向服务端进程发送一段文本(MySQL指令),服务器进程进行语句处理然后返回执行结果。
星哥玩云
2022/06/08
1.5K0
一条SQL查询语句是如何执行的?
一、 MySQL的起源
MySQL用了很久,但是一直也是工作的使用,对于MySQL的知识点都比较零散碎片,一直也没有整体梳理过,趁着最近不忙,梳理一下相关的知识点。
云扬四海
2022/09/26
8710
MySQL SQL的完整处理流程
客户端提交一条sql语句,先在查询缓存中查询,如果缓存没有命中,将会进行查表操作。查表的流程总结过为如下:
终有救赎
2023/11/18
2880
MySQL SQL的完整处理流程
面试官:你说说一条查询SQL的执行过程?| 文末送书
为了理解这个问题,先从Mysql的架构说起,对于Mysql来说,大致可以分为3层架构。
艾小仙
2021/08/25
5100
面试官:你说说一条查询SQL的执行过程?| 文末送书
mysql的三层体系结构
第2层sql处理层(SQL Layer):主要有SQL Interface、Parser、Optimizer、Cache和Buffer
Kami米雅
2021/12/10
1.2K0
MySQL架构与SQL执行流程
负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信, 接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等
Java学习录
2019/06/01
1.7K0
「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)
【mysql优化专题】:本专题全文围绕mysql优化进行全方位讲解,本篇为优化入门篇,让大家知道为什么要优化,究竟在优化什么。喜欢的朋友可以关注收藏。 优化,一直是面试最常问的一个问题。因为从优化的角
java进阶架构师
2018/08/15
3630
「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)
相关推荐
图解MySQL的语句执行流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验