利用阿里云容器服务打通TensorFlow持续训练链路
本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案
- 第一篇:打造TensorFlow的实验环境
- 第二篇:轻松搭建TensorFlow Serving集群
- 第三篇:打通TensorFlow持续训练链路
- 第四篇:利用Neural Style的TensorFlow实现,像梵高一样作画
- 第五篇:轻松搭建分布式TensorFlow训练集群(上)
本文是该系列中的第三篇文章, 将为您介绍如何利用阿里云的服务快速搭建TensorFlow从训练到服务的交付平台。
随着google开源TensorFlow的脚步越来越迅猛,机器学习已经渐渐由昔日王谢堂前燕,飞入寻常百姓家。如何把机器学习的成果,迅速转化成服务大众的产品。以TensorFlow为例,一个典型的交付流程,就是TensorFlow根据输入数据进行模型训练,待训练结束和验证确定后,模型会被发布到TensorFlow Serving,就可以为大众服务了。如果能像流水线生产一辆汽车一样来实现机器学习的产品化,听起来是不是让人激动不已?
但是理想很丰满,现实很骨感,一个完整可用的机器学习生产线并不是只有TensorFlow和TensorFlow Serving就够用的,如果希望这个过程更加高效和自动化,它还需要在一些基础架构层面的支持,比如:
机器学习过程中从系统到应用的监控,其中包括
- 整体计算资源特别是GPU的使用情况:使用率,内存,温度
- 每个机器学习应用的具体使用资源情况
- 机器学习过程的可视化
快速高效的问题诊断
通过集中化日志的管理控制台进行轻松的一站式问题诊断一键式的失败恢复
- 从失败节点调度到可用节点
- 分布式存储保存计算中的checkpoint,可以随时在其它节点继续学习任务
模型的持续改进和发布
- 利用分布式存储将模型无缝迁入生产环境
- 蓝绿发布
- 模型回滚
下面我们就展示一下利用阿里云容器服务快速的搭建一套从模型学习到发布的过程,这会是个逐步迭代不断优化的方案.我们后面的文章会不断迭代优化这一方案,希望容器服务在应用交付和运维方面的经验帮助数据科学家们专注于机器学习价值本身,进而提供最大的价值。目前我们的方案运行在CPU机器上,未来待HPC与容器服务的集成完成后,这个方案非常容易迁移到HPC容器集群。
机器学习生产线的搭建
前期准备
- 创建阿里云容器服务,参考https://yq.aliyun.com/articles/3054
- 创建OSS数据卷,这个具体步骤可以参考文章https://yq.aliyun.com/articles/7581
- 创建阿里云日志服务,具体步骤可以参考https://yq.aliyun.com/articles/9068
有了这些服务,我们就可以在阿里云容器服务上和机器学习愉快的玩耍了,我们使用的例子是机器学习界的Helloworld --- MNIST
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:
它也包含每一张图片对应的标签,说明这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1
- 首先确认OSS数据卷
mnist_model
被创建出来了, 并且要在mnist_model
创建Minst_data
文件夹,并下载所需的训练集与测试集数据
文件 | 内容 |
---|---|
train-images-idx3-ubyte.gz | 训练集图片 - 55000 张 训练图片, 5000 张 验证图片 |
train-labels-idx1-ubyte.gz | 训练集图片对应的数字标签 |
t10k-images-idx3-ubyte.gz | 测试集图片 - 10000 张 图片 |
t10k-labels-idx1-ubyte.gz | 测试集图片对应的数字标签 |
2. 用如下的docker-compose模板在阿里云上一键部署TensorFlow Learning的环境,
version: '2'
services:
tensor:
image: registry-vpc.cn-hangzhou.aliyuncs.com/cheyang/mnist-export
command:
- "python"
- "/mnist_export.py"
- "--training_iteration=${TRAIN_STEPS}"
- "--export_version=${VERSION}"
- "--work_dir=/mnist_export/Minst_data"
- "/mnist_export/mnist_model"
volumes:
- mnist_model:/mnist_export
labels:
- aliyun.log_store_mnist=stdout
environment:
- CUDA_VISIBLE_DEVICES=-1
注:
aliyun.log_store_mnist
指示会把日志导入到阿里云的日志服务中,在这里默认是从stdout导入Volumes使用的就是容器服务的OSS数据卷
由于我们的测试环境是搭建在VPC环境,所以使用的docker image都是需要访问阿里云的vpc registry
在阿里容器服务中创建应用时,就会弹出对话框,里面需要输入的是模型版本
和训练参数
,我们输入的模型版本为1和训练参数为100
有了aliyun.log_store_mnist
,就可以在阿里云的日志服务中看到整个学习过程, 方便问题的分析和诊断
当学习任务完成后,可以登录到服务器上看到学习出来的模型
sh-4.2# cd /mnist/model/
sh-4.2# ls
00000001
3. 现在需要做的事情就是启动一个TensorFlow Serving把学习出来的模型发布到生产环境,这里提供如下的docker-compose模板
version: '2'
services:
serving:
image: registry-vpc.cn-hangzhou.aliyuncs.com/denverdino/tensorFlow-serving
command:
- "/serving/bazel-bin/tensorFlow_serving/model_servers/tensorFlow_model_server"
- "--enable_batching"
- "--port=9000"
- "--model_name=mnist"
- "--model_base_path=/mnist_model"
volumes:
- mnist_model:/mnist_model
labels:
- aliyun.log_store_serving=stdout
ports:
- "9000:9000"
environment:
- CUDA_VISIBLE_DEVICES=-1
注:
这里TensorFlow Serving和TensorFlow Learning通过分布式存储共享学习模型(这里用的是OSS,其实更换成NAS数据卷也是非常容易的)
4. 可以在日志服务中直接查看一下TensorFlow Serving的日志,发现版本1的模型已经加载到了serving中了
同时需要查看一下该服务的Endpoint,在这里TensorFlow Serving的Endpoint是10.24.2.11:9000
。当然我们还可以将服务发布到SLB上,这在文章利用Docker和阿里云容器服务轻松搭建TensorFlow Serving集群中已经有了比较详细的描述,就不在本文中赘述了。
5. 为了验证TensorFlow Serving,需要部署一个测试的客户端,下面是测试客户端的docker-compose模板
version: '2'
services:
tensor:
image: registry-vpc.cn-hangzhou.aliyuncs.com/denverdino/tensorFlow-serving
command:
- "/serving/bazel-bin/tensorFlow_serving/example/mnist_client"
- "--num_tests=${NUM_TESTS}"
- "--server=${SERVER}"
- "--concurrency=${CONCURRENCY}"
创建应用的时候就会需要输入测试次数NUM_TESTS
,TensorFlow Serving的EndpointSERVER
,以及并发访问量CONCURRENCY
当应用创建完成后,可以看到运行结果如下,我们发现这时候的错误率是13.5
serving-client_tensor_1 | 2016-10-11T12:46:59.314358735Z D1011 12:46:59.314217522 5 ev_posix.c:101] Using polling engine: poll
serving-client_tensor_1 | 2016-10-11T12:47:03.324604352Z ('Extracting', '/tmp/train-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:03.324652816Z ('Extracting', '/tmp/train-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:03.324658399Z ('Extracting', '/tmp/t10k-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:03.324661869Z ('Extracting', '/tmp/t10k-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T12:47:04.326217612Z ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
serving-client_tensor_1 | 2016-10-11T12:47:04.326256766Z Inference error rate: 13.5%
serving-client_tensor_1 | 2016-10-11T12:47:04.326549709Z E1011 12:47:04.326484533 69 chttp2_transport.c:1810] close_transport: {"created":"@1476190024.326451541","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}
6. 为了提升识别效果,就需要调整参数重新运行一次TensorFlow Learning应用重新发起一次训练.可以直接在容器云服务的页面点击变更配置
这时会弹出对话框,里面需要输入的是模型版本
和训练参数
,我们输入的模型版本为2和训练参数为2000
当学习完成后,再次查看NAS服务器,发现多了一个新的模型
sh-4.2# pwd
/mnist/model/
sh-4.2# ls
00000001 00000002
而这个时候查看TensorFlow Serving的日志,就会发现模型已经更新到了版本2
此时重新运行测试客户端,可以发现错误率降低到8.5%,看到新的模型在识别能力上有一定的提升
serving-client_tensor_1 | 2016-10-11T16:54:34.926822231Z D1011 16:54:34.926731204 5 ev_posix.c:101] Using polling engine: poll
serving-client_tensor_1 | 2016-10-11T16:54:37.984891512Z ('Extracting', '/tmp/train-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:37.984925589Z ('Extracting', '/tmp/train-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:37.984930097Z ('Extracting', '/tmp/t10k-images-idx3-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:37.984933659Z ('Extracting', '/tmp/t10k-labels-idx1-ubyte.gz')
serving-client_tensor_1 | 2016-10-11T16:54:39.038214498Z ........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
serving-client_tensor_1 | 2016-10-11T16:54:39.038254350Z Inference error rate: 8.5%
serving-client_tensor_1 | 2016-10-11T16:54:39.038533016Z E1011 16:54:39.038481361 68 chttp2_transport.c:1810] close_transport: {"created":"@1476204879.038447737","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}
PS:整个工作流程中,我们并没有SSH登录到任何主机上,完全是在容器服务管理平台上操作的。
总结
这仅仅是一个开始,TensorFlow和TensorFlow Serving也仅仅是一个描述阿里云容器服务对于高性能计算支持的一个例子,在本节中,我们通过OSS实现了从把学习出的模型交付到对外服务,并且实现了模型的迭代,同时又利用日志服务一站式查看容器工作日志。这种方式只是实现了最基本的持续学习持续改善的概念,在生产环境还需要更加严格的验证和发布流程,我们将在未来文章中,介绍我们的方法和实践。
阿里云容器服务还会和高性能计算(HPC)团队一起配合,之后在阿里云上提供结合GPU加速和Docker集群管理的机器学习解决方案,在云端提升机器学习的效能。
想了解更多容器服务内容,请访问https://www.aliyun.com/product/containerservice
本文作者:必嘫
本文为云栖社区原创内容,未经允许不得转载。
利用阿里云容器服务打通TensorFlow持续训练链路的更多相关文章
- 阿里云容器服务--配置自定义路由服务应对DDOS攻击
阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...
- 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...
- 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用
本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...
- 阿里云容器服务中国最佳,进入 Forrester 报告强劲表现者象限
近日,全球知名市场调研机构 Forrester 发布首个企业级公共云容器平台报告. 报告显示:阿里云容器服务创造了中国企业最好成绩,与谷歌云位于同一水平线,进入强劲表现者象限. 究其原因,分析师认为: ...
- 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序
小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...
- 阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json
这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json ...
- 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署
部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...
- 品尝阿里云容器服务:用nginx镜像创建容器,体验基于域名的路由机制
在前一篇博文中我们了解了阿里云容器服务的路由机制: 请求 -> 负载均衡80端口 -> 容器主机9080端口 -> acsrouting路由容器80端口 --基于域名--> W ...
- Knative 应用在阿里云容器服务上的最佳实践
作者|元毅 阿里云智能事业群高级开发工程师 相信通过前面几个章节的内容,大家对 Knative 有了初步的体感,那么在云原生时代如何在云上玩转 Knative?本篇内容就给你带来了 Knative 应 ...
随机推荐
- Web三大组件之控制器组件Servlet(转载)
Servlet:主要用于处理客户端传来的请求,并返回响应.获取请求数据>处理请求>完成响应 过程:客户端发送请求----HTTP服务器接收请求,HTTP服务器只负责解析静态HTML界面,其 ...
- Python基础-列表、元组、字典、字符串
Python基础-列表.元组.字典.字符串 多维数组 nums1 = [1,2,3] #一维数组 nums2 = [1,2,3,[4,56]] #二维数组 nums3 = [1,2,3,4,['a ...
- git之操作准则
每天下班前合一次代码,每次合代码先pull 不要多人同时修改同一个文件,避免冲突 在每个人自己的分支进行开发,先合并到dev分支解决冲突,确认无冲突后再合并到master
- bzoj2049: [Sdoi2008]Cave 洞穴探测
bzoj2049: [Sdoi2008]Cave 洞穴探测 给n个点,每次连接两个点或切断一条边,保证是树结构,多次询问两个点是否联通 Lct裸题 //Achen #include<algori ...
- MyEclipse编写ExtJS卡死问题解决方法
MyEclipse 8.6 在 jsp 中编写 ExtJS时,会出现卡死现象,让人甚是头疼.网上找了很多方法,折腾半天,还是不管用. 什么MyEclipse 优化,Validation 取消,MyE ...
- golang 命令行参数
package main import ( "fmt" "flag" ) func main() { //定义几个变量,用于接收命令行的参数值 var user ...
- 【JZOJ3601】【广州市选2014】Tree(tree)
╰( ̄▽ ̄)╭ 每个非叶子节点,其左右子树叶子节点的权值之和相等.我们称这种二叉树叫平衡二叉树. 我们将一棵平衡二叉树叶子节点的权值从左到右列出来,假如这个权值序列是另一个序列A的子序列,我们称这棵平 ...
- opencv2.4.9配置+VS2013
参见:浅墨的(红的的为变动部分) http://blog.csdn.net/poem_qianmo/article/details/19809337 本系列文章由@浅墨_毛星云 出品,转载请注明出处. ...
- 为Array对象添加一个去除重复项的方法
输入例子 [false, true, undefined, null, NaN, 0, 1, {}, {}, 'a', 'a', NaN].uniq() 输出例子 [false, true, unde ...
- UWP获取任意网页加载完成后的HTML
主要思想:通过后台WebView载入指定网页,再提取出WebView中的内容 关键代码: var html = await webView.InvokeScriptAsync("eval&q ...