调整您自己的训练容器 - Amazon SageMaker

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

调整您自己的训练容器

要运行您自己的训练模型,请使用 Amazon SageMaker 训练工具包通过 Amazon SageMaker 笔记本实例构建 Docker 容器。

步骤 1:创建 SageMaker 笔记本实例

  1. 通过以下网址打开 Amazon SageMaker 控制台:https://console.aws.amazon.com/sagemaker/

  2. 在左侧导航窗格中,依次选择 Notebook (笔记本)Notebook instances (笔记本实例)Create notebook instance (创建笔记本实例)

  3. Create notebook instance (创建笔记本实例) 页面上提供以下信息:

    1. 对于 Notebook instance name (笔记本实例名称),输入 RunScriptNotebookInstance

    2. 对于 Notebook instance type (笔记本实例类型),选择 ml.t2.medium

    3. Permissions and encryption (权限和加密) 部分中,执行以下操作:

      1. 对于 IAM Role (IAM 角色),选择 Create a new role (创建新角色)

      2. Create an IAM role (创建 IAM 角色) 页面上,选择 Specific S3 buckets (特定的 S3 存储桶),指定一个名为 Amazon S3 的 sagemaker-run-script 存储桶,然后选择 Create role (创建角色)

        SageMaker 创建一个名为 IAM 的 AmazonSageMaker-ExecutionRole-YYYYMMDDTHHmmSS 角色。 例如,AmazonSageMaker-ExecutionRole-20190429T110788。 请注意,执行角色命名约定使用创建角色的日期和时间,用 T 分隔。

    4. 对于 Root Access (根访问),选择 Enable (启用)

    5. 选择创建笔记本实例

  4. Notebook instances (笔记本实例) 页面上,Status (状态)Pending (待处理)。启动机器学习计算实例可能需要几分钟时间 Amazon SageMaker 在本例中,它会启动笔记本实例 — 并向该实例附加 ML 存储卷。—笔记本实例有一个预配置的 Jupyter 笔记本服务器和一组 Anaconda 库。有关更多信息,请参阅。 
CreateNotebookInstance

  5. Permissions and encryption (权限和加密) 部分中,复制 IAM role ARN number (IAM 角色 ARN 编号),然后将其粘贴到记事本文件中以将其临时保存。稍后您可以使用此 IAM 角色 ARN 编号在笔记本实例中配置本地训练评估程序。The IAM role ARN number (IAM 角色 ARN 编号) 如下所示:'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

  6. 在笔记本实例的状态更改为 InService 后,选择 Open JupyterLab (打开 Lambda)

步骤 2:创建并上传 Dockerfile 和 Python 训练脚本

  1. 打开 JupyterLab 后,在 JupyterLab 的主目录中创建新文件夹。 在左上角,选择 New Folder (新建文件夹) 图标,然后输入文件夹名称 docker_test_folder

  2. Dockerfile 目录中创建 docker_test_folder 文本文件。

    1. 选择左上角的 New Launcher (新建启动程序) 图标 (+)。

    2. 在右侧窗格中的 Other (其他) 部分下,选择 Text File (文本文件)

    3. 将以下 Dockerfile 示例代码粘贴到您的文本文件中。

      FROM tensorflow/tensorflow:2.2.0rc2-gpu-py3-jupyter # Install sagemaker-training toolkit to enable SageMaker Python SDK RUN pip3 install sagemaker-training # Copies the training code inside the container COPY train.py /opt/ml/code/train.py # Defines train.py as script entrypoint ENV SAGEMAKER_PROGRAM train.py

      Dockerfile 脚本将执行以下任务:

      • FROM tensorflow/tensorflow:2.2.0rc2-gpu-py3-jupyter – 下载 TensorFlow Docker 基本映像。您可以将它替换为要用于构建容器的任何 Docker 基本映像,以及 AWS 预构建的容器基本映像。

      • RUN pip install sagemaker-training – 安装 SageMaker 训练工具包,其中包含创建与 SageMaker 兼容的容器所需的常见功能。

      • COPY train.py /opt/ml/code/train.py – 将脚本复制到 SageMaker 所需的容器内的位置。该脚本必须位于此文件夹中。

      • ENV SAGEMAKER_PROGRAM train.py – 将您的训练脚本 train.py 作为在容器的 /opt/ml/code 文件夹中复制的入口点脚本。这是您在构建自己的容器时必须指定的唯一环境变量。

    4. 在左侧目录导航窗格中,文本文件名可能自动命名为 untitled.txt。 要重命名文件,请右键单击该文件,选择 Rename,将文件重命名为 Dockerfile 而没有 .txt 扩展名,然后按 Ctrl+sCommand+s 保存文件。

  3. train.py中创建或上传训练脚本 docker_test_folder。 在本练习中,您可以使用以下示例脚本。

    import tensorflow as tf mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0 model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=1) model.evaluate(x_test, y_test)

步骤 3:构建容器

  1. 在 JupyterLab 主目录中,打开 Jupyter 笔记本。要打开新笔记本,请选择 New Launch 图标,然后在 Notebook 部分中选择 conda_tensorflow2_p36

  2. 在第一个笔记本单元格中运行以下命令以转到 docker_test_folder 目录:

    % cd ~/SageMaker/docker_test_folder

    这将返回您当前的目录,如下所示:

    ! pwd

    output: /home/ec2-user/SageMaker/docker_test_folder

  3. 要构建 Docker 容器,请运行以下 Docker 构建命令,包括后面的句点:

    ! docker build -t tf-custom-container-test .

    必须从您创建的 Docker 目录运行 Docker 构建命令,在本例中为 docker_test_folder

    注意

    如果您收到以下错误消息,指示 Docker 找不到 Dockerfile,请确保 Dockerfile 具有正确的名称并已保存到目录中。

    unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /home/ec2-user/SageMaker/docker/Dockerfile: no such file or directory

    请记住,docker 查找在当前目录中不带任何扩展名的、名为 Dockerfile 的文件。如果您将其命名为其他名称,则可使用 -f 标志手动传入文件名。例如,如果您将 Dockerfile 命名为 Dockerfile-text.txt,请运行以下命令:

    ! docker build -t tf-custom-container-test -f Dockerfile-text.txt .

步骤 4:测试容器

  1. 要在笔记本实例中本地测试容器,请打开 Jupyter 笔记本。选择 New Launcher (新启动程序),然后在 框架中选择 conda_tensorflow_p36Notebook (笔记本)

  2. 将以下示例脚本粘贴到笔记本代码单元中以配置 SageMaker 评估程序。

    SageMaker Python SDK v1
    from sagemaker.estimator import Estimator estimator = Estimator(image_name='tf-custom-container-test', role='arn:aws:iam::111122223333:role/role-name', train_instance_count=1, train_instance_type='local') estimator.fit()
    SageMaker Python SDK v2
    from sagemaker.estimator import Estimator estimator = Estimator(image_uri='tf-custom-container-test', role='arn:aws:iam::111122223333:role/role-name', instance_count=1, instance_type='local') estimator.fit()
  3. 'Put_Your_ARN_Here' 值替换为您在配置笔记本实例时复制到记事本文件的 IAM 角色 ARN 编号。ARN 应如下所示:'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

  4. 运行代码单元。该测试输出训练环境配置、用于环境变量的值、数据源以及训练期间获得的损失和准确率。

步骤 5:将容器推送到 Amazon Elastic Container Registry (Amazon ECR)

  1. 成功运行本地模式测试后,您可以将 Docker 容器推送到 Amazon ECR 并使用它运行训练作业。

    在笔记本单元格中运行以下命令行。

    %%sh # Specify an algorithm name algorithm_name=tf-custom-container-test account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly $(aws ecr get-login --region ${region} --no-include-email) # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}
    注意

    此 bash shell 脚本可能会引发类似于以下错误消息的权限问题:

    "denied: User: [ARN] is not authorized to perform: ecr:InitiateLayerUpload on resource: arn:aws:ecr:us-east-1:[id]:repository/tf-custom-container-test"

    如果发生此错误,您需要将 AmazonEC2ContainerRegistryFullAccess 策略附加到您的 IAM 角色。转到 IAM 控制台,从左侧导航窗格中选择角色,查找用于 Notebook 实例的 IAM 角色。在 Permission (权限) 选项卡下,选择 Attach policies (附加策略) 按钮,然后搜索 AmazonEC2ContainerRegistryFullAccess 策略。选中策略的复选框,然后选择 Attach policy (附加策略) 以完成操作。

  2. 推送容器后,您可以从 Amazon ECR 环境中的任意位置调用 SageMaker 映像。在下一个笔记本单元格中运行以下代码示例。

    如果要将此训练容器与 SageMaker Studio 一起使用以使用其可视化功能,您还可以在 Studio 笔记本单元格中运行以下代码以调用训练容器的 Amazon ECR 映像。

    import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'sagemaker-byoc-test' tag = ':latest' region = boto3.session.Session().region_name uri_suffix = 'amazonaws.com' if region in ['cn-north-1', 'cn-northwest-1']: uri_suffix = 'amazonaws.com.cn' byoc_image_uri = '{}.dkr.ecr.{}.{}/{}'.format(account_id, region, uri_suffix, ecr_repository + tag) byoc_image_uri # This should return something like # 111122223333.dkr.ecr.us-east-2.amazonaws.com/sagemaker-byoc-test:latest
  3. 使用从上一步中检索的 ecr_image 来配置 SageMaker 评估程序对象。以下代码示例使用 SageMaker 配置 byoc_image_uri 评估程序,并在 Amazon EC2 实例上启动训练任务。

    SageMaker Python SDK v1
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_name=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', train_instance_count=1, train_instance_type='ml.p2.xlarge') # start training estimator.fit() # deploy the trained model predictor = estimator.deploy(1, instance_type)
    SageMaker Python SDK v2
    import sagemaker from sagemaker import get_execution_role from sagemaker.estimator import Estimator estimator = Estimator(image_uri=byoc_image_uri, role=get_execution_role(), base_job_name='tf-custom-container-test-job', instance_count=1, instance_type='ml.p2.xlarge') # start training estimator.fit() # deploy the trained model predictor = estimator.deploy(1, instance_type)

有关说明如何在本地测试自定义容器并将其推送到 Amazon ECR 映像的完整示例,请参阅构建您自己的 TensorFlow 容器示例笔记本。

步骤 6:清理资源

完成使用入门示例后清除资源

  1. 打开 SageMaker 控制台,选择笔记本实例 RunScriptNotebookInstance,选择 Actions (操作),然后选择 Stop (停止)。停止实例可能需要几分钟时间。

  2. 在实例的 Status (状态) 变为 Stopped (已停止) 后,依次选择 Actions (操作)Delete (删除),然后在对话框中选择 Delete (删除)。删除实例可能需要几分钟时间。笔记本实例在被删除后将从表中消失。

  3. 打开 Amazon S3 控制台并删除您创建的用于存储模型构件和训练数据集的存储桶。

  4. 打开 IAM 控制台并删除 IAM 角色。如果您已创建权限策略,也可以将其删除。

    注意

    Docker 容器在运行后会自动关闭。您不需要删除该容器。