機器學習與結構化數據 (3):部署 Web 應用程序

透過這篇文章,您可以透過運行在  App Engine 上的 Web 應用程式來使用 Prediction API,以進行線上預測。這將是機器學習與結構化數據系列文章的最後一篇,將接續系列二的訓練模型

架構

這篇文章將用到下圖中虛線內的元件:


部署在 App Engine 上的 Web 應用程式來提供線上預測,並根據母親的相關背景資料,來提供預測嬰兒的體重基本數據。而這篇 Web 應用程式將使用部署在第二篇系列文的 Prediction API 作為其後端基礎。Managed ML Service 將負責託管 Prediction API,並將嬰兒體重預測值回傳到指定的 Web 應用程式的輸入數據。

在開始之前

請先完成第二篇系列文的內容,再開始這一部分。

費用

這篇教學文章將使用以下計價元件:

  • App Engine
  • Cloud ML Engine

根據定價公式,假設你用上述每個元件一整天,那運行這教程將花費約 0.16 美元。

驗證 Prediction API 服務

  1. 開一個新的 Cloud Shell 視窗 [OPEN CLOUD SHELL]
  2. 以下指令會回傳已經部署完畢的模型名稱
    gcloud ml-engine models list
    確認 babyweight 模型名稱以及回傳的 DEFAULT_VERSION_NAME 等於 soln。

    NAME        DEFAULT_VERSION_NAME
    babyweight  soln
    

下載 babyweight 應用程式

  1. 在 Cloud Shell 裡面,下載 babyweight 應用程式的文件,並且設定你現在所處的資料夾。

    git clone https://github.com/GoogleCloudPlatform/training-data-analyst
        cd training-data-analyst/blogs/babyweight/application
    

    資料夾中包含以 Python 跟 JavaScript 所編寫的程式碼。以下的文件完成了大部分的工作:

  • main.py 這是一個運行在 App Engine 的 Python 程式。它提供一個可以回傳嬰兒體重預測值的 API 服務。從架構圖中可以看到,要取得這個預測值,它使用了部署在 Managed ML Service 上面的 Prediction API 服務。
  • templates/form.html 是一個包含 JavaScript 程式碼的 HTML 文件,呈現如下所示的輸入表單。它將 REST API 請求發送到在 App Engine 上運行的後端應用程式,然後顯示結果。

以下是 babyweight應用程式的輸入表單:

跟 Prediction API 互動溝通

以下 main.py 程式碼區段將請求發送到在 Cloud ML Engine 上託管的 Prediction API。要注意以下的行號跟 Github 程式碼庫所顯示的行號是相同的。

   32: credentials = GoogleCredentials.get_application_default()
    33: api = discovery.build('ml', 'v1', credentials=credentials)
    34: project = app_identity.get_application_id()
    35: model_name = os.getenv('MODEL_NAME', 'babyweight')

    41: def get_prediction(features):
    42:   input_data = {'instances': [features]}
    43:   parent = 'projects/%s/models/%s' % (project, model_name)
    44:   prediction = api.projects().predict(body=input_data, name=parent).execute()
    45:   return prediction['predictions'][0]['outputs']

此程式碼的邏輯跟您在系列二的訓練模型中使用的 notebook 範例相同。

  • 第 33 行實例化一個 API Client object,並透過它的方法在第 44 行發送一個 API 請求。

    api = discovery.build('ml', 'v1', credentials=credentials)
    …
    prediction = api.projects().predict(body=input_data, name=parent).execute()
    
  • 這個 features 選項被傳遞到第 41 行的 get_prediction 。它由一個 Python dictionary 組成,其中包含使用者藉由 input form 所輸入的 input data。在應用程式啟動時,這個 API Client 會被實例化,並重複使用於每次的 prediction call。
    def get_prediction(features):
  • 假設這個 App Engine 程式碼跟您用來創建 Cloud ML Engine 模型是運行在同一個 project 中。 如果不是,則需要在第 34 行中明確指定 Project 名稱,並加上 API keys 或 OAuth 2.0 等身份驗證機制。請參考 Google API Python client 入門指南

    34: project = app_identity.get_application_id()
    
  • 在這個範例中,模型版本沒有在第 43 行中被指定,因此將會使用已經部署好的模型預設版本

    43: parent = 'projects/%s/models/%s' % (project, model_name)
    

部署 babyweight 應用程式

  1. 在 Cloud Shell 中,下載應用程式所需要的程式碼庫

    pip install -r requirements.txt -t lib
    
  2. 部署程式碼

    gcloud app create --region=us-central
    gcloud app deploy
    

當您在 Cloud Shell 中執行這些命令時,您的 project id 會自動對應到應用程式,應用程式 URL 會被定義為 https://[PROJECT_ID].appspot.com。現在你可以在瀏覽器中輸入 URL 來存取嬰兒體重預測的應用程式。

注意:這個應用程式是公開的,所以你不應該直接使用它,因為它可以在你不知情或未經你許可的情況下被使用。 您應該考慮添加身份驗證。 請參閱 User Authentication

清理

完成本教程後,記得清除您在 GCP 上創建的資源,將來才不會因此被收費。以下部份將介紹如何刪除這些資源。

刪除 Project

避免被收費的最簡單方式是刪除你為此教程所創建的 Project。

如何刪除 Project:

警告:刪除項目可能會產生以下後果
*如果您刪除的是既有的 Project,那您也會將您在這個 Project 中曾經完成的工作一併刪除。
*您不能重複使用已刪除 Project 的 Project ID。 如果您新建了一個未來可能會用到的客製化 Project ID,則你應該刪除的是 Project 裡面的資源,而非 Project。這可以確保使用 Project ID 的網址(例如appspot.com網址)仍可使用。
*如果您會持續尋找更多的教程和 quickstart,建議您重複使用 Project 以避免超出 Project 的配額限制。

  1. 進入 Cloud Platform Console,去 Projects 的頁面。
    (GO TO THE PROJECTS PAGE)
  2. 在 Project 列表中,選擇要刪除的 project 並點擊 Delete project

在方框中輸入 Project ID,然後點擊 Shut down 以刪除該 Project。

下一步

延伸閱讀

機器學習與結構化數據(1):數據分析和準備
機器學習與結構化數據 (2-1):訓練模型
機器學習與結構化數據 (2-2):訓練模型

(原文翻譯自 Google Cloud。)

 


連絡「GCP 專門家」