AI面试第七弹(模型部署相关知识)

一、离线模型(Offline)

离线模型存在于很多业务场景中,其中最常见的业务场景就是用在推荐系统的召回阶段,由于在推荐系统中,召回并不要求是实时的,可以根据业务的需要,调整成每天一次,或者每几个小时跑一次即可,因此,这类的模型,一般我们只需要使用Linux下的crontab定时任务脚本,每隔一段时间来启动一次就可以,然后将log文件输出到指定的文件下即可。这种方式一般来讲仅限离线模型的部署,其本质上就是一段定时任务的代码。

二、在线(Online)/近似在线(NearLine)模型

在生产系统中,实时推理和预测是最常见的需求,也是对于很多深度学习模型来说所必须达到的点。下面简介一些深度学习模型在实时预测时常见的几种部署方法:

1、将模型预测直接打包成http接口

将模型直接打包成一个http接口的形式是在企业中比较常见的模型上线的方式,所谓的将预测直接打包成http接口实际上一般是指将我们训练好的模型直接在线上进行预测。我们来试想一个场景,当一个模型训练好之后,我们如果想要验证这个模型的好坏,我们首先能想到的办法就是找一批数据来测试一下。实际上,将模型预测直接打包成http接口也是利用了这样的思路。

在这里,我们可以将训练好的模型提前进行加载,并初始化若干个消息队列和worker,当有新的待预测数据进入的时候,我们直接将数据通过消息队列传入到模型中进行推理和预测,最终得到结果。

对于外层接收输入,我们一般可以将接收的地方使用flask打包成一个http接口,等待传入即可。

使用这种方式直接打包成http接口的好处在于打包和部署相对比较方便,对于一些相对比较轻量级且对并发量要求不是很高的情况下相对还是比较好用的。使用值得注意的是,如果对于一个相对比较大的模型来讲,这种方式推理的时间相对就会比较长,从用户输入到结果返回可能需要200ms左右。

2、PMML

PMML是一套通用的且与平台和环境无关的模型表示语言,机器学习在模型部署方面的一种标准部署方案,其形式是采用XML语言标记形式。我们可以将自己训练的机器学习模型打包成PMML模型文件的形式,然后使用目标环境的解析PMML模型的库来完成模型的加载并做预测。

PMML是一套基于XML的标准,通过 XML Schema 定义了使用的元素和属性,主要由以下核心部分组成:

数据字典(Data Dictionary),描述输入数据。

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

模型定义 (Model),每种模型类型有自己的定义。

输出(Output),指定模型输出结果。

目前,大部分机器学习库都支持直接打包成PMML模型文件的相关函数,例如在Python中的LightGBM库,XGBoost库,Keras库等,都有对PMML的支持,直接使用相应的命令就可以生成,而在Java、R等语言中,也有相关的库可以进行PMML文件生成的命令。

一般来讲,使用PMML文件进行预测的过程如下:


image.png

由于其平台无关性,导致PMML可以实现跨平台部署,是企业中部署机器学习模型的常见解决方案。

3、TensorFlow Serving

使用TensorFlow Serving进行服务部署,一般需要2台以上机器。
(1)其中一台作为TensorFlow Serving的服务器,这台服务器是专门来做模型部署和预测用,对于这台服务器,一般建议使用GPU服务器,这样会使整个推理预测的过程变得很快;
(2)另外一台服务器是业务服务器,也就是接收用户的输入以及其他业务处理的服务器。我们可以把模型部署到TensorFlow Serving的服务器上,而一般我们只需要先在服务器上使用docker创建一个TensorFlow Serving服务,然后将模型文件上传上去,当有请求进来的时候,业务服务会直接对模型所在的服务器发起服务调用,并得到模型预测的结果。
一般来讲,整个流程如下:
保存模型 -》 转换Pb格式-》TF-Serving运行

三、实际用时的一些部署方法组合

1、R+pmml+spark+airflow调度

用R语言训练模型并转为pmml文件,然后使用spark将这个pmml文件封装为jar,使用airflow提交到yarn。

val is: InputStream = fs.open(path)

val pmml: PMML = PMMLUtil.unmarshal(is)

modelEvaluator = ModelEvaluatorFactory.newInstance.newModelEvaluator(pmml)

2、python+sklearn+airflow调度

使用python训练好sklearn模型,并joblib.dumps()保存,然后在python文件中joblib.load()加载改文件,使用airflow离线调度。

3、xgboost+spark+xgb4j

使用分布式的spark版的xgboost,训练好的模型直接保存为二进制文件model.booster.saveModel(hdfsOutStream),然后xgboost4j加载该文件XGBoost.loadModel(is)实现线上实时预测。

4、tensorflow+tensorflow的java库

(1)ft模型先转为protobuf协议的模型,

frozen_graph = freeze_session(get_session(), output_names=["output"])

tf.train.write_graph(frozen_graph, "./", "model.pb", as_text=False)

(2)然后使用tf的java库加载改pb模型,在线预测

try (Graph graph = new Graph()) {
      graph.importGraphDef(Files.readAllBytes(Paths.get("xxx/model.pb")));   
      try (Session sess = new Session(graph)) {        
              float[][] input = xxx;        
              try (Tensor x = Tensor.create(input);            
              Tensor y = sess.runner().feed("input", x).fetch("output").run().get(0)) {                            
                      float[][] result = new float[1][y.shape[1]];            
                       y.copyTo(result);                                                
                       System.out.println(Arrays.toString(y.shape()));                  
                       System.out.println(Arrays.toString(result[0]));        
              }    
     }
}...  

5、keras+Flask

python环境先将keras模型保存为hdf5文件model.save(model.h5),然后在轻量级的web框架flask中加载实现线上预测。

四、不同需求对应的不同平台部署方案

1、放到服务器上跑,要求吞吐和时延(重点是吞吐)这种应用在互联网企业居多,一般是互联网产品的后端AI计算,例如人脸验证、语音服务、应用了深度学习的智能推荐等。

由于一般是大规模部署,这时不仅仅要考虑吞吐和时延,还要考虑功耗和成本。所以除了软件外,硬件也会下功夫,比如使用推理专用的NVIDIA P4、寒武纪MLU100等。这些推理卡比桌面级显卡功耗低,单位能耗下计算效率更高,且硬件结构更适合高吞吐量的情况软件上,一般都不会直接上深度学习框架。对于NVIDIA的产品,一般都会使用TensorRT来加速(不仅可以加速前传,还包含调度功能)。TensorRT用了CUDA、CUDNN,而且还有图优化、fp16、int8量化等。

五、模型部署时一些常用的trick

1、模型压缩

基于参数修剪和共享的方法针对模型参数的冗余性,试图去除冗余和不重要的项。基于低秩因子分解的技术使用矩阵/张量分解来估计深度学习模型的信息参数。基于传输/紧凑卷积滤波器的方法设计了特殊的结构卷积滤波器来降低存储和计算复杂度。知识蒸馏方法通过学习一个蒸馏模型,训练一个更紧凑的神经网络来重现一个更大的网络的输出。

一般来说,参数修剪和共享,低秩分解和知识蒸馏方法可以用于全连接层和卷积层的CNN,但另一方面,使用转移/紧凑型卷积核的方法仅支持卷积层。低秩因子分解和基于转换/紧凑型卷积核的方法提供了一个端到端的流水线,可以很容易地在CPU/GPU环境中实现。相反参数修剪和共享使用不同的方法,如矢量量化,二进制编码和稀疏约束来执行任务,这导致常需要几个步骤才能达到目标。


模型压缩.png

参考:
https://www.zhihu.com/question/329372124/answer/743251971

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335