匯出 SavedModel 以進行預測

如要將經過訓練的模型部署至 AI Platform,並使用這些模型提供預測,必須先以 TensorFlow SavedModel 格式將模型匯出。

本頁面概略說明建立 SavedModel 時須納入考量的一些重要事項。如需關於匯出為 SavedModel 的詳細資訊,請參閱 TensorFlow 指南的模型儲存與還原。如要進一步瞭解如何將 SavedModel 部署至 AI Platform 以提供預測,請參閱部署模型指南。如要瞭解預測程序的一般背景資訊,請參閱預測總覽頁面

自訂預測處理常式

除了部署 SavedModel 之外,您也可以建立及部署自訂預測處理常式。自訂預測處理常式可將 SavedModel (或以不同方式儲存的訓練模型) 與其他訓練成果及您提供的 Python 程式碼搭配使用,以自訂 AI Platform 處理預測要求的方式。例如,您可以在模型進行預測前,使用這樣的彈性來預先處理預測輸入。

如要進一步瞭解,請參閱自訂預測處理常式指南

瞭解訓練圖和服務圖

完成模型訓練並匯出為 SavedModel 之後,您必須先採取一些重要步驟,才能取得預測結果。

訓練圖和服務圖之間有一些主要差異。訓練圖包含部分不適用於服務圖的功能,例如:

  • 檔案讀取工具
  • 輸入佇列
  • 丟棄層
  • 損失函式
  • 最佳化器

由於提供預測資料的程序和訓練程序各有不同的需求,因此最佳做法就是匯出專門用於提供預測資料的單獨圖表。

瞭解 SavedModel

SavedModel 是 TensorFlow 建議在儲存模型時採用的格式,這也是在 AI Platform 上部署經過訓練的 TensorFlow 模型時須採用的格式。將經過訓練的模型匯出為 SavedModel 之後,訓練圖及其資產、變數和中繼資料就會儲存為這種格式,以便 AI Platform 使用及還原預測作業。

匯出 SavedModel 之後,系統就會建立 SavedModel 目錄,其中包含下列內容:

將 SavedModel 部署至 AI Platform 時,您必須加入整個 SavedModel 目錄,而不僅是包含圖表及其中繼資料的 SavedModel 通訊協定緩衝區檔案。這類檔案的副檔名通常為 .pb.pbtxt

SavedModel 可讓您儲存共用相同的資產和變數 (或查核點) 的多個圖表版本。舉例來說,您可以為相同的圖表開發兩種版本:一種用於在 CPU 上執行,另一種則用於在 GPU 上執行。

進一步瞭解 SavedModel 目錄結構

檢查及調整模型大小

您的 SavedModel 必須小於或等於 250 MB,才能使用 AI Platform 進行部署。這個數字須計入 SavedModel 目錄中所有資產和變數的大小,而不僅是 SavedModel 通訊協定緩衝區檔案 (即 saved_model.pbsaved_model.pbtxt) 本身的大小。

如要在開發過程中檢查模型大小,請先匯出 SavedModel,然後檢查目錄的檔案大小。

如果 SavedModel 超過 250 MB 的大小上限:

只要按照這些步驟操作,SavedModel 的大小即可縮減至 250 MB 的檔案大小上限,預測作業的延遲時間也會隨之減少。縮減模型大小的優點還包括提高效能以及不需申請更多配額,省去等待配額增加的時間。

如果仍需要更多配額,請瞭解如何要求提高配額

建構最佳預測圖

訓練作業會產生多個並非用於提供預測資料的查核點。請務必上傳不含這些結果的目錄,只在其中包含您要部署的模型。

舉例來說,假如您在 TensorBoard 的視覺化訓練程序中匯出彙總,建議您確認 SavedModel 中並未包含這些資料。預測圖並不需要這些 TensorBoard 彙總。

使用 Estimator 進行訓練和預測時,您可以使用 export_savedmodel 函式取得 SavedModel。也可以透過 SavedModelBuilder 來匯出模型。請參閱 MNIST 範例,其中說明如何使用正確的標記和簽名,透過 SavedModelBuilder 匯出模型。

降低精確度以縮減檔案大小

降低變數和輸入資料的精確度可以大幅縮減模型大小,但預測的準確率也會隨之下降。與低精確度的資料相比,高精確度資料的儲存效率較低。雖然低精確度資料會帶來雜訊,但類神經網路可能會「忽略」這些雜訊,並且仍能產生相當準確的預測結果。

如果因採用這些方法而導致預測準確率的下降幅度過大,請嘗試申請更多配額

  • 透過降低權重大小來縮減檔案大小。預設的權重為儲存效率較低的浮點數。如果權重的儲存效率較低,就會佔去大部分的模型整體檔案大小。

  • 將連續資料量化,最多可將模型的大小縮減 75%,同時又不會大幅降低準確率。

  • 使用較不精確的變數,例如,將資料類型 (dtype) 從 int64 變更為 int32

  • 在 SavedModel 目錄的 assets 資料夾中減少其他輸入特徵的大小,例如針對文字資料使用較小的詞彙大小。

  • 如需更多詳細資訊,請參閱 TensorFlow 模型服務供應最佳化技術一文,並深入瞭解採用各項技術的範例。

用於檢查 SavedModel 和圖表的工具

TensorFlow 提供指令列介面,可讓您對 SavedModel 執行例行性檢查 (例如輸入格式和 SignatureDefs)。進一步瞭解 SavedModel CLI

您可以利用 TensorFlow 中的圖表轉換工具將模型最佳化以進行部署。雖然我們已在行動裝置部署作業的相關說明文件中介紹過這項工具的使用方式,但此工具也可用於最佳化非行動裝置的部署作業模型。

進一步瞭解如何使用圖表轉換工具

建立服務輸入函式

定義服務輸入函式是匯出服務圖時的重要步驟之一。您可以在與整體訓練程序相關的下列階段中建立服務輸入函式:

  • 訓練程序即將結束時。
  • 訓練程序完成後,另外建立服務輸入函式。

詳請請參閱服務輸入函式的說明。

在訓練過程中建立服務圖

這種做法通常用於訓練程序即將結束時,但仍與訓練程序相關。

  1. 定義服務輸入函式。下方的程式碼引用自我們的人口普查範例

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. 使用 export_savedmodel 從 Estimator 匯出 SavedModel,以 export_dir_base 參數傳入模型的路徑,並以 serving_input_fn 參數傳入服務輸入函式的名稱。在人口普查範例中,使用的 Estimator 類型為 tf.contrib.learn.DNNLinearCombinedClassifier

在訓練完成後另外建立服務圖

如果模型已經訓練完成,您可以在不重新訓練的情況下取得預測結果。這項程序與在訓練過程中建立服務圖的程序十分類似,主要差異在於,您是在另一個 Python 指令碼中建立服務圖,且此 Python 指令碼是在訓練結束後執行。此做法的基本概念是使用訓練過程中所用的相同 model_dir 來建立 Estimator,然後呼叫 export_savedmodel,如上所述。

  1. 在 Python 指令碼中定義服務輸入函式。定義的方式與在訓練過程中相同:

    def json_serving_input_fn():
        """Build the serving inputs."""
        inputs = {}
        for feat in featurizer.INPUT_COLUMNS:
            inputs[feat.name] = tf.placeholder(shape=[None], dtype=feat.dtype)
    
        return tf.estimator.export.ServingInputReceiver(inputs, inputs)
    
    
  2. 建立 Estimator 時,請務必將 model_dir 參數設為訓練過程中使用的值。這麼做可讓 Estimator 使用之前儲存模型中的查核點。

  3. 最後請使用 Estimator 呼叫 export_savedmodel,以 export_dir_base 參數傳入模型的路徑,並以 serving_input_fn 參數傳入服務輸入函式的名稱。

TensorFlow 標記和簽名

如果您是tf.keras從 TensorFlow Estimator 匯出 SavedModel,在預設情況下,匯出的圖形會準備就緒。

在其他情況下,建立 TensorFlow 預測圖時,您必須為圖表的標記和簽名指定正確的值。TensorFlow 為這些標記和簽名值提供的常數會用於以下用途:

  • 在 SavedModel 中選擇圖表,以提供預測資料
  • 表示您正在為預測圖建構預測簽名

簽名會定義圖表的輸入和輸出內容。為預測圖建構簽名時,您必須指定有效的簽名常數做為 build_signature_def 中的 method_name 參數。對於預測作業而言,PREDICT_METHOD_NAME 通常是最合適的選擇。

您必須使用標記來指定 SavedModel 中的哪些圖表是用於提供預測資料。在 add_meta_graph_and_variables 中,請將 tag_constants.SERVING 新增至您的 tags 清單中。

如要瞭解如何使用正確的標記和簽名常數來建構預測圖,請參考這個範例

後續步驟

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
TensorFlow 適用的 AI Platform