取得批次預測

當您不需要立即取得預測時,或是當您有大量的樣本要處理以取得預測時,您可以使用批次預測服務。本頁面說明如何啟動 AI Platform 批次預測工作。

瞭解線上與批次預測的差異,或是瀏覽預測概念總覽

事前準備

為了要求預測,您必須先:

  • 建立模型資源和版本資源,或將 TensorFlow SavedModel 放入專案可存取的 Cloud Storage 位置。

  • 設定專案有權存取下列資料的 Cloud Storage 位置:

    • 輸入資料檔案。這類檔案可以有多個位置,您的專案必須取得讀取每個位置的權限。

    • 輸出檔案。您只能指定一個輸出路徑,且專案必須取得這個路徑的資料寫入權限。

  • 確認您的輸入檔案採用正確的批次預測格式

設定批次預測工作

如要啟動批次預測工作,您必須先收集一些設定資料。這些資料與您直接呼叫 API 時使用的 PredictionInput 物件所含的資料相同:

資料格式

用於輸入檔案的輸入格式類型。指定工作的所有輸入檔案都必須使用相同的資料格式。請設為下列其中一個值:

JSON

輸入檔案內容是純文字,每行一個樣本。這是預測概念頁面說明的格式

TF_RECORD

輸入檔案使用 TensorFlow TFRecord 格式

TF_RECORD_GZIP

輸入檔案是經過 GZIP 壓縮的 TFRecord 檔案。

輸入路徑

輸入資料檔案的 URI,必須在 Cloud Storage 位置中。您可以指定:

  • 特定檔案的路徑:'gs://path/to/my/input/file.json'

  • 具有單一星號萬用字元的目錄路徑,用來表示該目錄中的所有檔案:'gs://path/to/my/input/*'

  • 部分檔案名稱中以一個星號萬用字元結尾的路徑,表示以指定序列開頭的所有檔案:'gs://path/to/my/input/file*'

您可以組合多個 URL。在 Python 中,您可以建立清單。如果您使用 gcloud 指令列工具或直接呼叫 API,可以列出多個 URI (以半形逗號分隔,但兩者間沒有空格)。這是適用於 --input-paths 旗標的正確格式:

 --input-paths gs://a/directory/of/files/*,gs://a/single/specific/file.json,gs://a/file/template/data*
輸出路徑

您希望預測服務儲存結果的 Cloud Storage 位置路徑。您的專案必須具備這個位置的寫入權限。

模型名稱與版本名稱

您要用來取得預測的模型名稱及版本名稱 (選用)。如果您沒有指定版本,則會使用模型的預設版本。對於批次預測,版本必須使用 mls1-c1-m2 機器類型

如果您提供模型 URI (請參閱下節),請略過這些欄位。

模型 URI

您可以指定要使用的 SavedModel URI,從未部署在 AI Platform 上的模型取得預測結果。SavedModel 必須儲存於 Cloud Storage 中。

總之,您可以透過三個選項來指定批次預測使用的模型。例如:

  • 模型名稱,表示使用模型的預設版本。

  • 模型和版本名稱,表示使用特定模型版本。

  • 模型 URI,表示使用在 Cloud Storage 上但未部署至 AI Platform 的 SavedModel。

地區

您要執行工作的 Google Compute Engine 地區。為了發揮最佳效能,您應在相同的地區執行預測工作及儲存輸入和輸出資料,尤其是使用非常大型的資料集時。AI Platform 批次預測可在下列地區使用:

  -   us-central1
  -   us-east1
  -   europe-west1
  -   asia-east1

如要完整瞭解可使用 AI Platform 服務 (包括模型訓練和線上預測) 的地區,請參閱地區指南

工作名稱

工作的名稱,其必須:

  • 只使用混合大小寫 (區分大小寫) 的字母、數字和底線。
  • 以字母開頭。
  • 長度不超過 128 個字元。
  • 不得與專案中使用過的所有訓練和批次預測工作名稱重複,包括專案中建立過的所有工作,不論工作成功與否或狀態為何。
工作站數目上限 (選用)

這項工作的處理叢集使用的預測節點數上限。您可以透過這個方式,設定批次預測的自動調整資源配置功能上限。如果您沒有指定值,則會預設為 10。不論您指定的值為何,資源調度都會受到預測節點配額的限制。

執行階段版本 (選用)

用於工作的 AI Platform 版本。這是內含的選項,所以您可以指定執行階段版本,以搭配尚未部署於 AI Platform 的模型使用。這個值絕不能是已部署過的模型版本,因為那表示服務使用的是之前部署模型版本時指定的相同版本。

簽名名稱 (選用)

如果儲存的模型有多個簽名,請使用這個選項來指定自訂的 TensorFlow 簽名名稱,這可讓您選取在 TensorFlow SavedModel 中定義的替代輸入/輸出對應。請參閱 TensorFlow 說明文件中 SavedModel 的部分以瞭解如何使用簽名,以及瞭解如何指定自訂模型的輸出內容。預設值為 DEFAULT_SERVING_SIGNATURE_DEF_KEY,其值為 serving_default

下列範例定義保留設定資料的變數。

gcloud

使用 gcloud 指令列工具來啟動工作時,不需要建立變數。但這裡這麼做是為了更容易輸入和讀取工作提交指令。

DATA_FORMAT="text" # JSON data format
INPUT_PATHS='gs://path/to/your/input/data/*'
OUTPUT_PATH='gs://your/desired/output/location'
MODEL_NAME='census'
VERSION_NAME='v1'
REGION='us-east1'
now=$(date +"%Y%m%d_%H%M%S")
JOB_NAME="census_batch_predict_$now"
MAX_WORKER_COUNT="20"

Python

當您使用 Python 適用的 Google API 用戶端程式庫時,可以使用 Python 字典來表示 JobPredictionInput 資源。

  1. 透過 AI Platform REST API 使用的語法來格式化專案名稱和模型或版本名稱:

    • project_name ->「projects/project_name」
    • model_name ->「projects/project_name/models/model_name」
    • version_name ->「projects/project_name/models/model_name/versions/version_name」
  2. 建立 Job 資源的字典並在其中填入兩個項目:

    • 一個名為 'jobId' 的鍵,其中包含您要用來當做其值的工作名稱。

    • 一個名為 'predictionInput' 的鍵,其中包含另一個詞典物件,該物件包含 PredictionInput 的所有必需成員以及要使用的所有可選成員。

    下列範例中的函式使用設定資訊做為輸入變數,並傳回預測要求主體。除了基本項目外,這個範例還會依據您的專案名稱、模型名稱和當前時間,產生不重複的工作 ID。

    import time
    import re
    
    def make_batch_job_body(project_name, input_paths, output_path,
            model_name, region, data_format='JSON',
            version_name=None, max_worker_count=None,
            runtime_version=None):
    
        project_id = 'projects/{}'.format(project_name)
        model_id = '{}/models/{}'.format(project_id, model_name)
        if version_name:
            version_id = '{}/versions/{}'.format(model_id, version_name)
    
        # Make a jobName of the format "model_name_batch_predict_YYYYMMDD_HHMMSS"
        timestamp = time.strftime('%Y%m%d_%H%M%S', time.gmtime())
    
        # Make sure the project name is formatted correctly to work as the basis
        # of a valid job name.
        clean_project_name = re.sub(r'\W+', '_', project_name)
    
        job_id = '{}_{}_{}'.format(clean_project_name, model_name,
                               timestamp)
    
        # Start building the request dictionary with required information.
        body = {'jobId': job_id,
                'predictionInput': {
                    'dataFormat': data_format,
                    'inputPaths': input_paths,
                    'outputPath': output_path,
                    'region': region}}
    
        # Use the version if present, the model (its default version) if not.
        if version_name:
            body['predictionInput']['versionName'] = version_id
        else:
            body['predictionInput']['modelName'] = model_id
    
        # Only include a maximum number of workers or a runtime version if specified.
        # Otherwise let the service use its defaults.
        if max_worker_count:
            body['predictionInput']['maxWorkerCount'] = max_worker_count
    
        if runtime_version:
            body['predictionInput']['runtimeVersion'] = runtime_version
    
        return body
    

提交批次預測工作

如要提交工作,只要對 projects.jobs.create 發出簡單的呼叫即可,或是使用功能相同的指令列工具 gcloud ai-platform jobs submit prediction

gcloud

下列範例使用前一節定義的變數來啟動批次預測。

gcloud ai-platform jobs submit prediction $JOB_NAME \
    --model $MODEL_NAME \
    --input-paths $INPUT_PATHS \
    --output-path $OUTPUT_PATH \
    --region $REGION \
    --data-format $DATA_FORMAT

Python

以 Google API Python 專用用戶端程式庫啟動批次預測工作,使用的模式與其他用戶端 SDK 程序類似:

  1. 準備用於呼叫的要求主體 (如前一節所示)。

  2. 呼叫 ml.projects.jobs.create 以組成要求。

  3. 呼叫執行要求以取得回覆,並務必檢查是否發生 HTTP 錯誤。

  4. 使用回應做為字典,從 Job 資源取得值。

您可以使用 Python 適用的 Google API 用戶端程式庫呼叫 AI Platform Training 和 Prediction API,不需要手動建構 HTTP 要求。您必須先設定驗證,才能執行下列程式碼範例。

    import googleapiclient.discovery as discovery

    project_id = 'projects/{}'.format(project_name)

    ml = discovery.build('ml', 'v1')
    request = ml.projects().jobs().create(parent=project_id,
                                          body=batch_predict_body)

    try:
        response = request.execute()

        print('Job requested.')

        # The state returned will almost always be QUEUED.
        print('state : {}'.format(response['state']))

    except errors.HttpError as err:
        # Something went wrong, print out some information.
        print('There was an error getting the prediction results.' +
              'Check the details:')
        print(err._get_reason())

監控批次預測工作

批次預測工作需要很長的時間才能完成。您可以利用 Google Cloud Platform Console 監控工作進度:

  1. 前往 Google Cloud Platform Console 的 AI Platform「Jobs」(工作) 頁面:

    前往 GCP Console「Jobs」(工作) 頁面

  2. 「Job ID」(工作 ID) 清單中按一下您的工作名稱,即會開啟「Job details」(工作詳細資料) 頁面。

  3. 當前狀態會與工作名稱一起顯示在頁面頂端。

  4. 如果您需要更多詳細資料,可以按一下 [View logs] (查看記錄),在 Stackdriver Logging 中查看您的工作項目。

還有其他方法可以追蹤批次預測工作的進度。這些方法採用的模式與監控訓練工作相同。請參閱說明如何監控訓練工作的頁面,以取得其餘相關資訊。 您可能需要略微調整其中所述的操作說明才能使用預測工作,但使用的機制不變。

取得預測結果

該服務會將預測結果寫入您指定的 Cloud Storage 位置。 檔案輸出分成兩種類型,其中可能含有一些有趣的結果:

  • 名稱為 prediction.errors_stats-NNNNN-of-NNNNN 的檔案含有工作期間任何發生問題的相關資訊。

  • 根據模型的輸出定義,名為 prediction.results-NNNNN-of-NNNNN 的檔案包含預測本身。

檔案名稱所含的索引數字 (上述所顯示的每一個「N」均代表一個數字) 會擷取您應找到的檔案總數。舉例來說,含有 6 個結果檔案的工作包括 prediction.results-00000-of-00006prediction.results-00005-of-00006

在文字檔中,預測結果會格式化為 JSON 物件。您可以透過選取的文字編輯器來開啟這些檔案。如需快速查看指令列,您可以使用 gsutil cat

gsutil cat $OUTPUT_PATH/prediction.results-NNNNN-of-NNNNN|less

請記住,預測結果的輸出順序通常不會與輸入樣本的順序相同,即便您只使用一個輸入檔案。您可以比對樣本索引鍵,尋找樣本的預測結果。

後續步驟