热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开源|dl_inference:通用深度学习推理服务

开源项目专题系列(六)

开源项目专题系列

(六)

1.开源项目名称: dl_inference

2.github地址:

https://github.com/wuba/dl_inference

3.简介: 通用深度学习推理服务,可在生产环境中快速上线由TensorFlow、PyTorch框架训练出的深度学习模型。

dl_inference 是58同城推出的通用深度学习推理服务,可在生产环境中快速上线由TensorFlow、PyTorch框架训练出的深度学习模型。 dl_inference当前支持TensorFlow和PyTorch模型,提供G PU和CPU两种部署方式,并且实现了模型多节点部署时的负载均衡策略,支持线上海量推理请求,该服务支撑了58同城各AI场景下日均超过10亿次的线上推理请求。

dl_inference具备如下特点:

  • 简化深度学习模型的推理服务部署;

  • 支持模型多节点部署并实现负载均衡策略;

  • 提供统一的RPC服务调用接口;

  • 提供GPU和CPU两种部署方式;

  • PyTorch模型支持推理前后数据处理,开放模型调用。

为什么需要dl _ inference

将深度学习模型进行部署实现推理服务是算法应用到生产环境的最后一环。当前主流的深度学习框架TensorFlow和PyTorch推理服务实现介绍如下:

1. TensorFlow推理

最常见的是采用TensorFlow Serving这一组件进行部署,在生产环境中推荐使用 Docker 部署TensorFlow Serving。TensorFlow Serving可以直接读取SavedModel格式模型文件进行部署,支持热更新模型,支持以gRPC和RESTful API进行调用。

当一个模型需要部署多个节点时,采用TensorFlow Serving组件部署时需要解决请求负载均衡问题,dl_inference基于动态加权轮询算法实现多个推理节点的负载均衡,很好的解决了这一问题。

2. PyTorch推理

PyTorch框架不提供服务化部署组件,需要用户自己开发实现,大致有两种解决方案。第一种是利用服务化框架进行封装,比如使用Flask框架部署一个http服务,编写API来进行请求处理, API里调用PyTorch推理函数;第二种是将PyTorch模型利用ONNX转换为onnx格式,然后再转换为TensorFlow或Caffe的模型,再通过TensorFlow Serving 或Caffe来进行推理部署。

第一种方式需要用户自行进行服务封装,开发工作量大;第二种方式也存在诸多缺陷,如PyTorch模型转onnx格式存在失败情况且转成onnx格式后推理性能会有损耗。dl_inference基于Seldon对PyTorch进行封装提供RPC服务调用,用户只需要将PyTorch模型放在指定目录启动dl_inference即可进行线上请求调用。

dl _ inference 架构

dl_inference主要包括统一接入服务、TensorFlow推理服务、PyTorch推理服务三个模块,如下图所示:

开源|dl_inference:通用深度学习推理服务

统一接入服务

统一接入服务基于gRPC实现,作为深度学习模型在线推理请求入口,提供TensorFlow、PyTorch两种模型通用调用接口,接收调用方线上请求,与后端部署的TensorFlow或PyTorch模型实例进行交互,实现负载均衡策略。统一接入服务主要实现了接口统一和负载均衡两项功能,下面分别进行介绍。

深度学习模型类型多样,不同模型在线推理请求对应的输入输出数据格式不同,不仅是输入输出的key数量不同,而且数据类型也不一致。针对这一问题,统一接入服务定义TensorFlow和PyTorch两个通用接口来兼容这两大主流深度学习框架所训练模型的推理请求。

开源|dl_inference:通用深度学习推理服务

TensorFlow接口: 与TensorFlow-Serving推理引擎保持一致,请求协议PredictRequest对象,返回协议PredictResponse对象,统一接入服务将用户构建的PredictRequest对象请求直接透传给后端TensorFlow-Serving实例。

PyTorch接口: PyTorch框架没有提供对应的推理引擎,我们基于Seldon将PyTorch推理函数封装为gRPC服务,统一接入服务的PyTorch接口采用封装的PyTorch gRPC服务协议SeldonMessage作为输入和输出。SeldonMessage支持各种格式数据的传递,如String类型数据、Tensor类型数据、Bytes类型数据等。

深度学习模型进行推理部署时根据线上流量大小会部署多个实例,统一接入服务需要将接收到的推理请求均匀的转发到后端实例,剔除不可用实例。统一接入服务基于动态加权轮询算法实现模型实例的请求负载均衡,根据每次请求结果来判断对应节点是否正常,来动态调整节点有效权重,若节点异常响应,如宕机、网络异常等情况,能快速降低节点有效权重,保证节点被选中的概率减少,以此来降低发送到节点上的流量比;反之节点正常响应,能快速提升节点有效权重,保证节点被选中概率增加,以此来提升发送到节点上的流量比。

开源|dl_inference:通用深度学习推理服务

TensorFlow推理服务

TensorFlow模型 推理采用TensorFlow-Serving开源推理引擎部署,部署方式支持物理机和Docker容器。 部署模型首先需要准备模型数据,支持SavedModel格式模型文件。 物理机部署需要安装Tensorflow-Serving环境,步骤较为复杂,相对物理机部署方式容器化部署更简单,无需安装环境,即开即用,操作方便,从Docker hub上下载对应版本的Tensorflow-Serving镜像,使用docker run命令运行镜像,挂载模型文件到容器内部,指定服务监听端口并绑定到宿主机上即部署完成。 采用TensorFlow-Serving引擎部署有诸多优点,如支持分布式TensorFlow模型、GPU推理加速、多种编程语言客户端、多个模型同时提供服务、模型动态加载及卸载等。

TensorFlow模型推理支持自定义operate,用户在训练TensorFlow模型时会添加自己定义的算法实现,添加Tensorflow中不存在的operate或针对现有场景下算法的个性化优化,用于提升训练效率。在TensorFlow-Serving官方提供的镜像并不支持自定义operate,因此需通过修改TensorFlow-Serving源码重新编译来实现。

PyTorch推理服务

PyTorch框架 没有提供对应的模型推理服务组件,dl_inference基于Seldon封装了PyTorch模型推理RPC服务,统一接口协议,适用任何类型的PyTorch模型,极大减少PyTorch模型部署工作量。 同时在PyTorch模型RPC服务封装时我们进行了创新,首先,引入前后预处理程序, 支持用户在执行Pytorch模型推理前后进行相关数据的处理; 其次 ,开放模型调用,用户可以根据业务及模型的特点进行模型调用独立定制。 PyTorch模型部署步骤如下:

(1)安装Docker环境,使用本项目提供的镜像启动容器。

(2)准备好PyTorch模型、前后处理 Python 程序放入指定目录。

(3)执行startPredict.sh脚本启动模型推理RPC服务。

PyTorch模型实例部署后,实例中请求调用流程如下:

开源|dl_inference:通用深度学习推理服务

用户可以重新定义自定义接口文件中preprocess(模型执行前数据预处理)、postprocess(模型执行后数据后处理)接口函数,在preprocess中,可以对传入的推理数据还有参数进行预处理操作,比如对图片的字节流数据进行处理,返回模型推理需要的Tensor类型数据; 在postprocess中,可以对模型返回的推理结果进行处理,比如对结果进行筛选并剔除多余结果数据,或者将结果数据进行压缩、数学变换等操作。 支持推理前后的数据处理,使得线上线下可以使用同一套数据处理,极大的简化了算法开发人员部署模型的工作量,同时还可以在远程调用时,减小网络传递的数据包大小,提高整体推理性能。

不同的业务场景模型实现不尽相同,为了支持在不同场景下的模型调用需求,用户可以在自定义接口文件中,重新定义模型的执行过程。默认的模型执行是单次执行,自定义接口函数中,可以多次执行同一个模型,或通过推理数据的参数修改模型内部权重,然后再进行模型调用,实现同一模型适应不通场景下的推理。开放模型调用,提高了模型实现的灵活性,从而满足不同业务方的定制化需求。

如何使用 dl _ inference

使用dl_inference将深度学习模型应用到生产环境需要进行统一接入服务部署和模型部署。统一接入服 务为maven工程,源码位于项目wpaidlpredictonline目录下,运行环境为jdk1.8及以上版本。 Maven install方式编译源码,将编译生成的jar包和lib依赖包上传到服务器部署目录下,执行启动命令启动服务。 模型部署分TensorFlow和PyTorch两种框架训练的模型,下面分别加以介绍。

1. TensorFlow模型部署

(1)数据准备

准备SavedModel格式的TensorFlow模型文件,如果是CheckPoint格式需要转换成SavedModel格式。

(2) 模型部署

建议使用容器化方式部署,基本步骤如下所示:

(1)安装Docker环境。

(2)拉取TensorFlow Serving镜像并启动容器。

(3)将TensorFlow模型放入指定目录,启动服务。

自定义operate个性化部署时,由于TensorFlow导出模型时不会将自定义operate添加到模型文件中,所以官方提供的TensorFlow-Serving镜像无法识别。这种情况下需要将自定义operate编译到TensorFlow-Serving源码中,详细过程请参见项目Readme。

2.PyTorch模型部署

(1) 数据准备

主要准备两种文件,一是需要部署的模型文件,二是用户自定义接口文件。

模型文件:用dl_inference来部署模型,需要采用保存整个模型的方式生成模型文件,并且命名为为model.pth。

用户自定义接口文件:按照业务需要重写自定义接口文件中的前后数据处理函数,自定义模型运行函数。

(2)模型部署

完成PyTorch模型部署只需在已安装Docker环境的物理机上进行以下三步:

(1)准备好所需模型和接口文件放在指定目录下

(2)使用提供的DockerFile生成PyTorch在线推理镜像

(3)运行PyTorch服务镜像

详细过程请参见项目Readme。

后续规划

未来我们会持续优化和扩展dl_inference的能力,计划开源如下:

(1) 支持深度学习框架Caffe所训练模型在GPU和CPU上的推理。

(2)CPU上推理性能的加速, 如兼容intel的相关机器学习库,如MKL(Math Kernel Library)、OpenVINO等。

(3)GPU上推理性能的加速, 提升单张GPU卡的吞吐率,如兼容Nvidia开源组件TensorRT等。

如何贡献&问题反馈

本次开源只是dl_inference贡献社区的一小步,我们真挚地希望开发者向我我们提出宝贵的意见和建议。

您可以挑选以下方式向我拉反馈建议和问题:

(1)在 https://github.com/wuba/dl_inference 提交PR或者lssue。

(2)邮件发送至 ailab-opensource@58.com

作者简介

封  宇,58同城 AI Lab后端高级工程师

陈兴振,58同城AI Lab后端架构师

陈泽龙,58同城AI Lab后端工程师

想了解更多开源项目信息?

与项目成员零距离交流?

扫码加小秘书 微信 开源|dl_inference:通用深度学习推理服务

一切应有尽有 开源|dl_inference:通用深度学习推理服务

开源|dl_inference:通用深度学习推理服务

微信号 : jishu-58

添加小秘书微信后由小秘书拉您进项目交流群

阅读推荐

1.“暗黑模式”之58 同城 iOS App深色模式适配实践

2.开源|Zucker:Android APP模块化大小自动分析统计工具

3.开源|WBBlades:基于Mach-O文件解析的APP分析工具

4.开源|wwto:小程序跨端迁移解决方案——微信转其他小程序

5.开源|qa_match:一款基于深度学习的层级问答匹配工具

开源|dl_inference:通用深度学习推理服务


以上所述就是小编给大家介绍的《开源|dl_inference:通用深度学习推理服务》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 我们 的支持!


推荐阅读
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 初学SpringBootch06接口架构风格 RESTful
    ch06-接口架构风格RESTful1.1认识RESTful1.1.1RESTful架构风格1.2RESTful注解1.3RESTful风格的使用1.3.1加入Maven依赖1.3 ... [详细]
  • 目录Atlas介绍Atlas部署Atlas基本管理Atlas结合MHA故障恢复读写分离建议Atlas介绍Atlas是由Qihoo360Web平台部基础架构团队开发维护的一个基于My ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 本文介绍了PhysioNet网站提供的生理信号处理工具箱WFDB Toolbox for Matlab的安装和使用方法。通过下载并添加到Matlab路径中或直接在Matlab中输入相关内容,即可完成安装。该工具箱提供了一系列函数,可以方便地处理生理信号数据。详细的安装和使用方法可以参考本文内容。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • .NetCoreWebApi生成Swagger接口文档的使用方法
    本文介绍了使用.NetCoreWebApi生成Swagger接口文档的方法,并详细说明了Swagger的定义和功能。通过使用Swagger,可以实现接口和服务的可视化,方便测试人员进行接口测试。同时,还提供了Github链接和具体的步骤,包括创建WebApi工程、引入swagger的包、配置XML文档文件和跨域处理。通过本文,读者可以了解到如何使用Swagger生成接口文档,并加深对Swagger的理解。 ... [详细]
  • Nginx Buffer 机制引发的下载故障
    Nginx ... [详细]
  • 服务网关与流量网关
    一、为什么需要服务网关1、什么是服务网关传统的单体架构中只需要开放一个服务给客户端调用,但是微服务架构中是将一个系统拆分成多个微服务,如果没有网关& ... [详细]
  • 在单位的一台4cpu的服务器上部署了esxserver,挂载了6个虚拟机,目前运行正常。在安装部署过程中,得到了cnvz.net论坛精华区 ... [详细]
  • 安装Tensorflow-GPU文档第一步:通过Anaconda安装python从这个链接https:www.anaconda.comdownload#window ... [详细]
  • php网站设计实验报告,php网站开发实训报告
    本文目录一览:1、php动态网站设计的关键技术有哪些软件,及搭建步骤需要哪些页面,分别完成 ... [详细]
  • Nginxgaodaima.comnginx属于七层架构,支持的是http协议,本身对tcp协议没有支持。所以不能代理mysql等实现负载均衡。但是lvs这个东西不熟悉,主要是公司 ... [详细]
author-avatar
nup1764819
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有