在工程服务开发中,“布置”的含义是将开发完结的服务或许软件投入到正式环境中运用的进程,包括了相关环境的配置、软件的安装、服务的测验等步骤。类似地,在机器学习和深度学习中,模型布置便是将练习好的模型进行持久化,然后运转服务加载模型,并对外供给RESTful或RPC等形式的服务接口。

如下图所示:

模型部署那些事

现在干流的布置计划有以下几种:

  1. HTTP服务器:在Python服务器上布置模型文件,对外供给http服务,好处是简练快速,可是履行效率不高;

  2. C++/JAVA直接加载模型,不需求额外的接口服务,直接将猜测代码和事务代码耦合在一起,好处是效率高,能够下降网络延迟,可是代码复杂且不易维护;

  3. Docker + Serving布置模型:将模型服务布置在Docker容器中,对外供给接口,好处是支撑各种言语便利布置,且有较多的模型加快推理计划;

简略模型的布置

这儿的简略模型首要是指线性模型、树模型等,一般我们在工作中首要是运用Sklearn、Xgboost、lightGBM和SparkML等结构进行模型的练习。

# sklearn模型保存方法一
import pickle
pickle.dump(file, output)
# sklearn模型保存方法二
from sklearn.externals import joblib
joblib.dump(model, 'model.pkl')
#xgboost模型保存
import xgboost as xgb
model = xgb.train(...)
model.save_model('model.bin')
#lightgbm模型保存
import lightgbm as lgb
model = lgb.LGBMClassifier(...)
model.fit(...)
model.save_model('model.txt')
#spark mllib模型保存
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
model = RandomForestClassifier(...)
model.write().overwrite().save('{}/mdoel'.format(filename))

可见不同结构保存模型的文件格局是不同的,这就导致了在模型布置进程需求对不同的结构的模型文件进行个性化的适配。为了处理这一问题,一起满足跨渠道布置和重复调用的需求,需求将模型保存为一致的文件格局。

PMML简介

猜测模型标记言语PMML(Predictive Model Markup Language)是一套与渠道和环境无关的模型表明言语,是现在表明机器学习模型的实践规范。

作为一个敞开的老练规范,PMML由数据发掘组织DMG(Data Mining Group)开发和维护,经过十几年的开展,得到了广泛的应用,有超过30家厂商和开源项目(包括SAS,IBM SPSS,KNIME,RapidMiner等干流厂商)在它们的数据发掘分析产品中支撑并应用PMML。

模型部署那些事

PMML是一套根据XML的规范,经过 XML Schema 界说了运用的元素和特色,首要由以下核心部分组成:

  • 数据字典(Data Dictionary):描绘输入数据。

  • 数据转化(Transformation Dictionary和Local Transformations):应用在输入数据字段上生成新的派生字段。

  • 模型界说(Model):每种模型类型有自己的界说。

  • 输出(Output):指定模型输出成果。

模型部署那些事

PMML优点

  • 渠道无关性。PMML能够让模型布置环境脱离开发环境,完结跨渠道布置。比方运用Python树立的模型,导出PMML后能够布置在Java生产环境中。

  • 互操作性。完结了兼容PMML的猜测程序能够读取其他应用导出的规范PMML模型。

  • 广泛支撑性。已获得30余家厂商和开源项目的支撑,许多开源数据发掘模型都能够转化成PMML。

  • 可读性。PMML模型是一个根据XML的文本文件,比二进制序列化文件更安全可靠。

TreeLite简介

TreeLite 能够将树模型编译优化为独自库,便利的用于模型布置。经过优化后能够将XGBoost模型的猜测速度进步2-6倍。

模型部署那些事

如下图,黑色曲线为XGBoost在不同batch size下的吞吐量,赤色曲线为XGBoost经过TreeLite编译后的吞吐量。

模型部署那些事

关于TreeLite的具体原理能够参阅如下资料

相关论文:mlsys.org/Conferences…

项目链接:treelite.readthedocs.io/

TensorFlow模型布置

TensorFlow模型格局

TensorFlow 供给了一致模型导出格局 SavedModel,运用这一格局为中介,能够便利地在多种不同渠道上镜像模型布置。一起根据前史原因,Keras的Sequential和Functional模式也有自有的模型导出格局即.h5格局,能够经过显性用.h5后缀,使得保存的模型格局为HDF5 。

# checkpoint格局模型保存和加载
ckpt = tf.train.Checkpoint(model)
ckpt.restore(file)
# savedmodel格局模型保存和加载
tf.saved_model.save(model,path)
model = tf.saved_model.load(path)
# H5格局模型保存和加载
tf.saved_model.save("model.h5")
model = tf.saved_model.load("model.h5")

Checkpoint格局模型能够协助保存和康复模型中参数的权值。而作为模型导出格局的 SavedModel 则更进一步,其包括了一个 TensorFlow 程序的完好信息:不只包括参数的权值,还包括核算的流程(即核算图)。

当模型导出为 SavedModel 文件时,无需模型的源代码即可再次运转模型,这使得 SavedModel 特别适用于模型的分享和布置。后文的 TensorFlow Serving(服务器端布置模型)、TensorFlow Lite(移动端布置模型)以及 TensorFlow.js 都会用到这一格局。

模型部署那些事

在Tensorflow 2.0中,引荐运用SavedModel进行模型的保存,所以keras默许导出格局是SavedModel,也能够经过显性运用 .h5 后缀,使得保存的模型格局为HDF5 。

Tensorflow模型推理

TensorFlow练习好的模型以Tensorflow原生方法保存成protobuf文件后可用许多方法布置运转,常见的推理方法有:

  1. 经过 TensorFlow for C++/Java接口,能够在C++或许Java中调用Tensorflow模型进行猜测;

  2. 经过 Tensorflow-serving 能够加载模型后供给网络接口API服务,经过恣意编程言语发送网络请求都能够获取模型猜测成果;

  3. 经过 Tensorflow-lite 能够在移动和嵌入式设备上加载并运转TensorFlow模型;

  4. 经过 Tensorflow-js 能够用javascrip脚本加载模型并在浏览器中运转模型

TF-Serving

模型练习结束后,最常见的布置方法便是在服务器上供给一个API,不考虑高并发和功能问题,其实合作Flask等python下的Web结构十分轻松完结。然而在服务密集,高并发等场景中并不适用。这个时分就需TF-Serving来进行加快。

模型部署那些事

TF-Serving是一个用于机器学习模型布置的高功能开源库,能够将练习完结的模型直接上线并供给服务;一个重要的特性是:支撑热更新与模型版本主动办理,这意味着一旦布置成功,不需求再为线上服务忧虑,只需求关怀线下的模型练习即可;

核心模块如下图所示:

  • Source用于办理本地的模型文件体系;

  • Source会对需求加载的模型创立一个Loader,Loder中会包括要加载模型的悉数信息;

  • Source告诉Manager有新的模型需求进行加载;

  • Manager经过版本办理战略Version Policy来确认哪些模型需求被下架,哪些模型需求被加载;

  • Manager在确认需求加载的模型是否符合加载战略,便告诉Loader来加载最新的模型;

  • Client向服务器端请求模型成果,能够指定版本;

模型部署那些事

TF-Lite

TensorFlow Lite 是 TensorFlow 在移动和 IoT 等边际设备端的处理计划,供给了 Java、Python 和 C++ API 库,能够运转在 Android、iOS 和 Raspberry Pi 等设备上。作为 TensorFlow 在边际设备上的基础设施,TFLite 将会是愈发重要的角色。

模型部署那些事

现在 TFLite 只供给了推理功用,在服务器端进行练习后,经过如下简略处理即可布置到边际设备上。

  1. 模型转化

  2. 边际设备布置

模型部署那些事

TF-Lite转化后的模型为FlatBuffers格局。是谷歌为了游戏等高功能场景创立的序列化库,比ProtocolBuffer具有高功能和轻量性等优势,愈加合适边际设备的布置。

TF-JS

TensorFlow.js 是 TensorFlow 的 JavaScript 版本,支撑 GPU 硬件加快,能够运转在 Node.js 或浏览器环境中。它不光支撑完全根据 JavaScript 从头开发、练习和布置模型,也能够用来运转已有的 Python 版 TensorFlow 模型,或许根据现有的模型进行继续练习。

全体功用,只需求一个文件,几十行 HTML/JavaScript 即可完结。能够直接在浏览器中运转,完好的 HTML 代码如下:

模型部署那些事

Pytorch/Mxnet等模型布置

优化用于推理(或模型评分)的机器学习模型十分困难,由于需求调整模型和推理库,充分利用硬件功用。 假如想要在不同类型的渠道(云/Edge、CPU/GPU 等)上获得最佳功能,完结起来会反常困难,由于每个渠道都有不同的功用和特性。 假如模型来自需求在各种渠道上运转的多种结构,会极大增加复杂性。 优化结构和硬件的一切不同组合十分耗时。 这就需求一种处理计划,在首选结构中练习一次后能在云或 Edge 上的恣意位置运转。 此时 ONNX 便派上了用场。

模型部署那些事

ONNX简介

ONNX(Open Neural Network Exchange),敞开神经网络交流,是微软和Facebook提出用来表明深度学习模型的敞开格局。在实践事务中,能够运用Pytorch或许TensorFlow练习模型,导出成ONNX格局,然后再转化成目标设备上支撑的模型格局,比方TensorRT Engine、NCNN、MNN等格局。ONNX界说了一组和环境,渠道均无关的规范格局,来增强各种AI模型的可交互性,敞开性较强。

无论运用何种练习结构练习模型(比方TensorFlow/Pytorch/OneFlow/Paddle),在练习结束后都能够将这些结构的模型一致转化为ONNX这种一致的格局进行存储。注意ONNX文件不只仅存储了神经网络模型的权重,一起也存储了模型的结构信息以及网络中每一层的输入输出和一些其它的辅佐信息。

ONNX界说了一组与环境和渠道无关的规范格局,为AI模型的互操作性供给了基础,使AI模型能够在不同结构和环境下交互运用。硬件和软件厂商能够根据ONNX规范优化模型功能,让一切兼容ONNX规范的结构受益。

模型部署那些事

关于ONNX和PMML的区别:

  1. ONNX和PMML都是与渠道和环境无关的模型表明规范,能够让模型布置脱离模型练习环境,简化了布置流程,加快模型快速上线到生产环境中。这两个规范都得到了各大厂商和结构的支撑,具有广泛的应用;

  2. PMML是一个比较老练的规范,在ONNX诞生之前,能够说是模型表明的实践规范,对传统数据发掘模型有丰厚的支撑,可是由于PMML是根据旧式的XML格局,运用文本格局来存储深度神经网络模型结构和参数会带来模型大小和功能的问题,现在该问题还没有一个完美的处理计划;

  3. ONNX作为一个新的规范,刚开始首要供给对深度神经网络模型的支撑,处理模型在不同结构下互操作和交流的问题。现在经过ONNX-ML,ONNX已经能够支撑传统非神经网络机器学习模型,可是现在模型类型还不够丰厚;

TensorRT简介

TensorRT是一个高功能的深度学习推理(Inference)优化器,能够为深度学习应用供给低延迟、高吞吐率的布置推理。TensorRT可用于对超大规模数据中心、嵌入式渠道或主动驾驶渠道进行推理加快。

TensorRT现已能支撑TensorFlow、Caffe、Mxnet、Pytorch等简直一切的深度学习结构,将TensorRT和NVIDIA的GPU结合起来,能在简直一切的结构中进行快速和高效的布置推理。

模型部署那些事

TensorRT是一个只要前向传达的深度学习结构,这个结构能够将 Caffe,TensorFlow的网络模型解析,然后与tensorRT中对应的层进行一一映射,把其他结构的模型一致悉数 转化到tensorRT中,然后在tensorRT中能够针对NVIDIA自家GPU施行优化战略,并进行布置加快。

字节内部模型布置

Groot经过推理服务

Groot的特色如下:

  • 供给通用的GBDT的serving 服务,IDL未涉及事务特色,纯推理API接口;

  • 供给较高的GBDT Serving功能,根据C++最 新开发结构archon,事务经过公司一致RPC接口拜访;

  • 推理服务托管于reckon渠道, 支撑全流程的打通: 数据流–> 模型练习 –> 模型发布 –> 在线推理服务;

  • Groot: 即GBDT通用推理服务;

具体介绍能够参阅

Pilot通用推理服务

Pilot是一个通用的Inference Engine,它现在是以TensorFlow为Backend,不只适用于WDL类核算轻量的模型,也能够用于CNN、BERT等重度核算模型。

关于Lagrange/Sail models,Pilot的上游为Marine,从头条OnlinePS获取instances fids的value,对每个slot做Sumpooling后,转化成slots和bias,作为Pilot的真正输入。

关于Lagrange lite models,Pilot现在没有特定上游,由用户自由开发Client,之后考虑开发一个Marine Lite的组件进行合作。

具体介绍能够参阅

ByteNN移动端推理

ByteNN是一个致力于深度学习工程落地的高功能异构AI核算渠道,支撑跨渠道的推理核算、端上练习才能,为公司内外AI事务供给一致的多渠道快速AI布置才能,一起也供给模型紧缩量化、模型转化、benchmark、功能诊断、模型加密等完备的周边东西链支撑,覆盖CV、Audio、NLP等多个事务范畴的常用算子,全体功能在业界继续坚持抢先。

具体介绍能够参阅

参阅文档

dmg.org/pmml/v4-1/G…

treelite.readthedocs.io/en/latest/

www.tensorflow.org/

onnx.ai/

developer.nvidia.com/tensorrt