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

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

调整自己的训练容器

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

第 1 步:创建一个 SageMaker 笔记本实例

  1. 通过 https://console.aws.amazon.com/sagemaker/ 打开亚马逊 SageMaker 控制台。

  2. 在左侧导航窗格中,选择笔记本,选择笔记本实例,然后选择创建笔记本实例

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

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

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

    3. 在权限和加密部分中,执行以下操作:

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

      2. 创建 IAM 角色页面上,选择特定 S3 存储桶,指定名为的 Amazon S3 存储桶sagemaker-run-script,然后选择创建角色

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

    4. 对于 “根访问权限”,选择 “启用”。

    5. 选择创建笔记本实例

  4. 在 “笔记本实例” 页面上,状态为待处理”。亚马逊可能需要几分钟 SageMaker 才能启动机器学习计算实例(在本例中为笔记本实例),然后为其附加机器学习存储卷。笔记本实例有一个预配置的 Jupyter 笔记本服务器和一组 Anaconda 库。有关更多信息,请参阅 CreateNotebookInstance

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

  6. 笔记本实例的状态更改为后 InService,选择 “打开” JupyterLab。

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

  1. JupyterLab 打开后,在您的主目录中创建一个新文件夹 JupyterLab。在左上角,选择 “新建文件夹” 图标,然后输入文件夹名称docker_test_folder

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

    1. 选择左上角的新建启动器图标 (+)。

    2. 在右侧窗格的 “其他” 部分下,选择 “文本文件”。

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

      FROM tensorflow/tensorflow:2.2.0rc2-gpu-py3-jupyter # Install sagemaker-training toolkit that contains the common functionality necessary to create a container compatible with SageMaker and the 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 基础映像以及Amazon预先构建的容器基础映像。

      • RUN pip install sagemaker-training— 安装包含创建与之兼容的容器所需的常用功能的 T SageMakerrainining Toolk it SageMaker。

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

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

    4. 在左侧目录导航窗格中,可能会自动命名文本文件名untitled.txt要重命名文件,请右键单击该文件,选择重命名,将文件重命名为Dockerfile不带.txt扩展名,然后Command+sCtrl+s或保存该文件。

  3. 将训练脚本上传train.pydocker_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 笔记本。要打开新笔记本,请选择 “新建启动” 图标,然后在 “笔记本” 部分选择 conda_tensorflow2_p39

  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 笔记本。选择 “新建启动器”,然后选择 “conda_tensorflow_p39框架中的笔记本”。

  2. 将以下示例脚本粘贴到笔记本代码单元中以配置 E SageMaker stimator。

    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', instance_count=1, 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 并使用它来运行训练任务。如果您想使用私有 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-password --region ${region}|docker login --username AWS --password-stdin ${fullname} # 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"

    如果出现此错误,您需要将 A mazoneC2ContainerRegistryFullAccess 策略附加到您的 IAM 角色。前往 IAM 控制台,从左侧导航窗格中选择角色,查找您用于 Notebook 实例的 iamRole。在 “权限” 选项卡下,选择 “附加政策” 按钮,然后搜索 AmazoneC2ContainerRegistryFullAccess 政策。选中策略的复选框,然后选择附加策略以完成操作。

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

    如果您想在 SageMaker Studio 中使用此训练容器来使用其可视化功能,也可以在 Studio 笔记本单元中运行以下代码来调用训练容器的 Amazon ECR 镜像。

    import boto3 account_id = boto3.client('sts').get_caller_identity().get('Account') ecr_repository = 'tf-custom-container-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_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)
    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 镜像的完整示例,请参阅 Building Your Ow n Conta TensorFlow iner 示例笔记本。

提示

要分析和调试训练作业以监控系统利用率问题(例如 CPU 瓶颈和 GPU 利用率不足)并识别训练问题(例如过度拟合、过度训练、张量爆炸和梯度消失),请使用 Amazon D SageMaker ebugger。有关更多信息,请参阅将调试器用于自定义训练容器

步骤 6:清理资源

完成使用入门示例后清除资源
  1. 打开SageMaker 控制台,选择笔记本实例 RunScriptNotebookInstance,选择操作,然后选择停止。停止实例可能需要几分钟时间。

  2. 在实例状态更改为已停止” 后,选择操作,选择删除,然后在对话框中选择删除。删除实例可能需要几分钟时间。删除笔记本实例后,它会从表中消失。

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

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

    注意

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

博客和案例研究

以下博客讨论了有关在亚马逊中使用自定义训练容器的案例研究 SageMaker。