Amazon 如何 SageMaker 執行您的訓練映像 - Amazon SageMaker

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

Amazon 如何 SageMaker 執行您的訓練映像

您可以使用自訂的進入點指令碼,將基礎結構自動化,以便在生產環境中進行訓練。如果您將進入點指令碼傳遞至 Docker 容器,您也可以以獨立指令碼的方式執行,而無需重建映像。 SageMaker 會使用 Docker 容器進入點指令碼來處理訓練映像。

本節會說明如何在不使用訓練工具組的情況下,使用自訂的進入點。如果您想要使用自訂進入點,但不熟悉如何手動設定 Docker 容器,建議您改用SageMaker 訓練工具組程式庫。如需如何使用訓練工具組的詳細資訊,請參閱使用自有訓練容器

根據預設, SageMaker 尋找容器train內名為 的指令碼。您也可以使用 的 AlgorithmSpecification ContainerArgumentsContainerEntrypoint 參數,手動提供自己的自訂進入點API。

您可以使用以下兩個選項來手動配置 Docker 容器,以執行映像。

  • 使用 CreateTrainingJobAPI和 Docker 容器,其中包含進入點指示。

  • 使用 CreateTrainingJob API,並從 Docker 容器外部傳遞訓練指令碼。

如果您從 Docker 容器外傳送訓練指令碼,則在更新指令碼時不需要重建 Docker 容器。您也可以使用幾個不同的指令碼,在同一個容器中執行。

您的進入點指令碼應包含映像的訓練程式碼。如果您在估算器內選用 source_dir 參數,它應將相對的 Amazon S3 路徑引至包含進入點指令碼的資料夾。您可以使用 source_dir 參數,參考多個檔案。如果不使用 source_dir,則可以使用 entry_point 參數指定進入點。如需包含估算器的自訂進入點指令碼範例,請參閱使用 SageMaker 指令碼模式自攜模型。

SageMaker 模型訓練支援高效能 S3 Express One Zone 目錄儲存貯體,做為檔案模式、快速檔案模式和管道模式的資料輸入位置。您也可以使用 S3 Express One Zone 目錄儲存貯體來儲存訓練輸出。若要使用 S3 Express One Zone,請提供 S3 Express One Zone 目錄儲存貯體URI的 ,而非 Amazon S3 一般用途儲存貯體。您只能使用 Amazon S3 受管金鑰 (SSE-S3) 加密伺服器端加密的目錄儲存貯體中的 SageMaker 輸出資料。目前不支援使用 AWS KMS 金鑰 (SSE-KMS) 的伺服器端加密,以將 SageMaker 輸出資料儲存在目錄儲存貯體中。如需詳細資訊,請參閱 S3 Express One Zone

使用 Docker 容器內綁定的進入點指令碼,執行訓練工作

SageMaker 可以執行 Docker 容器內綁定的入門指令碼。

  • 根據預設,Amazon SageMaker 會執行下列容器。

    docker run image train
  • SageMaker 透過在映像名稱後面指定train引數來覆寫容器中的任何預設CMD陳述式。在您的 Docker 容器中,使用 ENTRYPOINT 指示內的 exec 格式。

    ENTRYPOINT ["executable", "param1", "param2", ...]

    以下範例顯示如何指定稱為 k-means-algorithm.py 的 Python 進入點指示。

    ENTRYPOINT ["python", "k-means-algorithm.py"]

    ENTRYPOINT 指示的 exec 格式直啟動可執行檔,而非 /bin/sh 的子項。這可讓它SIGKILL從 接收類似 SIGTERM和 的訊號 SageMaker APIs。使用 時,適用下列條件 SageMaker APIs。

    • CreateTrainingJob API 具有停止條件,指示在特定時間後 SageMaker 停止模型訓練。

    • 以下顯示 StopTrainingJob API。這會API發出相當於 的 docker stop,並具有 2 分鐘逾時命令,以正常停止指定的容器。

      docker stop -t 120

      該命令會嘗試傳送 SIGTERM 訊號,以便停止執行中的容器。在 2 分鐘逾時後, API會傳送 SIGKILL並強制停止容器。如果容器在接收到 SIGTERM 後於 120 秒內從容處理完畢並結束,就不會傳送任何 SIGKILL

    如果您想要在 SageMaker 停止訓練後存取中繼模型成品,請新增程式碼來處理SIGTERM處理常式中的儲存成品。

  • 如果您打算使用GPU裝置進行模型訓練,請確定您的容器nvidia-docker相容。僅包含容器上的CUDA工具組;請勿將NVIDIA驅動程式與映像綁定。如需 的詳細資訊nvidia-docker,請參閱 NVIDIA/nvidia-docker

  • 您無法在 SageMaker 容器中使用 tini 初始化器作為進入點指令碼,因為 trainserve引數混淆。

  • /opt/ml 和所有子目錄都會透過 SageMaker 訓練保留。建立演算法的 Docker 映像檔時,請確定您沒有在此目錄中放置演算法所需的任何資料。因為如果您這樣做,在訓練期間可能會看不見這些資料。

若要在 Docker 映像中綁定 Shell 或 Python 指令碼,或在 Amazon S3 儲存貯體中提供指令碼,或使用 AWS Command Line Interface (CLI),請繼續下一節。

將您的 Shell 程式碼與 Docker 容器綁定

如果要在 Docker 映像檔中綁定自訂的 Shell 程式碼,請使用以下步驟。

  1. 將您的 Shell 程式碼從您的工作目錄複製到 Docker 容器內。下列程式碼片段會將目前工作目錄中的自訂進入點指令碼 custom_entrypoint.sh 複製到位於 mydir 內的 Docker 容器。以下範例假設基礎 Docker 映像檔已安裝 Python。

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.sh /mydir/
  2. 請依照 Amazon 使用者指南 中的推送 Docker ECR映像的指示,建置 Docker 容器並將其推送至 Amazon Elastic Container Registry (Amazon )。 ECR

  3. 執行下列 AWS CLI 命令以啟動訓練任務。

    aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/mydir/custom_entrypoint.sh"]}' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'

將您的 Python 腳本與 Docker 容器綁定

請使用以下步驟將自訂的 Python 程式碼與 Docker 映像檔綁定。

  1. 將您的 Python 程式碼從您的工作目錄複製到 Docker 容器。下列程式碼片段會將目前工作目錄中的自訂進入點指令碼 custom_entrypoint.py 複製到位於 mydir 內的 Docker 容器。

    FROM <base-docker-image>:<tag> # Copy custom entrypoint from current dir to /mydir on container COPY ./custom_entrypoint.py /mydir/
  2. 執行下列 AWS CLI 命令以啟動訓練任務。

    --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["python"], \ "ContainerArguments": ["/mydir/custom_entrypoint.py"]}' \

使用 Docker 容器外的進入點指令碼執行訓練工作

您可以使用自有的 Docker 容器進行訓練,並從 Docker 容器外傳入進入點指令碼。在容器外建構進入點指令碼有一些優點。如果您更新進入點指令碼,不需要重建 Docker 容器。您也可以使用幾個不同的指令碼,在同一個容器中執行。

使用 ContainerEntrypoint和 參數指定訓練指令碼的位置ContainerArgumentsAlgorithmSpecificationAPI。這些進入點和引數的行為方式與 Docker 進入點和引數相同。這些參數中的值會覆寫做為 Docker 容器之一部份提供的對應 ENTRYPOINTCMD

當您將自訂的進入點指令碼傳遞至 Docker 訓練容器時,您提供的輸入會決定容器的行為。

  • 例如,如果您只提供 ContainerEntrypoint,則使用 的 CreateTrainingJob API請求語法如下所示。

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], ... } }

    然後, SageMaker 訓練後端會執行您的自訂進入點,如下所示。

    docker run --entrypoint <ContainerEntrypoint> image
    注意

    如果ContainerEntrypoint提供 , SageMaker 訓練後端會使用指定的進入點執行映像,並覆寫映像ENTRYPOINT中的預設值。

  • 如果您只提供 ContainerArguments,則 SageMaker 假設 Docker 容器包含入門指令碼。使用 的請求語法CreateTrainingJobAPI如下所示。

    { "AlgorithmSpecification": { "ContainerArguments": ["arg1", "arg2"], ... } }

    SageMaker 訓練後端會執行您的自訂進入點,如下所示。

    docker run image <ContainerArguments>
  • 如果您的 同時提供 ContainerEntrypointContainerArguments,則使用 的請求語法CreateTrainingJobAPI如下所示。

    { "AlgorithmSpecification": { "ContainerEntrypoint": ["string"], "ContainerArguments": ["arg1", "arg2"], ... } }

    SageMaker 訓練後端會執行您的自訂進入點,如下所示。

    docker run --entrypoint <ContainerEntrypoint> image <ContainerArguments>

您可以使用 中任何支援的InputDataConfig來源CreateTrainingJobAPI,提供入門指令碼來執行訓練映像。

在 Amazon S3 儲存貯體中提供進入點指令碼

若要使用 S3 儲存貯體提供自訂入門指令碼,請使用 的 S3DataSource 參數DataSourceAPI來指定指令碼的位置。若使用這個 S3DataSource 參數,需要以下條件。

下列範例會將名為 custom_entrypoint.sh 的指令碼放置在 S3 儲存貯體 s3://<bucket-name>/<bucket prefix>/custom_entrypoint.sh 的路徑上。

#!/bin/bash echo "Running custom_entrypoint.sh" echo "Hello you have provided the following arguments: " "$@"

接下來,您必須設定輸入資料通道的組態,才能執行訓練工作。 AWS CLI 直接使用 或搭配 JSON 檔案執行此操作。

使用 AWS CLI 搭配 JSON 檔案設定輸入資料頻道

若要使用 JSON 檔案設定輸入資料頻道,請使用 AWS CLI ,如下列程式碼結構所示。請確定下列所有欄位都使用 CreateTrainingJob 中定義的請求語法API。

// run-my-training-job.json { "AlgorithmSpecification": { "ContainerEntrypoint": ["/bin/sh"], "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"], ... }, "InputDataConfig": [ { "ChannelName": "<your_channel_name>", "DataSource": { "S3DataSource": { "S3DataDistributionType": "FullyReplicated", "S3DataType": "S3Prefix", "S3Uri": "s3://<bucket-name>/<bucket_prefix>" } }, "InputMode": "File", }, ...] }

接下來,執行 AWS CLI 命令,從 JSON 檔案啟動訓練任務,如下所示。

aws sagemaker create-training-job --cli-input-json file://run-my-training-job.json

AWS CLI 直接使用 設定輸入資料通道

若要設定沒有JSON檔案的輸入資料頻道,請使用下列 AWS CLI 程式碼結構。

aws --region <your-region> sagemaker create-training-job \ --training-job-name <your-training-job-name> \ --role-arn <your-execution-role-arn> \ --algorithm-specification '{ \ "TrainingInputMode": "File", \ "TrainingImage": "<your-ecr-image>", \ "ContainerEntrypoint": ["/bin/sh"], \ "ContainerArguments": ["/opt/ml/input/data/<your_channel_name>/custom_entrypoint.sh"]}' \ --input-data-config '[{ \ "ChannelName":"<your_channel_name>", \ "DataSource":{ \ "S3DataSource":{ \ "S3DataType":"S3Prefix", \ "S3Uri":"s3://<bucket-name>/<bucket_prefix>", \ "S3DataDistributionType":"FullyReplicated"}}}]' \ --output-data-config '{"S3OutputPath": "s3://custom-entrypoint-output-bucket/"}' \ --resource-config '{"VolumeSizeInGB":10,"InstanceCount":1,"InstanceType":"ml.m5.2xlarge"}' \ --stopping-condition '{"MaxRuntimeInSeconds": 180}'