作者: Jiaming Song, Dongjie Shi, Gong, Qiyuan, Lei Xia, Wei Du, Jason Dai

随着深度学习项目从实验到生产的发展,越来越多的应用需要对深度学习模型进行大规模和实时的分布式推理服务。虽然已经有一些工具可用于相关任务(如模型优化、服务、集群调度、工作流管理等等),但对于许多深度学习的工程师和科学家来说,开发和部署能够透明地扩展到大型集群的分布式推理工作流仍然是一个具有挑战性的过程。

为了应对这一挑战,我们在Analytics Zoo 0.7.0版本中发布了Cluster Serving的支持。Analytics Zoo Cluster Serving是一个轻量级、分布式、实时的模型服务解决方案,支持多种深度学习模型(例如TensorFlow*、PyTorch*、Caffe*、BigDL和OpenVINO™的模型)。它提供了一个简单的pub/sub API(发布/订阅),用户可以轻松地将他们的推理请求发送到输入队列(使用一个简单的Python API)。然后,Cluster Serving将使用分布式流框架(如Apache Spark* Streaming、Apache Flink*等等)在大型集群中进行实时模型推理和自动扩展规模。Analytics Zoo Cluster Serving的总体架构如图1所示。

图1   Analytics Zoo Cluster Serving 解决方案总体框架

Cluster Serving的工作原理

你可以按照下面的三个简单步骤使用Cluster Serving解决方案(如图2所示)。

图2   使用Analytics  Zoo Cluster Serving解决方案的步骤

1、 在本地节点安装和准备Cluster Serving环境

  • 将已经完成训练的模型复制到本地节点。当前支持的模型包括TensorFlow、PyTorch、Caffe、BigDL和OpenVINO的模型。
  • 在本地节点上安装Analytics Zoo(例如使用单个pip Install命令即可完成)
  • 在本地节点上配置集群服务器,包括模型的文件路径和集群地址(如Apache Hadoop*YARN集群、Spark集群、Kubernetes*集群等)

请注意这一点,Cluster Serving解决方案只需要部署在本地节点上,集群(YARN或者Kubernetes)并不需要做任何改动。

2、 启动Cluster Serving服务

通过在本地节点上运行startup script脚本启动Cluster Serving服务,例如:

start-cluster-serving.sh 

在后台,Cluster Serving将自动部署训练好的模型,并以分布式的方式跨集群服务于模型推理请求。您可以使用TensorBoard*监测其运行时状态(例如推理吞吐量)。

3、 分布式实时(流式)推理

Cluster Serving提供了一个简单的pub/sub API(发布/订阅),你可以使用这个简单的Python API将推理请求轻松地发送到输入队列(当前使用的是Redis* Streams),例如:

input = InputQueue()
input.enqueue_image(id, image)

然后,Cluster Serving将从Redis* Streams读取请求,使用Spark Streaming或Flink跨集群运行分布式实时推理,并通过Redis返回结果。最后,您可以再次使用这个简单的Python API获得推理结果,例如:

output = OutputQueue()
results = output.dequeue()

快速入门示例

你也可以通过运行Analytics Zoo 0.7.0版本中提供的快速入门示例来尝试使用Cluster Serving。快速入门示例包含了使用Cluster Serving运行分布式推理流程所需的所有组件,首次使用它的用户能够在几分钟内启动并运行。快速入门示例包含:

  • 一个Analytics Zoo Cluster Serving的Docker Image (已安装所有依赖)
  • 一个示例配置文件
  • 一个训练好的TensorFlow模型,以及推理样本数据
  • 一个示例Python客户端程序

按照下面的步骤运行快速入门示例。有关详细说明,请参阅Analytics Zoo Cluster Serving编程指南

1、 启动 Analytics Zoo docker

#docker run -itd --name cluster-serving --net=host intelanalytics/zoo-cluster-serving:0.7. bash

2、 登录container并转到我们准备好的工作目录

#docker exec -it cluster-serving bash
#cd cluster-serving

3、 在container内启动Cluster Serving

#cluster-serving-start

4、 运行Python客户端程序,开始推理

#python quick_start.py

以下推理结果应该出现在你本地终端显示上:

image: fish1.jpeg, classification-result: class: 's prob: 0.9974158
image: cat1.jpeg, classification-result: class: 287's prob: 0.52377725
image: dog1.jpeg, classification-result: class: 's prob: 0.9226527

如果你希望构建和部署定制的Cluster Serving流程,可以从修改快速入门示例中提供的示例配置文件和示例Python程序开始。下面是这些文件的大致结构,仅供参考。有关更多详细信息,请参阅 Cluster Serving编程指南

配置文件(config.yaml)如下所示:

## Analytics Zoo Cluster Serving Config Example
model:
# model path must be set
path: /opt/work/model
data:
# default, localhost:
src:
# default, ,,
image_shape:
params:
# default,
batch_size:
# default,
top_n:
spark:
# default, local[*], change this to spark://, yarn, k8s:// etc if you want to run on cluster
master: local[*]
# default, 4g
driver_memory:
# default, 1g
executor_memory:
# default,
num_executors:
# default,
executor_cores:
# default,
total_executor_cores:

Python程序(quick_start.py)如下所示:

from zoo.serving.client import InputQueue, OutputQueue
import os
import cv2
import json
import time if __name__ == "__main__":
input_api = InputQueue()
base_path = "../../test/zoo/resources/serving_quick_start"
if not base_path:
raise EOFError("You have to set your image path")
output_api = OutputQueue()
output_api.dequeue()
path = os.listdir(base_path)
for p in path:
if not p.endswith("jpeg"):
continue
img = cv2.imread(os.path.join(base_path, p))
img = cv2.resize(img, (224, 224))
input_api.enqueue_image(p, img)
time.sleep(5)
# get all results and dequeue
result = output_api.dequeue()
for k in result.keys():
output = "image: " + k + ", classification-result:"
tmp_dict = json.loads(result[k])
for class_idx in tmp_dict.keys():
output += "class: " + class_idx + "'s prob: " + tmp_dict[class_idx]
print(output)

结论

我们很高兴与您分享Analytics Zoo 0.7.0版本中提供的这种新的群集模型服务支持,并希望此解决方案有助于简化您的分布式推理工作流并提高您的工作效率。我们很乐意在GitHub和邮件列表上听到您的问题和反馈。我们将持续对Analytics Zoo进行开发工作,构建统一数据分析和人工智能平台,敬请期待更多关于Analytics Zoo的信息。

Analytics Zoo Cluster Serving自动扩展分布式推理的更多相关文章

  1. 基于Spark自动扩展scikit-learn (spark-sklearn)(转载)

    转载自:https://blog.csdn.net/sunbow0/article/details/50848719 1.基于Spark自动扩展scikit-learn(spark-sklearn)1 ...

  2. OpenStack 企业私有云的若干需求(2):自动扩展(Auto-scaling) 支持

    本系列会介绍OpenStack 企业私有云的几个需求: 自动扩展(Auto-scaling)支持 多租户和租户隔离 (multi-tenancy and tenancy isolation) 混合云( ...

  3. 在ScrollView下加入的组件,不能自动扩展到屏幕高度

    ScrollView中的组件设置android:layout_height="fill_parent"不起作用的解决办法 在ScrollView中添加一个android:fillV ...

  4. 采用Asp.Net的Forms身份验证时,持久Cookie的过期时间会自动扩展

    原文:http://www.cnblogs.com/sanshi/archive/2012/06/22/2558476.html 若是持久Cookie,Cookie的有效期Expiration属性有当 ...

  5. 采用Asp.Net的Forms身份验证时,非持久Cookie的过期时间会自动扩展

    问题描述 之前没有使用Forms身份验证时,如果在登陆过程中把HttpOnly的Cookie过期时间设为半个小时,总会收到很多用户的抱怨,说登陆一会就过期了. 所以总是会把Cookie过期时间设的长一 ...

  6. ORA-01653:表空间扩展失败的问题(开启表空间自动扩展)

    ----查询表空间使用情况---使用DBA权限登陆SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间 ...

  7. 深入理解Azure自动扩展集VMSS(3)

    在实际使用过程当中,使用VMSS有一些最佳实践的建议和限制,便于你在做自动扩展设计的时候进行考虑: 关于VMSS 如果你使用的是系统镜像,一个扩展集中虚拟机数量不能超过100 无论是在ASM还是ARM ...

  8. 深入理解Azure自动扩展集VMSS(2)

    VMSS中Auto Scale基本原理及诊断 在前面的介绍中,我们看到通过定义规则可以实现虚拟机扩展集的auto scale,那么在后台执行上VMSS的扩展依赖于哪些组件,出现问题(比如自动扩展没有发 ...

  9. 深入理解Azure自动扩展集VMSS(1)

    前文中已经详细介绍了如何配置和部署Azure的虚拟机扩展集VMSS进行自动扩展,但在实际使用过程当中,用户会出现更进一步使用的一些问题,VMSS基本扩展原理及怎么简单调试?如何进行手动扩展?怎么使用自 ...

随机推荐

  1. META.表

    META.表

  2. Kubernetes 中 Informer 的使用

    原文链接:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247485580&idx=1&sn=7392dbadf ...

  3. openvswitch 流表测试 ovs-appctl

    [root@ostack170 ~]# ovs-appctl ofproto/trace br-mirror in_port=,dl_vlan=,dl_src=:ea:cb:5d:e4:ee,dl_d ...

  4. CentOS 桥接网卡配置

    [root@controller ~]# cat /etc/sysconfig/network-scripts/ifcfg-br0 DEVICE=br0 ONBOOT=yes TYPE=Bridge ...

  5. vue自定义下拉框组件

    创建下拉框组件 Select.vue <template> <div class="selects"> <div :class="{sele ...

  6. 初识ABP vNext(7):vue身份认证管理&租户管理

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 目录 前言 开始 按钮级权限 身份认证管理 R/U权限 权限刷新 租户管理 租户切换 效果 最后 前言 上一篇介绍了vue+ABP国际化 ...

  7. npm自定义上传

    npm login # 输入用户名 密码 邮箱 # 要到我们包的根目录里面 npm publish 上传到npm官网命令

  8. 序列号,IMEI,IMSI,ICCID的含义

    什么是序列号? 序列号是一串标识你手机出生证明以及身材特征的信息,甚至还可用来识别是否为官方翻新机.你可以简单的将这一串数字分割为:aabccdddeef 的形式.拿iPhone 4为例 aa = 工 ...

  9. 这应该是最适合国内用户的K3s HA方案

    前 言 在面向生产环境的实践中,高可用是我们无法避免的问题,K3s本身也历经多个版本的迭代,HA方案也进行了不断优化,形成了目前的比较稳定的HA方案. 目前官方提供两种HA方案: 嵌入式DB的高可用( ...

  10. Arbitrary-Oriented Object Detection with Circular Smooth Label(ECCV2020,旋转目标检测)

    论文链接:https://arxiv.org/abs/2003.05597 code:https://github.com/Thinklab-SJTU/CSL_RetinaNet_Tensorflow ...