QCon全球软件开发大会8折优惠倒计时,购票立减¥1760!了解详情 >>> 了解详情
写点什么

Analytics Zoo Cluster Serving 自动扩展分布式推理

2020 年 2 月 13 日

Analytics Zoo Cluster Serving自动扩展分布式推理

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



为了应对这一挑战,我们在 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 环境

  2. 将已经完成训练的模型复制到本地节点。当前支持的模型包括 TensorFlow、PyTorch、Caffe、BigDL 和 OpenVINO 的模型。

  3. 在本地节点上安装 Analytics Zoo(例如使用单个 pip Install 命令即可完成)

  4. 在本地节点上配置集群服务器,包括模型的文件路径和集群地址(如 Apache Hadoop*YARN 集群、Spark 集群、Kubernetes*集群等)

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

  6. 启动 Cluster Serving 服务

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

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

  9. 分布式实时(流式)推理

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

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


快速入门示例

你也可以通过运行 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

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

  3. 在 container 内启动 Cluster Serving

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


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


image: fish1.jpeg, classification-result: class: 1's prob: 0.9974158image: cat1.jpeg, classification-result: class: 287's prob: 0.52377725image: dog1.jpeg, classification-result: class: 207'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/modeldata: # default, localhost:6379 src: # default, 3,224,224 image_shape:params: # default, 4 batch_size: # default, 1 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, 1 num_executors: # default, 4 executor_cores: # default, 4 total_executor_cores:
复制代码


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


from zoo.serving.client import InputQueue, OutputQueueimport osimport cv2import jsonimport 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 的信息。


2020 年 2 月 13 日 10:301266

评论

发布
暂无评论
发现更多内容

OPPO小布助手正在改变普罗米修斯的世界

脑极体

脑洞:如何用一个整数来表示一个列表?

Python猫

Python

架构师训练营W10作业

Geek_f06ede

【Java入门】流

HQ数字卡

Java 七日更

大连市税务局局长赵福增:用区块链打破部门间“信息孤岛”

CECBC区块链专委会

区块链 汽车

测开之函数进阶· 第2篇《纯函数》

清菡

测试开发

量化交易系统开发搭建案例

薇電13242772558

区块链 策略模式

神比喻:低代码开发像自动驾驶汽车,零代码开发像无人驾驶汽车!

低代码指南

程序员 软件 开发者 低代码 开发工具

距离 Java 开发者玩转 Serverless,到底还有多远?

阿里巴巴云原生

Java Serverless 微服务 云原生 中间件

TypeScript | 第二章:类、接口和之间的关系

梁龙先森

typescript 前端 七日更

“区块链+社会治理”模式获居民点赞

CECBC区块链专委会

区块链 区块链投票

GitHub上3天1W赞的程序员学习路线!入门进阶都非常实用

Java架构之路

Java 程序员 架构 面试 编程语言

阿里架构师478页Java工程师面试知识解析笔记pdf,一份2021年通往阿里的面试指南

Java架构之路

Java 程序员 架构 面试 编程语言

云服务的可服务性经典6问

华为云开发者社区

服务 计算

大众汽车“芯片荒”,折射汽车芯片的漫漫“自主替代”路

脑极体

学透这份300页的2020最新java面试题及答案,一线大厂offer随便拿

Java架构之路

Java 程序员 架构 面试 编程语言

编程之美!从线程池状态管理来看二进制操作之美

洋仔聊编程

Java 源码分析 线程池

谁告诉你观察者就是发布订阅模式的!抽他!

爱笑的架构师

设计模式 23种设计模式 观察者模式 Java设计模式 七日更

LeetCode题解:55. 跳跃游戏,贪心,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

由于不知线程池的bug,某Java程序员叕被祭天

Java架构师迁哥

2020,谁是中国ToB行业最有影响力的企业?

ToB行业头条

MSHA x Chaos 容灾高可用实践

阿里巴巴云原生

数据库 高可用 云原生 中间件 容灾

世界之书:《麦田里的守望者》与在虚无中创造希望

lidaobing

麦田里的守望者 28天写作

阿里开发10年,全部心血汇聚成到这份文档里,拿到30W的offer没问题

Java架构之路

Java 程序员 架构 面试 编程语言

比特币10年:从2个披萨涨到2万美金,背后的三个“神秘人”

CECBC区块链专委会

比特币

英特尔宋继强:迈向可持续的千倍速计算未来

新闻科技资讯

2020 微信头像圣诞帽来啦,快给 TA 戴帽子吧~

mghio

圣诞帽 微信头像 圣诞节

PostgreSQL:您可能需要增加MAX_LOCKS_PER_TRANSACTION

PostgreSQLChina

数据库 postgresql 开源

图解HTTP权威指南(一)| HTTP报文

李先生

运维 HTTP

volatile,synchronized可见性,有序性,原子性代码证明(基础硬核)

叫练

volatile 多线程 synchronized 原子性 指令

Reactive Spring实战 -- 理解Reactor的设计与实现

binecy

reactor Reactive SpringBoot 2

移动应用开发的下一站

移动应用开发的下一站

Analytics Zoo Cluster Serving自动扩展分布式推理-InfoQ