本系列将利用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. linux操作系统清除报错Disk /dev/mapper/ddf1_4c53492....

    现象描述 Disk /dev/mapper/ddf1_4c5349202020202010000055000000004711471100000a28p1: 666.0 GB, 66600088934 ...

  2. jnhs-springmvc 请求组合不正确,比如请求路径出现两次

    初学springmvc 向后台传参数,结果发现,一直404 404后没有路径,说明 没有进入controller 仔细一看,请求路径不对,重复出现 页面是这样写的 页面是这样写的 原因是,请求链接和当 ...

  3. 基于LSTM对西储大学轴承故障进行分析

    这篇文章是小萌新对西储大学轴承故障进行分析,固定特征为故障直径为0.007,电机转速为1797,12k驱动端故障数据(Drive_End)即DE-time.故障类型y值:滚动体故障,内圈故障,3时,6 ...

  4. Linux巨好用的

    受不了了windows下配置烦死人.linux一站式搞定,无敌 安装python3 机子上py2 py3共存没问题 安装virtualenv (py3)分割实验环境非常稳 安装mysql 先安装了一 ...

  5. 阿里云杨敬宇:5G时代,边缘计算将发挥更大价值

    “5G时代,边缘计算将发挥更大价值.”3月8日,阿里云边缘计算技术负责人杨敬宇向媒体表示,边缘计算作为5G时代的一项关键技术,未来将成为不可或缺的基础设施之一. 5G时代万物智联将真正成为现实,但对计 ...

  6. spring boot 使用POI导出数据到Excel表格

    在spring boot 的项目经常碰到将数据导出到Excel表格的需求,而POI技术则对于java操作Excel表格提供了API,POI中对于多种类型的文档都提供了操作的接口,但是其对于Excel表 ...

  7. 学习笔记(2)---Matlab 图像处理相关函数命令大全

    Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ col ...

  8. IntelliJ IDEA添加过滤文件或目录(转)

    在idea上使用svn后,发现即使svn窗口添加过滤正则没有忽略.iml文件的提交,安装ignore插件后没发现有svn的忽略选项,最后发现这样设置就可以了: 1.Settings→Editor→Fi ...

  9. NOIP模拟 7.03

    Problem 1 抓牛(catchcow.cpp/c/pas) [题目描述] 农夫约翰被通知,他的一只奶牛逃逸了!所以他决定,马上出发,尽快把那只奶牛抓回来. 他们都站在数轴上.约翰在N(O≤N≤1 ...

  10. Function相关的小知识

      重载 相同函数名,不同参数列表的多个函数,在调用时可自动根据传入参数的不同,选择对应的函数执行.为什么使用重载:                   减轻API的名字,减轻调用者的负担.何时使用重 ...