前幾日與一位從事開發3年的朋友小李聊天,得知他所在的企業正在進行機器學習相關的專案.最近,他接到了一個任務,就是將訓練好的機器學習模型進行部署。這可愁壞了小李,他接觸機器學習開發差不多有小半年了,主要從事收集資料、資料清洗、建構環境、訓練模型、模型評估的相關工作,但做模型部署還是第一次。
於是,我根據自己的經驗針對機器學習的模型部署進行了科普。如圖1 所示,在傳統程式設計中,我們將規則和資料傳遞給程式來獲得我們想要的答案,而對於機器學習而言,我們是透過答案和資料訓練出規則,而這個規則就是機器學習的模型。
圖1 傳統程式設計與機器學習的差異
而機器學習的模型部署就是要將這個規則(模型)部署到需要應用機器學習的終端機。如圖2 所示,機器學習所訓練出來的模型,可以理解為函數、API或SDK,部署到對應的終端上(圖中灰色部分)。部署之後終端機就具備模型所賦予的能力,此時輸入新的資料就可以根據規則(模型)來預測的結果。
圖2 機器學習模型部署原則
小李聽了我的介紹表示能夠理解,並饒有興致地將他們專案的部署情況向我全盤托出,想徵求我的意見。如圖3所示,他們要將一個影像辨識的模型分別部署到IOS、Android、樹莓派、Web瀏覽器以及伺服器端。
圖3 模型部署場景
從部署的應用程式場景來看,具有輕量級、跨平台的特色。同一個機器學習模型要部署到多個不同的平台,每個平台的儲存和運算能力都不相同。同時,還是兼顧模型運行的可用性、效能、安全性、可擴充性,需要使用相對穩定的大平台。於是,我把TensorFlow 的機器學習部署框架推薦給他。如圖4所示,TensorFlow的部署框架針對不同平台分別提供元件進行支撐。其中Android、IOS、樹莓派對應的是TensorFlow Lite,它是專門用於行動端的模型部署框架。瀏覽器端可以使用TensorFlow.js,而伺服器端可以使用TensorFlow Serving。
圖4 TensorFlow 機器學習模型部署框架
#小李想了解更具體的部署流程,剛好我手上有一個專案用到了TensorFlow 的部署框架,於是將其流程示範給他看看。這個專案是要將「貓狗識別」的模型部署到Android 手機上,由於IOS 、Android、樹莓派、瀏覽器都屬於客戶端,其擁有的運算資源不可能和伺服器相比。特別是行動端的應用都有輕量、低延遲、高效、隱私保護、省電等特點,因此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 部署模型總結為以下幾個步驟:
想更進一步學習TensorFlow 模型部署技能的同學,可以去學TensorFlow的官方課程,在中國大學MOOC上註冊一個帳號,免費學習:#https://www.php.cn/link/1f5f6ad95cc908a20bb7e30ee28a5958
#還有Google開發者專家做的部署線上講解和答疑,非常不錯,推薦想初步了解TensorFlow 部署功能的同學關注看看#https://www.php.cn/link /e046ede63264b10130007afca077877f
小李聽了我對機器學習模型部署的講解以及了解TensorFlow 部署的過程以後,對部署實操更是躍躍欲試。我覺得用TensorFlow 部署過程邏輯清晰,方法簡單易行,對於3-5年經驗的開發人員來說容易上手。另外,TensorFlow官方也提供了《TensorFlow入門實操課程》,適合機器學習零基礎的新手:#https://www.php.cn/link/bf2fe6582ed9ead9161a3d6f6b1d6858
崔皓,51CTO社群編輯,資深架構師,擁有20年架構經驗。曾任惠普技術專家,參與多個機器學習項目,撰寫、翻譯20多篇機器學習、NLP等熱門技術文章。 《分散式架構原理與實務》作者。
以上是還不會機器學習模型部署? 15 張圖帶你走進TensorFlow 部署框架!的詳細內容。更多資訊請關注PHP中文網其他相關文章!