作者: 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. Oracle 多条数据转一行逗号隔开

    wm_concat   例: select wm_concat(市) from pa50 where apa132=省

  2. Web安全攻防(简)学习笔记

    Web安全攻防-学习笔记 本文属于一种总结性的学习笔记,内容许多都早先发布独立的文章,可以通过分类标签进行查看 信息收集 信息收集是渗透测试全过程的第一步,针对渗透目标进行最大程度的信息收集,遵随&q ...

  3. 笔记:Linux下软件的安装、CentOS更新yum源、LAMP环境搭建、kali软件管理

    一.Linux下软件的安装 方式:yum源 / rpm /源码安装 1.yum:(帮助管理员解决依赖关系) yum是通过分析rpm的包头数据后,根据各种软件的相关性质做出属性相对应的解决方案,然后可以 ...

  4. SpringSecurity权限管理系统实战—八、AOP 记录用户、异常日志

    目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...

  5. 你想了解的JDK 10版本更新都在这里

    「MoreThanJava」 宣扬的是 「学习,不止 CODE」,本系列 Java 基础教程是自己在结合各方面的知识之后,对 Java 基础的一个总回顾,旨在 「帮助新朋友快速高质量的学习」. 当然 ...

  6. golang目录

    基础 golang安装及vscode编辑器配置 golang基础结构 golang基础数据类型 golang复合数据结构 goalng函数 golang方法 golang接口 golang并发 gol ...

  7. 第五篇 Scrum冲刺博客

    一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 未完成 购物车列表,购物车工具栏 陈泽佳 未完成 静态结构 徐伟浩 商品信息录入 协助前端获取数据 谢佳余 未完成 搜索算法设计 邓帆涛 ...

  8. Helix QAC/QAC++—代码静态测试工具介绍—符合功能安全标准MISRA ISO26262

    Helix QAC是静态代码分析工具,依据C和C++编码规则自动扫描代码对规则的违背.开发团队在开发过程的早期就可以用它来检测缺陷,因为此时修改代码是最方便也最经济的.Helix QAC因此自动化强制 ...

  9. 释放数据价值:DAYU数据运营新能力解读

    摘要:从比特到信息,这说的其实就是企业数字化转型,让数据的价值充分发挥出来,变成信息. 今天,企业对数据越来越重视,数据已经成为了企业新型的资产,甚至是核心资产,最近流传一句非常有意思的话:从比特到信 ...

  10. linux 下分别使用pip2、pip3

    上次切换了Python2和Python3.但是Python3并没有pip,所有在Python3下不能安装包. 下面实现在Python3 下安装pip3 1,首先安装setuptools wget -- ...