调整您自己的训练容器 - Amazon SageMaker
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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

调整您自己的训练容器

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

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

  1. 通过以下网址打开 Amazon SageMaker 控制台:https://console.amazonaws.cn/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 页面上,选择 Specific S3 buckets,指定名为 的 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 角色 ARN 号,然后将其粘贴到记事本文件中以临时保存它。稍后,您将使用此 IAM 角色 ARN 编号在笔记本实例中配置本地训练评估程序。The IAM role ARN number (IAM 角色 ARN 编号) 如下所示:'arn:aws:iam::111122223333:role/service-role/AmazonSageMaker-ExecutionRole-20190429T110788'

  6. 在笔记本实例的状态变为 InService 后,选择 Open JupyterLab

步骤 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 (新启动程序),然后选择 Notebook in conda_tensorflow_p36 framework (框架中的笔记本)。

  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 控制台,从左侧导航窗格中选择 Roles (角色),查找用于笔记本实例的 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 容器在运行后会自动关闭。您不需要删除该容器。