還不會機器學習模型部署?15 張圖帶你走進TensorFlow 部署框架!
開篇
前幾日與一位從事開發(fā)3年的朋友小李聊天,得知他所在的企業(yè)正在進行機器學習相關的項目。最近,他接到了一個任務,就是將訓練好的機器學習模型進行部署。這可愁壞了小李,他接觸機器學習開發(fā)差不多有小半年了,主要從事收集數(shù)據(jù)、數(shù)據(jù)清洗、搭建環(huán)境、訓練模型、模型評估的相關工作,但做模型部署還是第一次。
于是,我根據(jù)自己的經(jīng)驗針對機器學習的模型部署進行了科普。如圖1 所示,在傳統(tǒng)編程中,我們將規(guī)則和數(shù)據(jù)傳遞給程序獲得我們想要的答案,而對于機器學習而言,我們是通過答案和數(shù)據(jù)訓練出規(guī)則,這個規(guī)則就是機器學習的模型。
圖1 傳統(tǒng)編程和機器學習的區(qū)別
而機器學習的模型部署就是要將這個規(guī)則(模型)部署到需要應用機器學習的終端上。如圖2 所示,機器學習所訓練出來的模型,可以理解為函數(shù)、API或者SDK,部署到對應的終端上(圖中灰色部分)。部署之后終端就具備模型所賦予的能力,此時輸入新的數(shù)據(jù)就可以根據(jù)規(guī)則(模型)得到預測的結果。
圖2 機器學習模型部署原理
TensorFlow 機器學習部署框架
小李聽了我的介紹表示能夠理解,并饒有興致地將他們項目的部署情況向我全盤托出,想征求我的意見。如圖3所示,他們要將一個圖像識別的模型分別部署到IOS、Android、樹莓派、Web瀏覽器以及服務器端。
圖3 模型部署場景
從部署的應用場景來看,具有輕量級、跨平臺的特點。同一個機器學習模型要部署到多個不同的平臺,每個平臺的存儲和運算能力都不相同。同時,還是兼顧模型運行的可用性、性能、安全性、可擴展性,需要使用相對穩(wěn)定的大平臺。于是,我把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 解釋器加載執(zhí)行。
第一步,我們在模型訓練已經(jīng)完成了,第二步是將生成好的模型轉化成TensorFlow Lite 能夠識別和使用的模式格式。正如上面所提到的,模型是在移動端使用的需要考慮各方面的問題,因此需要針對移動端生成專門的文件格式。第三部就是將轉化好的TensorFlow Lite文件加載到移動端的解釋器中并執(zhí)行。
由于我們的重點在模型的部署,因此第一步的訓練模型暫時跳過,也就是假設你已經(jīng)訓練好模型了。針對第二步的模型轉化可以參考圖5,TensorFlow 的模型會通過Converter 將其轉化成后綴是”.tflite”的模型文件,然后發(fā)布到不同的平臺,通過每個平臺上的解釋器對其進行解釋和加載。
圖5 TensorFlow Lite 模型轉化架構
模型保存和轉化
上面介紹了TensorFlow Lite 的架構,這里需要將模型保存為TensorFlow 模型,并對其進行轉化。如圖6 所示,我們調(diào)用TensorFlow 中的saved_model.save方法將model(訓練好的模型)保存在指定目錄中。
圖6 保存TensorFlow 模型
保存完模型之后就是轉化模型了,如圖7 所示,調(diào)用TensorFlow Lite 中的TFLiteConverter包中的from_saved_model方法生成converter(模型轉化器)的實例,然后調(diào)用converter中的convert方法對模型進行轉化,并將轉換好的文件保存到指定目錄。
圖7 轉化為tflite 模型格式
加載應用模型
由于本例是針對Android 系統(tǒng)的模型部署,因此需要在Android 中引入TensorFlow Lite的依賴。如圖8 所示,引入TensorFlow Lite的依賴,同時在aaptOptions 中設置noCompress 為“tflite”意思是對與“tflite”的文件不進行壓縮,如果設置壓縮Android系統(tǒng)可能無法識別tflite的文件。
圖8 項目中引入TensorFlow Lite的依賴
配置好依賴之后,再將轉換好的tflite文件拷貝到assets文件下面,如圖9所示,等下會加載這個文件執(zhí)行機器學習的模型。
圖9 添加tflite文件
添加完tflite文件之后,我們會創(chuàng)建Classifier 分類器,用來對“貓狗”圖片進行分類。如圖10 所示,在Classifer中的init中會對解釋器(interpreter)進行初始化,調(diào)用loadModuleFlie方法加載tflite文件,同時指定分類標簽(labelList),這里的標簽就是“cat dog”(貓狗)。
圖10 初始化解釋器
在創(chuàng)建分類器之后,就是利用貓狗的分類模型對圖片進行識別了。也就是在Classifier類中,如圖10所示,convertBitmapToByteBuffer方法輸入?yún)?shù)是bitmap,這個是我們輸入的貓狗的圖片,在這個方法中會對其進行轉化,特別注意的是在for 循環(huán)中對紅綠藍三個通道轉化,將轉換的結果放入到byteBuffer 中并且返回。recoginzeImage 方法會調(diào)用convertBitmapToByteBuffer,并利用解釋器interpreter 的run方法執(zhí)行圖片識別的工作,也就是利用機器學習的模型識別貓狗的圖片。
圖11 對圖片進行識別
上面的圖形轉化過程過于抽象,我們將其具體為圖12 所示內(nèi)容。我們輸入的圖像是圖左上方的395*500的圖片,會把imageView中的圖片轉化為bitmap的形式。由于我們的模型輸入需要224*224 的格式,因此需要做一次轉換。接著,把像素放入到224*224 的ByteBuffer的數(shù)組中保存,最后對RGB(紅綠藍)的像素進行歸一化(除以255),作為模型的輸入?yún)?shù)。
圖12 輸入圖像的轉化過程
到這里機器學習模型的加載和應用就完成,當然還少不了輸入的文件和布局。如圖13 所示,我們在drawable 文件夾下面存放需要預測的圖片(貓狗圖片)。然后在layout下面創(chuàng)建activity_image_classifier.xml文件用來構建存放ImageView。
圖13 輸入圖片文件和布局文件
最后,創(chuàng)建ImageClassifierActivity 用來展示圖片和響應識別圖片的事件。如圖14 所示,在initViews方法中綁定每張圖片的onclick事件,然后在onclick方法中調(diào)用recoginzie Image方法對圖片進行識別。
圖14 在onclick 中執(zhí)行圖片識別
讓我們來看看效果。如圖15 所示,當點擊對應圖片以后會顯示“dog”的提示,表示預測結果。
圖15 演示效果
回顧整個過程并不復雜,我將TensorFlow lite 部署模型總結為如下幾步:
- 保存機器學習模型。
- 轉化模型為tflite格式。
- 加載tflite格式的模型。
- 利用解釋器加載模型。
- 輸入?yún)?shù)預測結果。
想更進一步學習TensorFlow 模型部署技能的同學,可以去學TensorFlow的官方課程,在中國大學MOOC上注冊一個賬號,免費學習:??https://www.icourse163.org/course/youdao-1467217161?from=searchPage&outVendor=zw_mooc_pcssjg_。??
還有谷歌開發(fā)者專家做的部署在線講解和答疑,非常不錯,推薦想初步了解TensorFlow 部署功能的同學關注看看 ??https://zhibo.51cto.com/liveDetail/373。??
結尾
小李聽了我對機器學習模型部署的講解以及了解TensorFlow 部署的過程以后,對部署實操更是躍躍欲試。我覺得用TensorFlow 部署過程邏輯清晰,方法簡單易行,對于3-5年經(jīng)驗的開發(fā)人員來說容易上手。另外,TensorFlow官方還提供了《TensorFlow入門實操課程》,適合機器學習零基礎的新手:??https://www.icourse163.org/course/youdao-1460578162?from=searchPage&outVendor=zw_mooc_pcssjg_。??
作者介紹
崔皓,51CTO社區(qū)編輯,資深架構師,擁有20年架構經(jīng)驗。曾任惠普技術專家,參與多個機器學習項目,撰寫、翻譯20多篇機器學習、NLP等熱門技術文章?!斗植际郊軜嬙砼c實踐》作者。