使用 SageMaker 元件 - Amazon SageMaker

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

使用 SageMaker 元件

在本教學課程中,您可以使用適用於 Kubeflow 管道的 SageMaker Components 執行管道,以使用 Kmeans 搭配 上的MNIST資料集來訓練分類模型 SageMaker。工作流程使用 Kubeflow Pipelines 作為協調工具 SageMaker ,並執行工作流程的每個步驟。此範例取自現有 SageMaker 範例,並修改為使用 SageMaker Components for Kubeflow Pipelines。

您可以使用 KFP 儀表板、 KFP 或 Boto3 AWS SDK for Python (Boto3) 在 Python 中定義管道CLI,以編譯、部署和執行工作流程。MNIST 分類管道範例的完整程式碼可在 Kubeflow Github 儲存庫 中找到。要使用它,請將 Python 檔案複製到您的網關節點。

您可以在 上找到其他 SageMaker Kubeflow 管道範例 GitHub。如需使用元件的相關資訊,請參閱KubeFlow 管道 GitHub 儲存庫

若要執行分類管道範例,請 SageMaker IAM建立執行角色,授予訓練任務存取 AWS 資源的許可,然後繼續執行與您的部署選項對應的步驟。

建立 SageMaker 執行角色

kfp-example-sagemaker-execution-role IAM 角色是由 SageMaker 任務擔任的執行期角色,以存取 AWS 資源。在下列命令中,您可以建立名為 的IAM執行角色kfp-example-sagemaker-execution-role、連接兩個受管政策 (AmazonSageMakerFullAccess、AmazonS3FullAccess),以及與 建立信任關係 SageMaker ,以授予 SageMaker 任務對這些 AWS 資源的存取權。

執行管道時,您可以將此角色作為輸入參數提供。

執行下列 命令以建立角色。請注意輸出中傳回ARN的 。

SAGEMAKER_EXECUTION_ROLE_NAME=kfp-example-sagemaker-execution-role TRUST="{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \"Principal\": { \"Service\": \"sagemaker.amazonaws.com\" }, \"Action\": \"sts:AssumeRole\" } ] }" aws iam create-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --assume-role-policy-document "$TRUST" aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonSageMakerFullAccess aws iam attach-role-policy --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess aws iam get-role --role-name ${SAGEMAKER_EXECUTION_ROLE_NAME} --output text --query 'Role.Arn'

遵循SageMaker 使用 K 平均值MNIST分類的訓練管道教學課程的指示。

準備資料集

若要執行管道,您需要將資料擷取預處理指令碼上傳至 Amazon S3 儲存貯體。此儲存貯體和此範例的所有資源都必須位於 us-east-1 區域中。如需與建立儲存貯體相關的資訊,請參閱建立儲存貯體

從您在閘道節點上複製的 Kubeflow 儲存庫 mnist-kmeans-sagemaker 資料夾中,執行下列命令,將 kmeans_preprocessing.py 檔案上傳到 Amazon S3 儲存貯體。將 <bucket-name> 變更為 Amazon S3 儲存貯體的名稱。

aws s3 cp mnist-kmeans-sagemaker/kmeans_preprocessing.py s3://<bucket-name>/mnist_kmeans_example/processing_code/kmeans_preprocessing.py

編譯和部署您的管道

定義管道之後,您必須先將其編譯成中繼表示形式,然後才能將其提交至叢集上的 Kubeflow 管道服務。中繼表示法是壓縮為 tar.gz YAML 檔案的檔案形式的工作流程規格。您需要 KFPSDK來編譯管道。

安裝 KFP SDK

從閘道節點的命令列執行下列命令:

  1. Kubeflow 管道文件中安裝KFPSDK下列指示。

  2. 確認 KFP SDK 已使用下列命令安裝:

    pip show kfp
  3. 驗證已正確安裝 dsl-compile,如下所示:

    which dsl-compile

編譯管道

您有三個選項可與 Kubeflow 管道互動:KFPUI、 KFP CLI或 KFP SDK。下列各節說明使用 KFP UI 和 的工作流程CLI。

完成以下步驟以設定節點。

  1. 使用 Amazon S3 儲存貯體名稱和IAM角色 修改 Python 檔案ARN。

  2. 使用 dsl-compile 命令行中的命令來編譯管道,如下所示。將 <path-to-python-file> 取代為管道的路徑,將 <path-to-output> 取代為您希望 tar.gz 檔案所在的位置。

    dsl-compile --py <path-to-python-file> --output <path-to-output>

使用 上傳和執行管道 KFP CLI

從閘道節點的命令列完成下列步驟。KFP 會將管道的執行組織為實驗。您可以選擇指定實驗名稱。如果未指定,則該執行將列在預設值實驗下。

  1. 上傳您的管道,如下所示:

    kfp pipeline upload --pipeline-name <pipeline-name> <path-to-output-tar.gz>

    您的輸出看起來應該如下所示。請記下管道 ID

    Pipeline 29c3ff21-49f5-4dfe-94f6-618c0e2420fe has been submitted Pipeline Details ------------------ ID           29c3ff21-49f5-4dfe-94f6-618c0e2420fe Name         sm-pipeline Description Uploaded at  2020-04-30T20:22:39+00:00 ... ...
  2. 使用以下命令來建立執行。KFP CLI 執行命令目前不支援在建立執行時指定輸入參數。您需要在編譯之前更新 AWS SDK for Python (Boto3) 管道檔案中的參數。將 <experiment-name><job-name> 取代為任何名稱。將 <pipeline-id> 取代為您提交的管道的 ID。將 取代<your-role-arn>為 ARN的 kfp-example-pod-role。將 <your-bucket-name> 取代為您建立的 Amazon S3 儲存貯體的名稱。

    kfp run submit --experiment-name <experiment-name> --run-name <job-name> --pipeline-id <pipeline-id> role_arn="<your-role-arn>" bucket_name="<your-bucket-name>"

    您也可以使用作為 dsl-compile 命令輸出而建立的已編譯管道套件直接提交執行。

    kfp run submit --experiment-name <experiment-name> --run-name <job-name> --package-file <path-to-output> role_arn="<your-role-arn>" bucket_name="<your-bucket-name>"

    您的輸出看起來應如以下所示:

    Creating experiment aws. Run 95084a2c-f18d-4b77-a9da-eba00bf01e63 is submitted +--------------------------------------+--------+----------+---------------------------+ | run id                               | name   | status   | created at                | +======================================+========+==========+===========================+ | 95084a2c-f18d-4b77-a9da-eba00bf01e63 | sm-job |          | 2020-04-30T20:36:41+00:00 | +--------------------------------------+--------+----------+---------------------------+
  3. 導覽至使用者介面以檢查工作進度。

使用 UI KFP 上傳和執行管道

  1. 在左側面板中,選擇管道標籤。

  2. 在右上角,選擇 +UploadPipeline

  3. 輸入名稱和描述。

  4. 選擇上傳檔案,然後輸入您使用 CLI或 與 建立的 tar.gz 檔案路徑 AWS SDK for Python (Boto3)。

  5. 在左側面板中,選擇管道標籤。

  6. 尋找您建立的管道。

  7. 選擇 +CreateRun

  8. 輸入您的輸入參數。

  9. 選擇執行

執行預測

部署分類管道後,您可以針對由部署元件建立的端點執行分類預測。使用 KFP UI 檢查 的輸出成品sagemaker-deploy-model-endpoint_name。下載 .tgz 檔案以擷取端點名稱,或檢查您使用的區域中的 SageMaker 主控台。

設定執行預測的許可

如果要從閘道節點執行預測,請略過本節。

若要使用任何其他機器執行預測,請將 sagemaker:InvokeEndpoint 許可指派給用戶端機器使用IAM的角色。
  1. 在閘道節點上,執行下列動作以建立IAM政策檔案:

    cat <<EoF > ./sagemaker-invoke.json {     "Version": "2012-10-17",     "Statement": [         {             "Effect": "Allow",             "Action": [                 "sagemaker:InvokeEndpoint"             ],             "Resource": "*"         }     ] } EoF
  2. 將政策連接至用戶端節點IAM的角色。

    執行下列命令。<your-instance-IAM-role> 以IAM角色的名稱取代 。將 <path-to-sagemaker-invoke-json> 取代為您建立的政策檔案的路徑。

    aws iam put-role-policy --role-name <your-instance-IAM-role> --policy-name sagemaker-invoke-for-worker --policy-document file://<path-to-sagemaker-invoke-json>

執行預測

  1. 從具有下列內容mnist-predictions.py的用戶端機器建立 AWS SDK for Python (Boto3) 檔案。取代 ENDPOINT_NAME 變數。指令碼載入MNIST資料集,CSV從這些數字建立 ,然後將 CSV 傳送到端點進行預測並列印結果。

    import boto3 import gzip import io import json import numpy import pickle ENDPOINT_NAME='<endpoint-name>' region = boto3.Session().region_name # S3 bucket where the original mnist data is downloaded and stored downloaded_data_bucket = f"jumpstart-cache-prod-{region}" downloaded_data_prefix = "1p-notebooks-datasets/mnist" # Download the dataset s3 = boto3.client("s3") s3.download_file(downloaded_data_bucket, f"{downloaded_data_prefix}/mnist.pkl.gz", "mnist.pkl.gz") # Load the dataset with gzip.open('mnist.pkl.gz', 'rb') as f:     train_set, valid_set, test_set = pickle.load(f, encoding='latin1') # Simple function to create a csv from our numpy array def np2csv(arr):     csv = io.BytesIO()     numpy.savetxt(csv, arr, delimiter=',', fmt='%g')     return csv.getvalue().decode().rstrip() runtime = boto3.Session(region).client('sagemaker-runtime') payload = np2csv(train_set[0][30:31]) response = runtime.invoke_endpoint(EndpointName=ENDPOINT_NAME,                                    ContentType='text/csv',                                    Body=payload) result = json.loads(response['Body'].read().decode()) print(result)
  2. 執行 AWS SDK for Python (Boto3) 檔案,如下所示:

    python mnist-predictions.py

檢視結果和日誌

管道執行時,您可以選擇任何元件來檢查執行詳細資訊,例如輸入和輸出。這會列出已建立資源的名稱。

如果KFP請求已成功處理且任務 SageMaker 已建立,則KFP使用者介面中的元件日誌會提供在 中建立任務的連結 SageMaker。如果成功建立任務,也會提供 CloudWatch 日誌。

如您在同一叢集上執行過多管道工作,您可能會看到錯誤訊息,指出您沒有足夠的 Pod 可用。若要修正此問題,請登入閘道節點並刪除由您未使用的管道所建立的 Pod:

kubectl get pods -n kubeflow kubectl delete pods -n kubeflow <name-of-pipeline-pod>

清除

管道完成後,您需要清除資源。

  1. 從KFP儀表板中,如果管道未選擇終止 ,則終止管道執行。

  2. 如果終止選項不起作用,請登入閘道節點並手動終止管道執行所建立的所有 Pod,如下所示:

    kubectl get pods -n kubeflow kubectl delete pods -n kubeflow <name-of-pipeline-pod>
  3. 使用 AWS 您的帳戶登入 SageMaker 服務。手動停止所有訓練、批次轉換和HPO任務。刪除模型、資料儲存貯體和端點,以避免產生任何額外費用。終止管道執行不會停止 中的任務 SageMaker。