机器之心编辑部编译

Oracle开源GraphPipe:几行代码让你在TensorFlow部署PyTorch模型

甲骨文公司(Oracle)在人工智能领域非常低调,但最近其开源的通用深度学习模型部署框架 GraphPipe 着实让人眼前一亮,它可以让你的模型在各种框架之间轻松转换。Oracle 称,这一新工具可提供跨深度学习框架的模型通用 API、开箱即用的部署方案以及强大的性能。目前 GraphPine 已支持 TensorFlow、PyTorch、MXNet、CNTK 和 Caffe2 等框架。

项目地址:https://github.com/oracle/graphpipe

ML 的开发者经常会发现已有的模型服务方案存在非一致性和低效的问题。在缺乏一致、能用于不同模型服务器的通信协议下,开发者经常需要为每一个工作负载构建定制客户端。GraphPipe 通过标准化一种高效的通信协议解决了这些问题,并为主流的机器学习框架提供了简单的模型服务器。

GraphPipe 是一个用于简化机器学习模型部署,并将其从特定框架的模型实现中解放出来的协议和软件集合。GraphPipe 为在网络上传递张量数据提供了一个标准、高性能的协议,以及提供了客户端和服务器的简单实现,因而使得从任何框架部署和查询机器学习模型变得轻而易举。GraphPipe 的高性能服务器能支持 TensorFlow、PyTorch、MXNet、CNTK 和 Caffe2。

Oracle 希望开源 GraphPipe 可以使模型服务变得更加友好,因此通过调查当前的机器学习模型服务现状,我们发现:

  • 模型服务网络协议尝试隐藏模型的实现。例如,假设你拥有一个 TensorFlow 模型,你需要使用 TensorFlow 的协议缓存服务器(TensorFlow-serving)来执行远程推理。

  • 另一方面,PyTorch 和 Caffe2 并没有在他们的代码库中提供高效的模型服务器,但依赖于像 mxnet-model-server 这样的工具来执行远程推理。mxnet-model-server 是用 Python 编写的,并提供了一个 json API,没有批量支持。尽管这对于简单的案例来说很好,但并不适用于后端基础设施。

  • 虽然 Facebook 推出了 ONNX,但它是通过标准化模型格式而不是协议格式解决供应商耦合(vendor-coupling)的问题。这很有用但也存在挑战,因为不是所有的后端模型格式都有完全等价的运算。这意味着简单的转换并不总是可行,并且有时候有必要重写模型。

  • 对于希望稳健地维护基础设施的运营者而言,拥有一种标准的方法实现前端客户端和后端机器学习模型的通信,而不用管模型实现的框架,是很重要的。

换句话说,没有 GraphPipe 的服务模型是很痛苦的。

在我们发布的代码中提供了:

  • 基于 flatbuffer 的极简机器学习传输规范

  • Tensorflow、Caffe2 和 ONNX 构建简单高效的参照模型服务器

  • Go、Python 和 Java 中高效的客户端实现

有了这些工具,交流变得畅通无阻,服务也更加简单:

性能

实验首先对比了对 Python 浮点张量数据的序列化和反序列化运算的速度,分别使用定制 ujson API,TensorFlow-serving 预测请求的协议缓存,以及 GraphPipe 远程请求。该请求由大约 1900 万个浮点值(包含 128 张 224x224x3 的图像)组成,并且响应由大约 320 万个浮点值(包含 128 张 7x7x512 的卷积输出)组成。纵轴的单位是秒。

GraphPipe 在并行化方面表现得特别好,因为 flatbuffers 无需复制内存即可提供对基础数据的访问。

其次,实验比较了 Python-JSON TensorFlow 模型服务器、TensorFlow-serving 和 GraphPipe-go TensorFlow 模型服务器的端到端吞吐量。每种类型中,后端模型都是相同的。分别采用一路和五路并行向服务器发出大量请求。纵轴单位是模型每秒计算的行数。

请注意,以上所述的测试仅使用一般推荐的参数来构建 TensorFlow-serving。尽管推荐的构建参数不能让 TensorFlow-serving 效果达到最优,但 Oracle 最终发现编译参数能允许获得与 GraphPipe 实现相同的性能。换而言之,最优的 TensorFlow-serving 与 GraphPipe 的性能相近,尽管构建最优性能的 TensorFlow-serving 并得不到记录。

使用 GraphPipe 为模型提供服务

除了有效协议外,GraphPipe 还提供了用 Go 语言编写的参考模型服务器,以简化部署机器学习模型的过程。根据 Oracle 的经验,将现有的模型转换成通用的格式可能会存在很多缺陷。因此,GraphPipe 提供了能够本地运行最常见的 ML 模型格式的模型服务器。

这些服务器可以在 graphpipe-go repo 的 cmd 子目录中找到:

  • graphpipe-tf 使用 libtensorflow 为 TensorFlow 模型提供支持

  • graphpipe-onnx 使用 libcaffe2 为 Caffe2 和 ONNX 模型提供支持

目标

在设计模型服务器时,GraphPipe 的目标如下:

  • 优越的性能

  • 简易文档化的构建过程

  • 易于使用的灵活代码

  • 支持最常见的 ML 框架

  • 更优化的 CPU 和 GPU 支持

服务器功能概述

GraphPipe 的参考服务器应用的基本机制非常直观。

为了最小化开销,Oracle 尝试尽可能提高以上步骤的效率。例如,因为使用 flatbuffers 作为网络传输格式,反序列化实际上就是一个指针转换。

语言选择

虽然 Go 语言并不是机器学习领域里最常见的语言,但它是构建高效服务器的理想选择。它也是一种明确而友好的语言,不会给你带来太多的惊喜。这些特性使得 Go 语言成为了一种优秀的协作语言,这也是 GraphPipe 模型服务器选择它的原因。

Go 语言存在一个缺点:现有的机器学习框架都是由 C/C++语言编写的,当从 Go 代码转换为框架后端时会存在一些消耗。当然,在实践中我们发现这对于性能的影响其实非常小。在性能测试期间,GraphPipe 的 Go 代码实现了与纯 C++编写的 TensorFlow-serving 优化构建几乎相同的性能。

CUDA GPU 加速

对于每个参考服务器,项目中都提供了 docker 镜像和源代码,用于构建使用 CUDA 加速运行的二进制文件。

MKL CPU 加速

为了最大限度提高各种服务器构建之间的兼容性,并且同时最大化性能,服务器的 CPU 构建块需要通过 MKL 编译。当使用 TensorFlow 时,MKL 为支持 channels_first 维度顺序的卷积运算提供了额外的优化,这通常是使用 GPU 的首选排序。因此在使用 GraphPipe 服务器的默认配置时,CPU 和 GPU 可以使用相同的模型并接受相同的输入。

当然,也有可能应用需要使用不同的最优化或通道顺序。因此对于这种情况,应该直接调整源代码以构建满足我们需求的自定义版本。

缓存

Go 这类语言的优点之一就是易于访问简单而强大的库。因此,我们能为两个模型服务器添加一些共享代码以创建行级缓存。这个可选的行级缓存是基于 boltdb 的,对于接受相同数据的多项请求的模型非常有用。缓存通常可以在几微秒内返回数据,而大型模型处理一个请求可能需要几百毫秒。

使用 GraphPipe 用户端

为了更便捷地将 GraphPipe 整合到我们的应用软件,GraphPipe 为主要的编程语言提供了高效的用户端实现。

一般而言,机器学习用户端的工作流程如下所示:

虚线框中的每一个步骤都应该尽可能更高效地实现,这是非常重要的。GraphPipe 就以这些步骤的高效实现为目标。目前,GraphPipe 的用户端支持 Python、Go 和 Java 语言。

原文链接:https://oracle.github.io/graphpipe/#/guide/servers/overview

理论机器学习深度学习模型
2
相关数据
机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

查询技术

一般来说,查询是询问的一种形式。它在不同的学科里涵义有所不同。在信息检索领域,查询指的是数据库和信息系统对信息检索的精确要求

MXNet技术

MXNet是开源的,用来训练部署深层神经网络的深度学习框架。它是可扩展的,允许快速模型训练,并灵活支持多种语言(C ++,Python,Julia,Matlab,JavaScript, Go,R,Scala,Perl,Wolfram语言)

推荐文章
暂无评论
暂无评论~