預先檢查模型容器 - Amazon SageMaker

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

預先檢查模型容器

本節說明如何在設定端點之前預先檢查模型容器輸入及輸出的相容性。 SageMaker Clarify 解釋程式與模型無關,但對模型容器輸入和輸出有需求。

注意

您可以將容器設定為支援批次請求 (在單一請求支援兩個或多個記錄),藉此提高效率。例如,單一記錄是單行CSV資料或單行JSON資料。 SageMaker Clarify 會先嘗試將記錄小批次傳送至模型容器,然後再傳回單一記錄請求。

模型容器輸入

CSV

模型容器支援輸入 CSV,MIME類型為:text/csv。下表顯示 SageMaker Clarify 支援的輸入範例。

模型容器輸入 (字串表示) 說明

'1,2,3,4'

使用四個數字特徵的單筆記錄。

'1,2,3,4\n5,6,7,8'

兩個記錄,由分行符號 '\n' 分隔。

'"這是一個好產品",5'

包含文字特徵與數字特徵的單筆記錄。

‘"這是一個好產品",5\n"糟糕的購物體驗",1'

兩個記錄。

JSON Lines

SageMaker 也支援使用 MIME 類型: 的JSON行密集格式輸入application/jsonlines,如下表所示。

模型容器輸入 說明

'{"data":{"features":[1,2,3,4]}}'

單一記錄;可以透過JMESPath表達式 擷取功能清單data.features

'{"資料":{"功能":[1,2,3,4]}}\n{"資料":{"功能":[5,6,7,8]}}'

兩個記錄。

'{"features":["這是一個好產品",5]}'

單一記錄;可以透過JMESPath表達式 擷取功能清單features

'{"features":["這是一個好產品",5]}\n{"features":["糟糕的購物體驗",1]}'

兩筆記錄。

模型容器輸出

您的模型容器輸出也應該採用 CSV或JSON行密集格式。此外,模型容器應包含輸入記錄的概率, SageMaker Clarify 會使用這些記錄來計算特徵屬性。

下列資料範例適用於CSV格式為 的模型容器輸出。

Probability only

對於迴歸及二進制分類問題,模型容器輸出預測標籤的單個機率值 (分數)。可以使用列索引 0 來提取這些機率。對於多類問題,模型容器輸出機率 (分數) 清單。對於多類問題,如果未提供索引,則提取所有值。

模型容器輸入 模型容器輸出 (字串表示)

單筆記錄

'0.6'

兩筆記錄 (結果在一行)

'0.6,0.3'

兩筆記錄 (結果分為兩行)

'0.6\n0.3'

多類模型的單筆記錄 (三個類別)

'0.1,0.6,0.3'

多類模型的兩筆記錄 (三個類別)

'0.1,0.6,0.3\n0.2,0.5,0.3'

Predicted label and probabilities

模型容器會以 CSV 格式輸出預測標籤,然後輸出其機率。可以使用索引 1 提取機率。

模型容器輸入 模型容器輸出

單筆記錄

'1,0.6'

兩個記錄

'1,0.6\n0,0.3'

Predicted labels header and probabilities

由 Autopilot 訓練的多類別模型容器可設定為以 CSV 格式輸出預測標籤和機率清單的字串表示法。在下列範例中,可以透過索引 1 提取機率。標籤頭可以透過索引提取 1,並且可以使用索引 0 提取標籤頭。

模型容器輸入 模型容器輸出

單筆記錄

'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"'

兩筆記錄

'"[\'cat\',\'dog\',\'fish\']","[0.1,0.6,0.3]"\n"[\'cat\',\'dog\',\'fish\']","[0.2,0.5,0.3]"'

下列資料範例適用於JSON行格式的模型容器輸出。

Probability only

在此範例中,模型容器會輸出可以透過以JSON行格式JMESPath表達score式擷取的機率。

模型容器輸入 模型容器輸出

單筆記錄

'{"分數":0.6}'

兩個記錄

'{"分數":0.6}\n{"分數":0.3}'

Predicted label and probabilities

在此範例中,多類別模型容器會輸出標籤標頭清單,以及JSON行格式的概率清單。機率可以透過 JMESPath 運算式提取 probability,標籤頭可以透過 JMESPath 運算式提取 predicted labels

模型容器輸入 模型容器輸出

單筆記錄

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}'

兩筆記錄

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}\n{"predicted_labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]}'

Predicted labels header and probabilities

在此範例中,多類別模型容器會以JSON行格式輸出標籤標頭和機率的清單。機率可以透過 JMESPath 運算式提取 probability,標籤頭可以透過 JMESPath 運算式提取 predicted labels

模型容器輸入 模型容器輸出

單筆記錄

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}'

兩筆記錄

'{"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}\n{"predicted_labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]}'

模型容器驗證

建議您將模型部署至 SageMaker 即時推論端點,並將請求傳送至端點。手動檢查請求 (模型容器輸入) 及回應 (模型容器輸出),以確保兩者都符合模型容器輸入部分與模型容器輸出部分中的需求。如果您的模型容器支援批次請求,您可以從單筆記錄請求開始,然後嘗試兩個或更多記錄。

下列命令顯示如何使用請求回應 AWS CLI。已預先安裝在 SageMaker Studio Classic AWS CLI 和 SageMaker Notebook 執行個體中。如果您需要安裝 AWS CLI,請遵循此安裝指南

aws sagemaker-runtime invoke-endpoint \ --endpoint-name $ENDPOINT_NAME \ --content-type $CONTENT_TYPE \ --accept $ACCEPT_TYPE \ --body $REQUEST_DATA \ $CLI_BINARY_FORMAT \ /dev/stderr 1>/dev/null

參數定義如下:

  • $ENDPOINT NAME:端點的名稱。

  • $CONTENT_TYPE:請求的MIME類型 (模型容器輸入)。

  • $ACCEPT_TYPE:回應的MIME類型 (模型容器輸出)。

  • $REQUEST_DATA:請求的承載字串。

  • $CLI_BINARY_FORMAT:命令列介面 (CLI) 參數的格式。對於 AWS CLI v1,此參數應保持空白。對於第 2 版,此參數應設定為 --cli-binary-format raw-in-base64-out

注意

AWS CLI v2 會將二進位參數傳遞為 base64 編碼字串預設

下列範例使用 AWS CLI v1:

Request and response in CSV format
  • 請求由單筆記錄組成,回應是其機率值。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-sagemaker-xgboost-model \ --content-type text/csv \ --accept text/csv \ --body '1,2,3,4' \ /dev/stderr 1>/dev/null

    輸出:

    0.6

  • 請求由兩筆記錄組成,回應包括其機率,並且模型用逗號分隔機率。--body 中的 $'content' 運算式告訴命令將內容中的 \n 解釋為分行符號。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-sagemaker-xgboost-model \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    輸出:

    0.6,0.3

  • 請求由兩筆記錄組成,回應包含其機率,且模型會以分行符號分隔機率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-1 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    輸出:

    0.6

    0.3

  • 該請求由單筆記錄組成,回應是機率值 (多類模型,三個類別)。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-1 \ --content-type text/csv \ --accept text/csv \ --body '1,2,3,4' \ /dev/stderr 1>/dev/null

    輸出:

    0.1,0.6,0.3

  • 請求由兩筆記錄組成,回應包括其機率值 (多類模型,三個類別)。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-1 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    輸出:

    0.1,0.6,0.3

    0.2,0.5,0.3

  • 請求由兩筆記錄組成,回應包括預測的標籤與機率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-2 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    輸出:

    1,0.6

    0,0.3

  • 請求由兩筆記錄組成,回應包括標籤標題及機率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-3 \ --content-type text/csv \ --accept text/csv \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    輸出:

    "['cat','dog','fish']","[0.1,0.6,0.3]"

    "['cat','dog','fish']","[0.2,0.5,0.3]"

Request and response in JSON Lines format
  • 請求由單筆記錄組成,回應是其機率值。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines \ --content-type application/jsonlines \ --accept application/jsonlines \ --body '{"features":["This is a good product",5]}' \ /dev/stderr 1>/dev/null

    輸出:

    {"score":0.6}

  • 請求包含兩筆記錄,回應包含預測標籤及機率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines-2 \ --content-type application/jsonlines \ --accept application/jsonlines \ --body $'{"features":[1,2,3,4]}\n{"features":[5,6,7,8]}' \ /dev/stderr 1>/dev/null

    輸出:

    {"predicted_label":1,"probability":0.6}

    {"predicted_label":0,"probability":0.3}

  • 請求包含兩筆記錄,回應包括標籤標題及機率。

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines-3 \ --content-type application/jsonlines \ --accept application/jsonlines \ --body $'{"data":{"features":[1,2,3,4]}}\n{"data":{"features":[5,6,7,8]}}' \ /dev/stderr 1>/dev/null

    輸出:

    {"predicted_labels":["cat","dog","fish"],"probabilities":[0.1,0.6,0.3]}

    {"predicted_labels":["cat","dog","fish"],"probabilities":[0.2,0.5,0.3]}

Request and response in different formats
  • 請求的CSV格式為 ,回應的格式為JSON行:

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-csv-in-jsonlines-out \ --content-type text/csv \ --accept application/jsonlines \ --body $'1,2,3,4\n5,6,7,8' \ /dev/stderr 1>/dev/null

    輸出:

    {"probability":0.6}

    {"probability":0.3}

  • 請求為JSON行格式,回應為CSV格式:

    aws sagemaker-runtime invoke-endpoint \ --endpoint-name test-endpoint-jsonlines-in-csv-out \ --content-type application/jsonlines \ --accept text/csv \ --body $'{"features":[1,2,3,4]}\n{"features":[5,6,7,8]}' \ /dev/stderr 1>/dev/null

    輸出:

    0.6

    0.3

驗證完成後,刪除測試端點。