預測總覽

您可以在雲端中託管訓練完成的機器學習模型,並使用 AI Platform 預測來推論新資料的目標值。本頁面介紹模型的託管和預測程序,並說明專案注意事項。

運作方式

AI Platform 預測會管理雲端中的運算資源,以便執行您的模型。您可以從模型中提出預測要求,並取得模型的預測目標值。以下是在雲端環境中進行預測的設定程序:

  1. 您可以將模型匯出為構件,並部署至 AI Platform 預測。

  2. 在 AI Platform 中建立模型資源,然後從已儲存的模型建立模型版本。

    如果您正在部署自訂預測處理常式,請一併提供要在預測時執行的程式碼。

  3. 為用於預測的輸入資料設定格式,並提出線上預測或批次預測要求。

  4. 使用線上預測時,服務會執行您儲存的模型,然後傳回要求的預測做為呼叫的回覆訊息。

    • 模型版本會部署至您在建立模型時指定的地區。
    • 雖然我們無法提供保證,但您經常使用的模型版本通常隨時可以執行。

    如果您使用的是僅支援 TensorFlow 模型的批次預測,其預測程序會涉及較多層面:

    1. 預測服務會分配執行工作所需的資源。這包含了一個或多個預測節點。

    2. 服務會在每個分配的節點上還原 TensorFlow 圖形。

    3. 預測服務在分配的節點上分配輸入資料。

    4. 每個節點都會執行您的圖形,並將預測結果儲存到您指定的 Cloud Storage 位置。

    5. 處理完所有輸入資料後,服務會關閉您的工作,並釋出分配的資源。

模型部署

AI Platform 可以託管您的模型,讓您從雲端取得預測結果。託管已儲存模型的過程稱為「部署」。預測服務會管理大規模執行模型所需的基礎架構,並提供給線上和批次預測要求使用。本節將說明模型部署。

關於模型和版本

AI Platform 使用稱為「模型」和「版本」的資源來組織您訓練的模型。模型是一種機器學習解決方案。比方說,您想要建立名為 census 的模型,以容納您在美國人口普查機器學習模型中進行的所有工作。您建立的實體名為 census,是機器學習模型實際實作的容器,而實作則稱為版本。

部署機器學習模型是一項反覆進行的程序。因此,建立 AI Platform 資源典範時所做的假設即是您會為每個機器學習模型製作多個版本。這個術語可能會令人混淆,因為實際上 AI Platform 模型資源本身並不是機器學習模型。在 AI Platform 中,模型是指存放機器學習模型各個版本的容器。

版本中包含哪些內容?

您以模型版本的形式部署至 AI Platform 的「模型」含有一個或多個由託管架構 (TensorFlow、scikit-learn 或 XGBoost) 訓練作業產生的構件。您可以使用透過 AI Platform Training 在雲端環境訓練的模型,也可以使用在其他位置訓練的模型。

您也可以部署自訂預測處理常式 (Beta 版),藉此提供含有額外訓練構件和程式碼的模型版本來處理預測要求。

版本之間的差異

您可以為任何模型資源建立任意版本。即使您在兩個版本之間使用完全不同的機器學習模型,您仍可使用相同的模型資源。模型是一種組織工具,您可依照您的狀況進行使用。

當實際工作環境中已經有一個版本時,常會在各模型版本保持一致的輸入和輸出。這樣您就能切換版本,而不需要變更針對模型建置的其他應用程式結構。此外,您還能輕鬆地利用現有資料來測試新版本。

預設版本

每個至少具備一個版本的模型都有預設版本。預設版本是在建立第一個版本時設定的。如果您僅透過指定模型名稱來要求預測,AI Platform 即會使用該模型的預設版本。

請注意,服務只會自動設定預設版本一次,就是在您建立第一個版本時。您可以呼叫 projects.models.versions.setDefault,手動將任何後續版本設為預設值,這個方法也會顯示為 gcloud ai-platform versions set-default,以及 Google Cloud Platform Console「Model details」(模型詳細資料) 頁面中的「Versions」(版本) 清單選項 (如要前往模型詳細資料頁面,請在「Models」(模型) 頁面的模型清單中點選所需模型)。這可讓您使用穩定的預設版本在實際工作環境中提供預測,同時無需建立測試專屬的模型資源即可測試較新版本。

為模型和版本命名

模型和版本名稱必須符合下列規則:

  • 只能由混合大小寫的英文字母 (會區分大小寫)、數字和底線組成。
  • 以字母開頭。
  • 上限為 128 個字元。
  • 在特定專案 (如為模型) 或模型 (如為版本) 中不得重複。

除了上述的技術要求之外,沒有其他命名規定。這裡提供一些最佳做法:

  • 模型名稱應具描述性和獨特性,因為您可能需要從記錄或報告中列出的許多名稱中挑出所需的模型。
  • 版本名稱最好簡短。比方說,在資源清單中找出「v1」比找出「2017_01_29T13_54_58」容易。

模型和版本限制

AI Platform 配額政策將每個專案的模型數量上限設為 100 個,而將版本總數 (所有模型的版本加總) 上限設為 200 個。

模型部署參數

AI Platform 需要取得某些資訊以建立您的模型版本。此外您還可以設定部分選項。本節將說明這兩種類型的參數。您可以在 Version 物件中定義這些參數,也方便在 gcloud ai-platform versions create 指令中新增這些參數。

版本名稱
新版本的名稱,不得與模型中其他版本的名稱重複。
說明
您可為版本提供說明。目前只有透過 API 取得版本資訊才能提供說明;使用 gcloud 指令列工具或 GCP Console 都不會顯示此說明。
部署 URI
您必須提供儲存 SavedModel 的 Cloud Storage 位置的 URI。AI Platform 會從此位置提取模型並進行部署。此參數在 gcloud ai-platform versions create 指令中稱為 --origin。如果您部署自訂預測處理常式 (Beta 版),則可提供 Cloud Storage 目錄的 URI,其中包含模型版本用於預測的所有構件,而非僅有 SavedModel。
執行階段版本
除非您指定其他支援的版本,否則 AI Platform 會使用最新穩定的執行階段版本來部署您的模型版本。執行階段版本主要決定預測服務用來執行模型的 TensorFlow 版本。執行批次預測工作時,您可以選擇覆寫指派的執行階段版本。線上預測則一律會使用部署模型版本時設定的執行階段版本。
手動調度資源

您可以為模型版本指定持續運作的預測節點數量。詳情請參閱資源調度一節。

暫存值區

如果您使用 gcloud 指令列工具部署模型,可以在本機電腦上使用 SavedModel。此工具會在部署模型到 AI Platform 之前,將模型暫存在您指定的 Cloud Storage 位置。

預測的圖形變更

您可能已在運算圖形中加入 TensorFlow 運算。在訓練期間,運算圖形會相當實用。訓練好模型之後,您就可以從圖形中移除這些運算,然後再匯出最終版本。

訓練應用程式開發頁面中大部分的建議都是針對預測體驗。在某些情況下,有些會在您完成大量訓練後,準備好開始部署版本時,建議您對模型進行一些變更。

取得預測

您可以將新資料傳送至部署的模型版本以取得預測。下列各節將說明重要的預測注意事項。

線上預測與批次預測

瞭解線上預測和批次預測之間的差異

瞭解預測節點和資源分配

AI Platform 會以「節點時數」為單位,測量您進行預測所花費的處理量。本節將說明這些節點,以及如何針對不同預測類型來分配這些節點。

最簡單的方式是將節點視為虛擬機器 (VM),即使它們是以不同於傳統 VM 的機制實作。服務會以固定數量的處理能力和記憶體佈建每個節點,而且節點還具備作業系統映像檔和一組軟體設定,以執行模型並取得預測。

線上預測和批次預測都會透過分散式處理程序來執行節點,因此特定要求或工作可同時使用多個節點。服務會以分鐘為單位,依據每小時費率,向您收取節點總使用量的費用。舉例來說,執行兩個節點,每個節點各 10 分鐘的費用,和執行一個節點 20 分鐘相同。線上和批次預測以不同的方式分配節點,這項差異會大幅影響費用高低。

批次預測的節點分配

批次預測服務會調整服務所使用的節點數量,以盡量減少工作所需的時間。為了達成上述目標,服務會採取以下策略:

  • 啟動工作時,服務會分配一些節點來處理該工作。

  • 在工作期間調整節點數量,以發揮最大效率。每個節點都需要花一些時間啟動,因此服務試著分配剛好足夠的節點,讓啟動時間與縮短的工作時間互相抵銷。

  • 完成工作後立即關閉節點。

您只要指定使用的節點數量上限,即可影響批次預測工作的資源調度。您需要的節點數量通常等於服務將使用的節點數量,但是節點用量會受到 AI Platform 配額政策約束。您可能想要限制分配給特定工作的節點數量,尤其是當您和其他人共用專案,可能會同時執行 (訓練和預測) 工作時。

線上預測的節點分配

線上預測服務會調整使用的節點數量,以盡量處理最多要求,又不會造成太多延遲。為了達成上述目標,服務會採取以下策略:

  • 在要求長時間停頓後第一次要求預測時,分配一些節點。

  • 調整節點數量以因應要求流量,亦即在流量增加時新增節點,要求變少時移除節點。

  • 即使沒有待處理的要求,請至少讓一個節點在幾分鐘的時間內保持就緒,以處理要求。就緒狀態能確保服務可以立即為每個預測提供服務。

  • 如果模型版本在幾分鐘內都沒有收到預測要求,即可縮減為零個節點。

當服務縮減為零,或流量突然暴增時,可能需要花一些時間 (幾秒至幾分鐘) 才能初始化節點以處理要求。初始化時間取決於模型版本的大小,因此用戶端逾時可能會導致捨棄要求,直到服務已在這個期間初始化新節點和/或增加延遲時間。

如要確保能夠即時提供服務,您可以在模型版本中設定 minNodes 選項,藉此指定服務隨時可用的最少節點數量。由於您在服務未提供預測時仍需支付這些節點的費用,因此這項設定會增加成本。

自動調整資源配置的限制

AI Platform 針對線上預測自動調整資源配置,可協助您提供不同的預測要求率,同時又能降低成本。但是,這不適用於所有情況。服務讓節點上線的速度可能趕不上要求流量的尖峰。如果您的流量會定期遽增,或是應用程式需要穩定的低延遲時間,那麼您可以考慮使用「手動調整資源配置」

使用手動調整資源配置

您只要指定讓一些節點持續運作 (不論流量為何),即可影響模型版本線上預測的資源配置。手動設定節點數量會讓服務停止調度資源,這表示您指定的節點數量將隨時處於就緒狀態,服務也會持續向您收取這些節點的費用。我們不建議您使用手動調整資源配置功能,除非模型收到的要求數量變動的速度比自動調整資源配置更快。您可以在傳送給 projects.models.versions.createVersion 物件中設定 manualScaling,藉此指定要使用的節點數量。

預測輸入資料

您用來取得預測的資料是新資料,其格式和您用來訓練的資料相同。線上預測和批次預測會使用相同的資料 (模型的特徵),但是兩者需要的格式端視您使用的預測類型和介面而定。下表摘列了這些格式,其細節將於以下各節詳述:

預測類型和介面 支援的輸入格式
採用 API 呼叫的批次預測 具有 JSON 樣本字串的文字檔案或 TFRecord 檔案 (可能已壓縮)
使用 gcloud 工具的批次預測 具有 JSON 樣本字串的文字檔案或 TFRecord 檔案 (可能已壓縮)
採用 API 呼叫的線上預測 JSON 要求訊息
使用 gcloud 工具的線上預測 具有 JSON 樣本字串的文字檔案或是 CSV 檔案

樣本 JSON 字串

線上和批次預測的基本格式為樣本資料張量清單,可以是簡單的值清單或 JSON 物件的成員,視您在訓練應用程式中設定輸入的方式而定:

此範例會顯示輸入張量和樣本索引鍵:

{"values": [1, 2, 3, 4], "key": 1}

只要 JSON 字串的格式符合下列規則,其構成內容就可以較為複雜:

  • 樣本資料的頂層必須是 JSON 物件,也就是鍵/值組合的字典。

  • 樣本物件的個別值可以是字串、數字或清單。您無法嵌入 JSON 物件。

  • 清單僅能包含相同類型的項目 (包括其他清單),不能混合使用字串和數值。

下列字串經過格式化以方便閱讀。此字串會顯示包含標籤和圖片的物件,其中的圖片是 8 位元整數的 3 維陣列:

{
  "tag": "beach",
  "image": [
    [
      [138, 30, 66],
      [130, 20, 56],
      ...
    ],
    [
      [126, 38, 61],
      [122, 24, 57],
      ...
    ],
        ...
  ]
}

如果模型只採用單一輸入,您就不需要將其納入 JSON 物件中。比方說,如果您傳送含有四個值的單一張量 (在此案例中為向量),您就不需要格式化成下面這樣:

{"values": [1, 2, 3, 4]}

您可以將每個樣本格式化為一個清單:

[1, 2, 3, 4]
預測輸入內容的二進位資料

二進位資料無法採用 JSON 支援的 UTF-8 編碼字串格式。如果您的輸入內容含有二進位資料,則必須使用 base64 編碼來表示。下列是必要的特殊格式設定:

  • 編碼字串必須採用具有 b64 單一索引鍵的 JSON 物件格式。下列 Python 範例使用 base64 程式庫,對原始 JPEG 資料的緩衝區進行編碼以建立樣本:

    {"image_bytes":{"b64": base64.b64encode(jpeg_data)}}
    
  • 在 TensorFlow 模型程式碼中,您必須為輸入和輸出張量提供結尾為「_bytes」的別名。

線上預測輸入資料

將用於線上預測的輸入樣本當做 predict 要求的訊息內文傳送。如要瞭解如何設定要求和回應內文的格式,請參閱預測要求細節一文。

簡而言之:讓每個樣本設為清單中的一個項目,並將清單成員命名為 instances。因此,上述的簡單資料樣本 JSON 範例就會變成:

{"instances": [{"values": [1, 2, 3, 4], "key": 1}]}

使用 gcloud ai-platform projects predict 要求線上預測時,您傳入的檔案格式會與用於批次預測的格式相同。

批次預測輸入資料

如上所述,您會在一或多個包含 JSON 樣本資料列的文字檔案中,提供批次預測的輸入資料。輸入檔案並未包含資料欄標頭或簡易 JSON 語法以外的其他格式。

{"image": [0.0, 0.0, ... ], "key": 0}
{"image": [0.0, 0.0, ... ], "key": 1}
{"image": [0.0, 0.0, ... ], "key": 2}

樣本索引鍵

AI Platform 會使用分散式處理來執行批次預測工作。這表示資料分散於任意的虛擬機器叢集,並以無法預測的順序進行處理。若要讓傳回的預測和輸入樣本相符,您必須定義樣本索引鍵。樣本索引鍵為每個樣本都有的值,這個值在資料組的所有樣本中是獨一無二的。最簡單的索引鍵就是索引編號。

您應該在訓練應用程式中,透過圖片來傳送未受變更的索引鍵。如果資料還沒有樣本索引鍵,您可以在資料預先處理程序中新增樣本索引鍵。

執行階段版本

如果新版 AI Platform 已發布,則針對舊版開發的模型可能會過時。如果您使用的有效模型版本已長期未變更,請特別注意。請務必參閱 AI Platform 版本管理政策,並瞭解用來訓練模型版本的 AI Platform 執行階段版本

執行階段版本和預測

建立模型版本時,您可以指定支援的 AI Platform 執行階段版本,如此即可建立模型版本的預設設定。如果您沒有明確指定版本,AI Platform 就會使用目前預設的執行階段版本 1.0 來建立您的版本。

啟動批次預測工作時,您可以指定要使用的執行階段版本;這樣就能使用未部署於 AI Platform 上的模型來取得預測。對於已經部署的模型,請在工作要求中使用模型的預設執行階段版本。使用不同的執行階段版本可能會導致無法預期的錯誤。

您無法從 AI Platform 以外的模型要求線上預測,因此無法在要求中覆寫預設的執行階段版本。

針對模型版本設定的預設執行階段版本無法變更。若要為模型版本指定不同的執行階段版本,請使用您一開始採用的相同訓練成果來部署新版本。

地區和預測

Google Cloud Platform 利用地區,再細分為區域,來定義實體運算資源的地理位置。使用 AI Platform 部署預測的模型時,您會指定執行預測的預設地區。

當您啟動批次預測工作時,可以指定執行工作的地區,如此即會覆寫預設地區。系統一律會從模型指定的預設地區提供線上預測。

如要查看 AI Platform 服務 (包括模型訓練以及線上/批次預測) 的可用地區,請參閱地區指南

預測記錄

批次預測會產生可透過 Stackdriver Logging 查看的工作記錄。 如果您在建立線上預測的模型時,將模型設定為產生記錄,那麼您也可以取得線上預測要求的記錄。請注意,在 AI Platform 中建立模型資源時,您必須指定此選項:讓模型的所有版本都產生線上預測的記錄,或是完全不留下記錄。

使用 projects.models.create 建立模型時,您可以在自己使用的模型資源中將 onlinePredictionLogging 設為 true (在 Python 中為「True」),藉此設定模型的線上預測記錄功能。如果您是使用 gcloud 指令列工具來建立模型,請在執行 gcloud ai-platform models create 時加入 --enable-logging 標記。

從尚未部署的模型取得預測

您可以使用尚未部署至 AI Platform 服務的模型來要求批次預測。您不需指定模型或版本名稱,可以直接使用儲存要執行的模型所在的 Cloud Storage 位置 URI。

由於未部署模型沒有已建立的預設執行階段版本,因此您應在工作要求中明確設定。如果不這樣做,AI Platform 就會使用執行階段版本 1.0。

在其他方面,使用未部署模型的批次預測工作運作方式與其他批次工作相同。

模型測試

您可以使用 AI Platform 預測服務來託管實際工作環境中的模型,也可以用來測試模型。傳統上,您要先測試模型,才能部署機器學習解決方案。測試的目的是要在一個近似實際使用情況的環境中測試模型。

請記住,您可以在服務上同時部署模型的多個版本。這表示必要時,您可一次使用模型的多個修訂版本來進行測試。此外,這樣也有助於在部署模型正式版的同時,測試後續的修訂版本。如同許多開發中的機器學習應用程式,新資料的可用性通常是限制因子。因此您應制定策略來分割既有資料並收集新資料以進行測試。

後續步驟