本系列将利用Docker和阿里云容器服务,帮助您上手TensorFlow的机器学习方案

本文是该系列中的第三篇文章, 将为您介绍如何利用阿里云的服务快速搭建TensorFlow从训练到服务的交付平台。

随着google开源TensorFlow的脚步越来越迅猛,机器学习已经渐渐由昔日王谢堂前燕,飞入寻常百姓家。如何把机器学习的成果,迅速转化成服务大众的产品。以TensorFlow为例,一个典型的交付流程,就是TensorFlow根据输入数据进行模型训练,待训练结束和验证确定后,模型会被发布到TensorFlow Serving,就可以为大众服务了。如果能像流水线生产一辆汽车一样来实现机器学习的产品化,听起来是不是让人激动不已?

但是理想很丰满,现实很骨感,一个完整可用的机器学习生产线并不是只有TensorFlow和TensorFlow Serving就够用的,如果希望这个过程更加高效和自动化,它还需要在一些基础架构层面的支持,比如:

  1. 机器学习过程中从系统到应用的监控,其中包括

    1. 整体计算资源特别是GPU的使用情况:使用率,内存,温度
    2. 每个机器学习应用的具体使用资源情况
    3. 机器学习过程的可视化
  2. 快速高效的问题诊断
    通过集中化日志的管理控制台进行轻松的一站式问题诊断

  3. 一键式的失败恢复

    1. 从失败节点调度到可用节点
    2. 分布式存储保存计算中的checkpoint,可以随时在其它节点继续学习任务
  4. 模型的持续改进和发布

    1. 利用分布式存储将模型无缝迁入生产环境
    2. 蓝绿发布
    3. 模型回滚

下面我们就展示一下利用阿里云容器服务快速的搭建一套从模型学习到发布的过程,这会是个逐步迭代不断优化的方案.我们后面的文章会不断迭代优化这一方案,希望容器服务在应用交付和运维方面的经验帮助数据科学家们专注于机器学习价值本身,进而提供最大的价值。目前我们的方案运行在CPU机器上,未来待HPC与容器服务的集成完成后,这个方案非常容易迁移到HPC容器集群。

机器学习生产线的搭建

前期准备

  1. 创建阿里云容器服务,参考https://yq.aliyun.com/articles/3054
  2. 创建OSS数据卷,这个具体步骤可以参考文章https://yq.aliyun.com/articles/7581
  3. 创建阿里云日志服务,具体步骤可以参考https://yq.aliyun.com/articles/9068

有了这些服务,我们就可以在阿里云容器服务上和机器学习愉快的玩耍了,我们使用的例子是机器学习界的Helloworld --- MNIST

MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:

它也包含每一张图片对应的标签,说明这个是数字几。比如,上面这四张图片的标签分别是5,0,4,1

  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持续训练链路的更多相关文章

  1. 阿里云容器服务--配置自定义路由服务应对DDOS攻击

    阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...

  2. 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1

    摘要: 全球开源区块链领域影响最为广泛的Hyperledger Fabric日前宣布了1.1版本的正式发布,带来了一系列丰富的新功能以及在安全性.性能与扩展性等方面的显著提升.阿里云容器服务区块链解决 ...

  3. 在阿里云容器服务上开发基于Docker的Spring Cloud微服务应用

    本文为阿里云容器服务Spring Cloud应用开发系列文章的第一篇. 一.在阿里云容器服务上开发Spring Cloud微服务应用(本文) 二.部署Spring Cloud应用示例 三.服务发现 四 ...

  4. 阿里云容器服务中国最佳,进入 Forrester 报告强劲表现者象限

    近日,全球知名市场调研机构 Forrester 发布首个企业级公共云容器平台报告. 报告显示:阿里云容器服务创造了中国企业最好成绩,与谷歌云位于同一水平线,进入强劲表现者象限. 究其原因,分析师认为: ...

  5. 基于阿里云容器服务用docker容器运行ASP.NET 5示例程序

    小试阿里云容器服务 之后,接下来有一个挡不住的小试冲动--用docker容器运行程序.首先想到的程序是 ASP.NET 5示例程序,于是参考msdn博客中的这篇博文 Running ASP.NET 5 ...

  6. 阿里云容器服务与ASP.NET Core部署:用 docker secrets 保存 appsettings.Production.json

    这是我们使用阿里云容器服务基于 docker 容器部署 asp.net core 应用遇到的另一个问题 —— 如果将包含敏感信息的应用配置文件 appsettings.Production.json ...

  7. 品尝阿里云容器服务:初步尝试ASP.NET Core Web API站点的Docker自动化部署

    部署场景是这样的,我们基于 ASP.NET Core 2.0 Preview 1 开发了一个用于管理缓存的 Web API ,想通过阿里云容器服务基于 Docker 部署为内网服务. 在这篇博文中分享 ...

  8. 品尝阿里云容器服务:用nginx镜像创建容器,体验基于域名的路由机制

    在前一篇博文中我们了解了阿里云容器服务的路由机制: 请求 -> 负载均衡80端口 -> 容器主机9080端口 -> acsrouting路由容器80端口 --基于域名--> W ...

  9. Knative 应用在阿里云容器服务上的最佳实践

    作者|元毅 阿里云智能事业群高级开发工程师 相信通过前面几个章节的内容,大家对 Knative 有了初步的体感,那么在云原生时代如何在云上玩转 Knative?本篇内容就给你带来了 Knative 应 ...

随机推荐

  1. 利用HttpWebRequest通过POST Json数据在.net后台实现不同平台间的数据传输

    /// <summary> /// 返回JSon数据 /// </summary> /// <param name="JSONData">要处理 ...

  2. CI框架--URL路径跳转与传值

    CI框架使用URL的前提是需要加载辅助函数$this->load->helper('url');当然我建议大家将所有需要加载的东西写在构造方法内,这样就不需每个控制器每个方法都去调用一次了 ...

  3. Javascript模块化编程(一)模块的写法最佳实践

    Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块但是,Javascript不是一种模块化编程语言,它不支持类clas ...

  4. hdoj 1325 Is It A Tree? 【并查集】

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shengweisong/article/details/34099151 做了一上午,最终ac了 w ...

  5. Leetcode77. Combinations组合

    给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合. 示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3] ...

  6. 第十章—DOM(二)——Element类型

    Element类型用于表现HTML和XML,提供了对元素标签名,子节点和特效的访问.Element节点具有以下特征: 要访问元素的标签名,可以使用nodeName属性,也可以使用tagName属性.这 ...

  7. _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/f8995a0e1afcdadc637612fae5a3b585.php

    将one think部署到服务器上出现下面的问题 _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/f8995a0e1afcdadc6376 ...

  8. 【JZOJ3299】【SDOI2013】保护出题人 三分+凸壳

    题面 ​出题人铭铭认为给SDOI2012 出题太可怕了,因为总要被骂,于是他又给SDOI2013 出题了. 参加SDOI2012 的小朋友们释放出大量的僵尸,企图攻击铭铭的家.而你作为SDOI2013 ...

  9. bnd.bnd属性文件格式

    1.Header以大写字母开头 Bundle-Name: StoreAdminProductsTool 2.Instruction以-和小写字母开头 -sources: true 3. Macro形式 ...

  10. PAT天梯赛L1-002 打印漏斗

    题目链接:点击打开链接 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个"*",要求按下列格式打印 ***** *** * *** ***** 所谓"沙漏形 ...