开篇
前几日与一位从事开发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 对模型进行部署需要三步:
- 使用TensorFlow 训练模型。
- 转化TensorFlow Lite 格式。
- 使用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 部署模型总结为如下几步:
- 保存机器学习模型。
- 转化模型为tflite格式。
- 加载tflite格式的模型。
- 利用解释器加载模型。
- 输入参数预测结果。
想更进一步学习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等热门技术文章。《分布式架构原理与实践》作者。
文章版权声明
1 原创文章作者:7998,如若转载,请注明出处: https://www.52hwl.com/50800.html
2 温馨提示:软件侵权请联系469472785#qq.com(三天内删除相关链接)资源失效请留言反馈
3 下载提示:如遇蓝奏云无法访问,请修改lanzous(把s修改成x)
4 免责声明:本站为个人博客,所有软件信息均来自网络 修改版软件,加群广告提示为修改者自留,非本站信息,注意鉴别