取得批次預測

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

瞭解線上預測與批次預測的不同,或參閱預測概念總覽

事前準備

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

  • 使用 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*'

您可以合併多個 URI。在 Python 中,您可以建立這些 URI 的清單。如果您使用 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 位置路徑。您的專案必須具備這個位置的寫入權限。

模型名稱與版本名稱

您要用來取得預測的模型名稱及版本名稱 (選用)。如果您沒有指定版本,則會使用模型的預設版本。如果您願意,也可以改用指向未部署的 SavedModel 的 Cloud Storage 路徑 (稱為模型 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 中定義的替代輸入/輸出對應。請參閱 SavedModel 的 TensorFlow 說明文件,以瞭解如何使用簽名,並參閱相關指南以瞭解如何指定自訂模型的輸出。系統預設為 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 and 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 主控台監控工作進度:

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

    前往 GCP 主控台「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」均代表一個數字) 會擷取您應找到的檔案總數。例如,有六個結果檔案的工作會含有 prediction.results-00000-of-00006prediction.results-00005-of-00006

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

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

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

後續步驟

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

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

這個網頁
TensorFlow 適用的 AI Platform