还不会机器学习模型部署?15 张图带你走进TensorFlow 部署框架!

人工智能 机器学习
我根据自己的经验针对机器学习的模型部署进行了科普。在传统编程中,我们将规则和数据传递给程序获得我们想要的答案,而对于机器学习而言,我们是通过答案和数据训练出规则,这个规则就是机器学习的模型。

开篇

前几日与一位从事开发3年的朋友小李聊天,得知他所在的企业正在进行机器学习相关的项目。最近,他接到了一个任务,就是将训练好的机器学习模型进行部署。这可愁坏了小李,他接触机器学习开发差不多有小半年了,主要从事收集数据、数据清洗、搭建环境、训练模型、模型评估的相关工作,但做模型部署还是第一次。

于是,我根据自己的经验针对机器学习的模型部署进行了科普。如图1 所示,在传统编程中,我们将规则和数据传递给程序获得我们想要的答案,而对于机器学习而言,我们是通过答案和数据训练出规则,这个规则就是机器学习的模型。

图1 传统编程和机器学习的区别

而机器学习的模型部署就是要将这个规则(模型)部署到需要应用机器学习的终端上。如图2 所示,机器学习所训练出来的模型,可以理解为函数、API或者SDK,部署到对应的终端上(图中灰色部分)。部署之后终端就具备模型所赋予的能力,此时输入新的数据就可以根据规则(模型)得到预测的结果。

图2 机器学习模型部署原理

TensorFlow 机器学习部署框架

小李听了我的介绍表示能够理解,并饶有兴致地将他们项目的部署情况向我全盘托出,想征求我的意见。如图3所示,他们要将一个图像识别的模型分别部署到IOS、Android、树莓派、Web浏览器以及服务器端。

图3 模型部署场景

从部署的应用场景来看,具有轻量级、跨平台的特点。同一个机器学习模型要部署到多个不同的平台,每个平台的存储和运算能力都不相同。同时,还是兼顾模型运行的可用性、性能、安全性、可扩展性,需要使用相对稳定的大平台。于是,我把TensorFlow 的机器学习部署框架推荐给他。如图4所示,TensorFlow的部署框架针对不同平台分别提供组件进行支撑。其中Android、IOS、树莓派对应的是TensorFlow Lite,它是专门用于移动端的模型部署框架。浏览器端可以使用TensorFlow.js,而服务器端可以使用TensorFlow Serving。

图4 TensorFlow 机器学习模型部署框架

TensorFlow Lite 实际操作

小李想了解更加具体的部署过程,刚好我手上有一个项目用到了TensorFlow 的部署框架,于是将其过程演示给他看看。这个项目是要将“猫狗识别”的模型部署到Android 手机上,由于IOS 、Android、树莓派、浏览器都属于客户端,其拥有的运算资源不可能和服务器相比。特别是移动端的应用都有轻量、低延迟、高效、隐私保护、省电等特点,因此TensorFlow 对其进行的专门的部署设计,并使用TensorFlow Lite 对其进行部署。

利用TensorFlow Lite 对模型进行部署需要三步:

  1.  使用TensorFlow 训练模型。
  2.  转化TensorFlow Lite 格式。
  3. 使用TensorFlow Lite 解释器加载执行。

第一步,我们在模型训练已经完成了,第二步是将生成好的模型转化成TensorFlow Lite 能够识别和使用的模式格式。正如上面所提到的,模型是在移动端使用的需要考虑各方面的问题,因此需要针对移动端生成专门的文件格式。第三部就是将转化好的TensorFlow Lite文件加载到移动端的解释器中并执行。

由于我们的重点在模型的部署,因此第一步的训练模型暂时跳过,也就是假设你已经训练好模型了。针对第二步的模型转化可以参考图5,TensorFlow 的模型会通过Converter 将其转化成后缀是”.tflite”的模型文件,然后发布到不同的平台,通过每个平台上的解释器对其进行解释和加载。

图5 TensorFlow Lite 模型转化架构

模型保存和转化

上面介绍了TensorFlow Lite 的架构,这里需要将模型保存为TensorFlow 模型,并对其进行转化。如图6 所示,我们调用TensorFlow 中的saved_model.save方法将model(训练好的模型)保存在指定目录中。

图6 保存TensorFlow 模型

保存完模型之后就是转化模型了,如图7 所示,调用TensorFlow Lite 中的TFLiteConverter包中的from_saved_model方法生成converter(模型转化器)的实例,然后调用converter中的convert方法对模型进行转化,并将转换好的文件保存到指定目录。

图7 转化为tflite 模型格式

加载应用模型

由于本例是针对Android 系统的模型部署,因此需要在Android 中引入TensorFlow Lite的依赖。如图8 所示,引入TensorFlow Lite的依赖,同时在aaptOptions 中设置noCompress 为“tflite”意思是对与“tflite”的文件不进行压缩,如果设置压缩Android系统可能无法识别tflite的文件。

图8 项目中引入TensorFlow Lite的依赖

配置好依赖之后,再将转换好的tflite文件拷贝到assets文件下面,如图9所示,等下会加载这个文件执行机器学习的模型。

图9 添加tflite文件

添加完tflite文件之后,我们会创建Classifier 分类器,用来对“猫狗”图片进行分类。如图10 所示,在Classifer中的init中会对解释器(interpreter)进行初始化,调用loadModuleFlie方法加载tflite文件,同时指定分类标签(labelList),这里的标签就是“cat dog”(猫狗)。

图10 初始化解释器

在创建分类器之后,就是利用猫狗的分类模型对图片进行识别了。也就是在Classifier类中,如图10所示,convertBitmapToByteBuffer方法输入参数是bitmap,这个是我们输入的猫狗的图片,在这个方法中会对其进行转化,特别注意的是在for 循环中对红绿蓝三个通道转化,将转换的结果放入到byteBuffer 中并且返回。recoginzeImage 方法会调用convertBitmapToByteBuffer,并利用解释器interpreter 的run方法执行图片识别的工作,也就是利用机器学习的模型识别猫狗的图片。

图11 对图片进行识别

上面的图形转化过程过于抽象,我们将其具体为图12 所示内容。我们输入的图像是图左上方的395*500的图片,会把imageView中的图片转化为bitmap的形式。由于我们的模型输入需要224*224 的格式,因此需要做一次转换。接着,把像素放入到224*224 的ByteBuffer的数组中保存,最后对RGB(红绿蓝)的像素进行归一化(除以255),作为模型的输入参数。

图12 输入图像的转化过程

到这里机器学习模型的加载和应用就完成,当然还少不了输入的文件和布局。如图13 所示,我们在drawable 文件夹下面存放需要预测的图片(猫狗图片)。然后在layout下面创建activity_image_classifier.xml文件用来构建存放ImageView。

图13 输入图片文件和布局文件

最后,创建ImageClassifierActivity 用来展示图片和响应识别图片的事件。如图14 所示,在initViews方法中绑定每张图片的onclick事件,然后在onclick方法中调用recoginzie Image方法对图片进行识别。

图14 在onclick 中执行图片识别

让我们来看看效果。如图15 所示,当点击对应图片以后会显示“dog”的提示,表示预测结果。

图15 演示效果

回顾整个过程并不复杂,我将TensorFlow lite 部署模型总结为如下几步:

  1.  保存机器学习模型。
  2. 转化模型为tflite格式。
  3.  加载tflite格式的模型。
  4.  利用解释器加载模型。
  5.  输入参数预测结果。

想更进一步学习TensorFlow 模型部署技能的同学,可以去学TensorFlow的官方课程,在中国大学MOOC上注册一个账号,免费学习:​https://www.icourse163.org/course/youdao-1467217161?from=searchPage&outVendor=zw_mooc_pcssjg_。​

还有谷歌开发者专家做的部署在线讲解和答疑,非常不错,推荐想初步了解TensorFlow 部署功能的同学关注看看 ​https://zhibo.51cto.com/liveDetail/373。​

结尾

小李听了我对机器学习模型部署的讲解以及了解TensorFlow 部署的过程以后,对部署实操更是跃跃欲试。我觉得用TensorFlow 部署过程逻辑清晰,方法简单易行,对于3-5年经验的开发人员来说容易上手。另外,TensorFlow官方还提供了《TensorFlow入门实操课程》,适合机器学习零基础的新手:​https://www.icourse163.org/course/youdao-1460578162?from=searchPage&outVendor=zw_mooc_pcssjg_。​

作者介绍

崔皓,51CTO社区编辑,资深架构师,拥有20年架构经验。曾任惠普技术专家,参与多个机器学习项目,撰写、翻译20多篇机器学习、NLP等热门技术文章。《分布式架构原理与实践》作者。

责任编辑:姜华 来源: 51CTO
相关推荐

2020-03-10 08:33:04

HTTP演变协议

2024-02-20 15:17:35

机器学习模型部署

2019-10-23 08:00:00

Flask机器学习人工智能

2021-01-25 09:00:00

机器学习人工智能算法

2022-09-07 08:00:00

机器学习MLFlow工具

2009-12-09 13:41:50

PHP Zend框架

2017-04-26 15:00:00

机器学习TensorFlow模型部署

2018-11-07 09:00:00

机器学习模型Amazon Sage

2021-05-18 06:55:07

Java AQS源码

2021-11-02 09:40:50

TensorFlow机器学习人工智能

2023-09-28 08:01:32

2019-01-23 11:12:42

机器学习机器模型预测工资

2020-03-26 08:00:00

机器学习人工智能AI

2023-02-07 16:36:34

机器学习Docker无服务器

2024-03-26 09:11:13

TensorFlow深度学习Pipeline

2023-01-06 18:50:55

架构应用

2020-05-21 14:05:17

TFserving深度学习架构

2020-07-10 10:39:04

Python开发工具

2018-01-08 09:09:46

机器学习模型NET

2020-06-28 07:39:44

Kafka分布式消息
点赞
收藏

51CTO技术栈公众号