教程帖:使用TensorFlow服務和Flask部署Keras模型!

人工智慧頻道發表於2018-10-26

部署Keras模型通常需要抽象出你的機器學習模型,並將其與易於使用的API端點一起部署或整合。例如,我們可以提供一個URL端點,任何人都可以使用它來發出POST請求,他們會得到模型推斷的JSON響應,而不必擔心其技術性細節。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


在本教程中,我們將建立一個TensorFlow伺服器來部署我們在Keras內建的InceptionV3影像分類卷積神經網路(CNN)。 然後,我們將建立一個簡單的Flask伺服器,該伺服器將接受POST請求並執行Tensorflow伺服器所需的一些影像預處理,並返回JSON響應。

什麼是TensorFlow服務?

TensorFlow服務是你訓練應用機器學習模型的方式。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


瞭解TensorFlow服務(https://www.youtube.com/watch?v=q_IkJcPyNl0)

TensorFlow服務使得投入生產的過程模型更容易、更快速。它允許你安全地部署新模型並執行實驗,同時保持相同的伺服器體系結構和API。開箱即用,它提供了與TensorFlow的整合,而且它可以擴充套件為其他型別的模型。

安裝TensorFlow服務

先決條件:請建立一個python虛擬環境,並在其中安裝帶有TensorFlow後端的Keras。在這裡閱讀更多(https://keras.io/#installation)

注意:所有命令都在Ubuntu 18.04.1 LTS的python虛擬環境中執行。

現在,在同一虛擬環境中執行以下命令(使用sudo獲取root許可權):

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


你可以使用以下命令升級到tensorflow-model-server的較新版本:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


我們將要構建的目錄概述

在開始之前瞭解目錄結構將有助於我們清楚地瞭解每個步驟的位置。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


你可以從我的GitHub儲存庫中獲取所有這些檔案:https://github.com/himanshurawlani/keras-and-tensorflow-serving

匯出用於Tensorflow服務的Keras模型

在本教程中,我們將使用download_inceptionv3_model.py在Keras中下載並儲存具有Imagenet權重的InceptionV3 CNN。你可以下載keras.applications庫中提供的任何其他模型,或者如果你在Keras中構建了自己的模型,則可以跳過此步驟。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


執行上面的指令碼後,你應該得到以下輸出:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


現在我們以Keras格式儲存了我們的InceptionV3 CNN(inception.h5)。我們希望以TensorFlow伺服器可以處理的格式匯出我們的模型。我們通過執行export_saved_model.py指令碼來完成此操作。

TensorFlow提供了SavedModel格式作為匯出模型的通用格式。在後臺中,我們的Keras模型完全按照TensorFlow物件進行指定,因此我們可以使用Tensorflow方法將其匯出。TensorFlow提供了一個便利的函式tf.saved_model.simple_save(),這適用於大多數用例。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


輸出:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


我們收到此警告是因為我們已經下載了預先訓練過的模型。我們可以使用這個模型進行推理,但如果我們想進一步訓練它,我們需要在載入後執行compile()函式。現在可以安全地忽略此警告。執行此指令碼後,以下檔案儲存在my_image_classifier目錄中:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


假設我們將來想要更新我們的模型(可能是因為我們收集了更多的訓練資料並在更新的資料集上訓練了模型),我們可以這樣做:

1. 在新的keras模型上執行相同的指令碼

2. 在export_saved_model.py中將export_path ='../my_image_classifier/1'更新為export_path ='../ my_image_classifier/2'

TensorFlow服務將在my_image_classifier目錄中自動檢測模型的新版本,並在伺服器中更新它。

啟動TensorFlow伺服器

要在本地計算機上啟動TensorFlow伺服器,請執行以下命令:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


·--model_base_path:這必須是一個絕對路徑,否則你會得到一個錯誤提示:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


·--rest_api_port:Tensorflow服務將在埠8500上啟動gRPC ModelServer,並且REST API將在埠9000上可用。

·--model_name:這將是你將用於傳送POST請求的服務伺服器的名稱。你可以在此處輸入任何名稱。

測試我們的TensorFlow伺服器

教程帖:使用TensorFlow服務和Flask部署Keras模型!


從原始資料到生產模型(來源https://twitter.com/tensorflow/status/832008382408126464)

serving_sample_request.py指令碼向TensorFlow服務伺服器發出POST請求。輸入影像通過命令列引數傳遞。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


輸出:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


與後續呼叫相比,TensorFlow服務伺服器需要稍多的時間來響應第一個請求。

為什麼我們需要Flask伺服器?

我們可以看到,我們在serving_sample_request.py(前端呼叫者)中執行了一些影像預處理步驟。以下是在TensorFlow伺服器上建立Flask伺服器的原因:

·當我們向前端團隊提供API端點時,我們需要確保不會因預處理技術問題而造成阻礙。

·我們可能並不總是擁有Python後端伺服器(例如Node.js伺服器),因此使用numpy和keras庫進行預處理可能會很麻煩。

·如果我們計劃提供多個模型,那麼我們將不得不建立多個TensorFlow服務伺服器,並且必須在我們的前端程式碼中新增新的URL。但是我們的Flask伺服器會保持域URL相同,我們只需要新增一個新路由(一個函式)。

·可以在Flask應用程式中執行基於訂閱的訪問、異常處理和其他任務。

我們要做的是消除TensorFlow伺服器和我們的前端之間的緊密耦合。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


多個TensorFlow服務伺服器隱藏在Flask伺服器後面

在本教程中,我們將在與TensorFlow服務相同的機器和相同的虛擬環境中建立Flask伺服器,並使用已安裝的庫。理想情況下,兩者都應該在不同的機器上執行,因為太多的請求會導致Flask伺服器因為執行影像預處理而變慢。此外,如果請求數量非常高,單個Flask伺服器可能還不夠。如果我們有多個前端呼叫者,我們可能還需要一個排隊系統。儘管如此,我們可以使用這種方法來制定令人滿意的概念證明。

建立Flask伺服器

先決條件:從此處在python虛擬環境中安裝Flask。

我們只需要一個app.py檔案來建立我們的Flask伺服器。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


轉到儲存app.py檔案的目錄,然後使用以下命令啟動Flask伺服器:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


·FLASK_ENV =development:這啟用了除錯模式,它基本上為你提供了完整的錯誤日誌。不要在生產環境中使用它。

·flask run命令自動執行當前目錄中的app.py檔案。

·--host = 0.0.0.0:這使你可以從任何其他計算機向Flask伺服器發出請求。要從其他計算機發出請求,你必須指定執行Flask伺服器的計算機的IP地址來代替localhost。

輸出:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


使用上一個命令啟動TensorFlow服務伺服器:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


這是一個指令碼(auto_cmd.py),用於自動啟動和停止兩個伺服器(TensorFlow Serving和Flask)。你也可以為兩個以上的伺服器修改此指令碼。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


請記住更改auto_cmd.py第10行的路徑,使其指向app.py的目錄。你可能還需要更改第6行,以使其指向虛擬環境的bin。然後,你可以通過在終端中執行以下命令從任何目錄執行上述指令碼:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


測試我們的Flask伺服器和TensorFlow伺服器

我們使用flask_sample_request.py指令碼發出示例請求。該指令碼基本上模仿了來自前端的請求:

1. 我們獲取輸入影像,將其編碼為base64格式,並使用POST請求將其傳送到Flask伺服器。

2. Flask伺服器解碼此base64格式併為我們的TensorFlow伺服器預處理它。

3. 然後,Flask伺服器向我們的TensorFlow伺服器發出POST請求並解碼響應。

4. 解碼後的響應被格式化併傳送回前端。

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


輸出:

教程帖:使用TensorFlow服務和Flask部署Keras模型!


教程帖:使用TensorFlow服務和Flask部署Keras模型!


我們的flask伺服器目前只有一條路由用於我們的單個Tensorflow伺服器。我們可以通過在不同或相同的機器上建立多個Tensorflow伺服器來提供多種模型。為此,我們只需要在app.py檔案中新增更多路由(函式),並在其中執行所需的模型特定預處理。我們可以將這些路線提供給我們的前端團隊,讓他們根據需要呼叫模型。

處理跨源HTTP請求

考慮這樣一個場景,我們使用Angular發出POST請求,我們的Flask伺服器接收OPTIONS標頭,而不是POST。

·當Web應用程式在請求具有與其自己的源不同的源(域,協議和埠)的資源時,會發出跨源HTTP請求。

·CORS(跨源資源共享)是一種機制,它使用其他HTTP標頭告訴瀏覽器讓在一個源(域)上執行的Web應用程式有權從不同來源的伺服器訪問所選資源。在此處閱讀有關CORS的更多資訊(https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS)

因此,Angular不會從Flask伺服器返回任何響應。要解決這個問題,我們必須在app.py中啟用Flask-CORS。在這裡瞭解更多。(https://flask-cors.readthedocs.io/en/latest/index.html)

結論

這就是我們為機器學習模型提供服務所需的全部內容。TensorFlow服務使機器學習整合到網站和其他應用程式中變得非常容易。由於keras(https://github.com/keras-team/keras-applications)提供了大量預構建模型,因此利用最少的機器學習和深度學習演算法知識來開發超級有用的應用程式是可能的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31545819/viewspace-2217665/,如需轉載,請註明出處,否則將追究法律責任。

相關文章