利用Docker和阿里云容器服务轻松搭建TensorFlow Serving集群

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文是系列中的第二篇文章,将带您快速了解Tensorflow Serving的原理和使用,并利用阿里云容器服务轻松在云端搭建TensorFlow Serving集群。
+关注继续查看

screenshot

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

本文是系列中的第二篇文章,将带您快速了解Tensorflow Serving的原理和使用,并利用阿里云容器服务轻松在云端搭建TensorFlow Serving集群。如果您需要学习TensorFlow请参考基于Docker的TensorFlow实验环境

TensorFlow Serving是Google开源的一个灵活的、高性能的机器学习模型服务系统,能够简化并加速从模型到生产应用的过程。它除了原生支持TensorFlow模型,还可以扩展支持其他类型的机器学习模型。

TensorFlow Serving的典型的流程如下:学习者(Learner,比如TensorFlow)根据输入数据进行模型训练。等模型训练完成、验证之后,模型会被发布到TensorFlow Serving系统服务器端。客户端提交请求,由服务端返回预测结果。客户端和服务端之间的通信采用的是RPC协议。

14745426285143
原图来自于 First Contact With TensorFlow

本机运行TensorFlow Serving示例

TensorFlow Serving也提供了Docker的方式来安装或使用,但是目前并没有提供官方镜像或者提供Dockerfile来进行自动构建。现在需要通过手工方式来构建TensorFlow Serving镜像。

为了简化部署,我提供了两个预构建的TensorFlow Serving的示例镜像来进行测试。

  • registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow-serving : TensorFlow Serving的基础镜像
  • registry.cn-hangzhou.aliyuncs.com/denverdino/inception-serving : 基于上述基础镜像添加Inception模型实现的服务镜像

我们利用Docker命令启动名为 “inception-serving” 容器作为TF Serving服务器

docker run -d --name inception-serving registry.cn-hangzhou.aliyuncs.com/denverdino/inception-serving

之后利用Docker命令以交互式方式启动 “tensorflow-serving” 镜像作为客户端,并定义容器link,允许在容器内部通过“serving”别名来访问“inception-serving”容器

docker run -ti --name client --link inception-serving:serving registry.cn-hangzhou.aliyuncs.com/denverdino/tensorflow-serving

在客户端容器,我们执行下面的脚本,可以方便地利用“inception-serving”服务来进行图像识别。

# persian cat
curl http://f.hiphotos.baidu.com/baike/w%3D268%3Bg%3D0/sign=6268660aafec8a13141a50e6cf38f6b2/32fa828ba61ea8d3c85b36e1910a304e241f58dd.jpg -o persian_cat_image.jpg

/serving/bazel-bin/tensorflow_serving/example/inception_client --server=serving:9000 --image=$PWD/persian_cat_image.jpg

# garfield cat
curl http://a2.att.hudong.com/60/11/01300000010387125853110118750_s.jpg -o garfield_image.jpg

/serving/bazel-bin/tensorflow_serving/example/inception_client --server=serving:9000 --image=$PWD/garfield_image.jpg

注:客户端代码 inception_client.py 通过"serving:9000"访问"inception-serving"容器提供的gRPC服务

Inception模型可以方便地把我们的猫咪正确分类
14745567973719

一个TensorFlow Serving服务节点的计算能力是有限的,在生产环境使用需要利用一个集群实现负载均衡和高可用。TensorFlow目前提供一个基于Kubernetes的集群部署原型,也在提供对其他容器编排技术的支持。

利用容器服务部署TensorFlow Serving分布式集群

阿里云容器服务提供了简单而强大的容器编排能力,可以方便地在云端部署和管理 TensorFlow Serving 集群,并利用阿里云SLB进行负载均衡。

我们可以用如下的docker-compose模板在阿里云上一键部署Serving分布式集群

version: '2'
services:
  serving:
    image: registry.cn-hangzhou.aliyuncs.com/denverdino/inception-serving
    ports:
      - 9000:9000
    labels: 
      aliyun.scale: "3"
      aliyun.lb.port_9000: tcp://inception-serving:9000

注:阿里云的扩展标签如下

  • aliyun.scale 指明需要3个容器实例提供 serving 服务
  • aliyun.lb.port_9000 指明通过名为"inception-serving"的SLB为容器的9000服务端口提供负载均衡

首先,我们需要创建一个负载均衡实例,然后编辑名称设置为"inception-serving"

14745535147047

然后添加监听端口TCP/9000,对应后端端口9000,如下

14745534583309

几分钟之后编排模板部署完毕,每个“serving”容器在宿主机上暴露了9000端口,相应节点被容器服务自动绑定到"inception-serving" SLB作为后端服务器。

14745545864179

我们可以从刚才本机创建的client容器中执行下面的命令将预测请求发送给阿里云上的云服务器,注:请将其中gRPC服务器地址换为负载均衡实例的地址。

/serving/bazel-bin/tensorflow_serving/example/inception_client --server=<SLB_IP>:9000 --image=$PWD/garfield_image.jpg

执行结果如下

D0922 14:31:39.463336540      31 ev_posix.c:101]             Using polling engine: poll
outputs {
  key: "classes"
  value {
    dtype: DT_STRING
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 5
      }
    }
    string_val: "tabby, tabby cat"
    string_val: "Egyptian cat"
    string_val: "tiger cat"
    string_val: "Persian cat"
    string_val: "lynx, catamount"
  }
}
outputs {
  key: "scores"
  value {
    dtype: DT_FLOAT
    tensor_shape {
      dim {
        size: 1
      }
      dim {
        size: 5
      }
    }
    float_val: 8.45185947418
    float_val: 7.37638807297
    float_val: 7.24321079254
    float_val: 7.21496248245
    float_val: 4.0578494072
  }
}

E0922 14:31:41.027554353      31 chttp2_transport.c:1810]    close_transport: {"created":"@1474554701.027514401","description":"FD shutdown","file":"src/core/lib/iomgr/ev_poll_posix.c","file_line":427}

我们的加菲猫就妥妥地被识别出来了。

总结

利用阿里云容器服务我们可以在云端快速测试、部署深度学习应用,让机器学习不再高冷。阿里云为机器学习提供了丰富的基础设施,从弹性计算、负责均衡到对象存储,日志、监控等等。容器服务可以优雅地将这些能力整合起来,释放深度学习应用的威力。

同时TensorFlow Serving 非常适于持续训练和基于真实数据动态调整的多重模型,可以和阿里云容器服务的DevOps能力结合起来将简化和模型优化的测试发布流程。

阿里云容器服务还会和高性能计算(HPC)团队一起配合,之后在阿里云上提供结合GPU加速和Docker集群管理的机器学习解决方案,在云端进一步提升机器学习的效能。

想了解更多容器服务内容,请访问 https://www.aliyun.com/product/containerservice

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
19天前
|
前端开发 应用服务中间件 nginx
用docker和nginx部署前端项目访问本地java网关gateway服务
本地开发 java 微服务项目,但是拿到的对应的web前端项目只有打包编译过后的 dist 目录里的静态资源(里面只有一个index.html和一些编译过后的 js、css文件),前端接口需要先访问到 java 的网关服务,然后网关里再做转发
40 1
|
27天前
|
Linux Docker 容器
suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务
suse 12 二进制部署 Kubernetets 1.19.7 - 第04章 - 部署docker服务
16 0
|
2月前
|
弹性计算 Docker 容器
华为云ECS服务器安装docker服务
华为云ECS服务器安装docker服务
111 0
|
2月前
|
关系型数据库 Nacos 数据库
如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程
如何使用Docker部署Nacos服务?Nacos Docker 快速部署指南: 一站式部署与配置教程
86 1
|
2月前
|
Java Linux 开发者
服务搭建篇(十一) 容器引擎Docker的部署及介绍
Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
50 0
|
3月前
|
运维 网络协议 调度
docker swarm 集群服务编排部署指南(docker stack)
docker swarm 集群服务编排部署指南(docker stack)
|
3月前
|
Kubernetes 调度 Docker
容器 & 服务:K8s 与 Docker 应用集群 (二)
本篇介绍了kubernete的关键概念:pods 和 工作节点,描述了大概的架构和运行时结构。然后,基于上一篇的基础,重新使用k8s的kubectl命令部署我们自己的demo应用,并分析解决过程中遇到的问题。下一张将会进一步阐述原理,并对demo进行丰富。
125 0
|
3月前
|
Kubernetes 负载均衡 jenkins
容器 & 服务:K8s与Docker应用集群 (一)
在容器 & 服务:Docker 应用的 Jenkins 构建 (二)中,我们了解了在jenkins中,使用compose等工具构建发布的方法。在这里,已经初步有了一点集群的影子(备份,监控及切换),但毕竟还不是多节点同时对外提供服务,例如zuul、nginx等负载对外提供负载均衡(网关)服务,来支持后面的多应用实例共同对外提供服务。本章将会对这点进行探索。
132 0
|
3月前
|
jenkins Java 持续交付
容器 & 服务:Jenkins本地及docker安装部署
jenkins是常用的开源持续继承工具,现在所在的工作场景,也是使用jenkins进行基于github代码的拉取、打包、构建、部署的一系列流程,并结合了容器和函数计算实现金丝雀部署。本文先从基础的jenkins环境搭建开始。
104 0
|
4月前
|
Ubuntu Shell 网络安全
相关产品
容器镜像服务
容器服务Kubernetes版
推荐文章
更多