分布式 GPU 训练 - Amazon深度学习容器
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

分布式 GPU 训练

本部分针对在多节点 GPU 集群上运行分布式训练。

有关Deep Learning Containers 完整列表,请参阅Deep Learning Containers 映像.

设置集群以进行分布式训练

要在 EKS 上运行分布式训练,您需要在集群上安装以下组件。

  • 默认安装的Kubeflow使用必需的组件,例如 PyTorch 运算符, TensorFlow 操作员和 NVIDIA 插件。

  • Apache MXNet 和 MPI 运营商。

下载并运行脚本以在集群中安装所需的组件。

$ wget -O install_kubeflow.sh https://raw.githubusercontent.com/aws/deep-learning-containers/master/test/dlc_tests/eks/eks_manifest_templates/kubeflow/install_kubeflow.sh $ chmod +x install_kubeflow.sh $ ./install_kubeflow.sh <EKS_CLUSTER_NAME> <AWS_REGION>

Apache MXNet(孵化)分布式 GPU 训练

本教程介绍如何使用参数服务器在多节点 GPU 集群上使用 Apache MXNet(孵化)运行分布式训练。要在 EKS 上运行 MXNet 分布式训练,可以使用Kubernetes mxNet-Operator被命名MXJob. 它将提供一种自定义资源,可让您轻松在 Kubernetes 上运行分布式或非分布式 MXNet 任务(训练和调整)。此操作员已在上一个设置步骤中安装。

使用自定义资源定义 (CRD) 将使用户能够创建和管理 MX 任务,就像 builtin K8s 资源一样。验证是否已安装 MXNet 自定义资源。

$ kubectl get crd

该输出应包含 mxjobs.kubeflow.org

使用参数服务器运行 MNIST 分布式训练示例

根据可用的集群配置和要运行的作业为您的作业创建 pod 文件 (mx_job_dist.yaml)。您需要指定 3 种jobModes:调度器、服务器和工作器。您可以指定要使用字段副本生成的 pod 的数量。计划程序、服务器和工作线程的实例类型将是在集群创建时指定的类型。

  • 计划程序:只有一个计划程序。计划程序的作用是设置集群。这包括等待每个节点已启动以及节点正在侦听哪个端口的消息。然后,计划程序向所有进程通知集群中的每个其他节点,以便它们可以相互通信。

  • 服务器:可以有多个服务器存储模型的参数并与工作人员通信。服务器可能与工作线程进程位于同一位置,也可能位于不同的位置。

  • 工作线程实例集 工作节点实际上是在一批训练样本上执行训练。在处理每个批次之前,工作线程从服务器中提取权重。在每个批次后,工作线程还会将梯度发送到服务器。根据模型训练工作负载,在同一计算机上运行多个工作线程可能并不是一个好主意。

  • 提供要用于字段映像的容器映像。

  • 你可以提供restartPolicy来自其中一个 Alwash OnFailure 而且从来没有。它确定 pod 是否在其退出时重新启动。

  • 提供要用于字段映像的容器映像。

  1. 要创建 MxJob 模板,请根据您的要求修改以下代码块并将其保存在名为的文件中mx_job_dist.yaml.

    apiVersion: "kubeflow.org/v1beta1" kind: "MXJob" metadata: name: <JOB_NAME> spec: jobMode: MXTrain mxReplicaSpecs: Scheduler: replicas: 1 restartPolicy: Never template: spec: containers: - name: mxnet image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example Server: replicas: <NUM_SERVERS> restartPolicy: Never template: spec: containers: - name: mxnet image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example Worker: replicas: <NUM_WORKERS> restartPolicy: Never template: spec: containers: - name: mxnet image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example command: - "python" args: - "/incubator-mxnet/example/image-classification/train_mnist.py" - "--num-epochs" - <EPOCHS> - "--num-layers" - <LAYERS> - "--kv-store" - "dist_device_sync" - "--gpus" - <GPUS> resources: limits: nvidia.com/gpu: <GPU_LIMIT>
  2. 使用您刚创建的 pod 文件运行分布式训练任务。

    $ # Create a job by defining MXJob kubectl create -f mx_job_dist.yaml
  3. 列出正在运行的任务。

    $ kubectl get mxjobs
  4. 要获取正在运行的任务的状态,请运行以下命令。将 JOB 变量替换为任务的任何名称。

    $ JOB=<JOB_NAME> kubectl get mxjobs $JOB -o yaml

    该输出值应该类似于以下内容:

    apiVersion: kubeflow.org/v1beta1 kind: MXJob metadata: creationTimestamp: "2020-07-23T16:38:41Z" generation: 8 name: kubeflow-mxnet-gpu-dist-job-3910 namespace: mxnet-multi-node-training-3910 resourceVersion: "688398" selfLink: /apis/kubeflow.org/v1beta1/namespaces/mxnet-multi-node-training-3910/mxjobs/kubeflow-mxnet-gpu-dist-job-3910 spec: cleanPodPolicy: All jobMode: MXTrain mxReplicaSpecs: Scheduler: replicas: 1 restartPolicy: Never template: metadata: creationTimestamp: null spec: containers: - image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example name: mxnet ports: - containerPort: 9091 name: mxjob-port resources: {} Server: replicas: 2 restartPolicy: Never template: metadata: creationTimestamp: null spec: containers: - image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example name: mxnet ports: - containerPort: 9091 name: mxjob-port resources: {} Worker: replicas: 3 restartPolicy: Never template: metadata: creationTimestamp: null spec: containers: - args: - /incubator-mxnet/example/image-classification/train_mnist.py - --num-epochs - "20" - --num-layers - "2" - --kv-store - dist_device_sync - --gpus - "0" command: - python image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example name: mxnet ports: - containerPort: 9091 name: mxjob-port resources: limits: nvidia.com/gpu: "1" status: conditions: - lastTransitionTime: "2020-07-23T16:38:41Z" lastUpdateTime: "2020-07-23T16:38:41Z" message: MXJob kubeflow-mxnet-gpu-dist-job-3910 is created. reason: MXJobCreated status: "True" type: Created - lastTransitionTime: "2020-07-23T16:38:41Z" lastUpdateTime: "2020-07-23T16:40:50Z" message: MXJob kubeflow-mxnet-gpu-dist-job-3910 is running. reason: MXJobRunning status: "True" type: Running mxReplicaStatuses: Scheduler: active: 1 Server: active: 2 Worker: active: 3 startTime: "2020-07-23T16:40:50Z"
    注意

    状态提供有关资源的状态的信息。

    阶段-表示作业的阶段,将是 “创建”、“运行”、 CleanUp、失败或完成。

    状态-提供作业的总体状态,将为 “正在运行”、“成功” 或 “失败”。

  5. 如果要删除任务,请将目录更改为您启动任务的位置并运行以下命令:

    $ kubectl delete -f mx_job_dist.yaml

使用 Horovod 分布式 GPU 训练的 Apache MXNet(孵化中)

本教程介绍如何在您的多节点 GPU 集群上设置 Apache MXNet(孵化)模型的分布式训练霍罗沃德. 它使用已包含训练脚本的示例映像,并且将一个 3 节点集群与 node-type=p3.8xlarge 结合使用。本教程运行Horovod 示例脚本适用于 MNIST 模型上的 MXNet。

  1. 验证 miJob 自定义资源是否已安装。

    $ kubectl get crd

    该输出应包含 mpijobs.kubeflow.org

  2. 创建 MPI Job 模板并定义节点数量(副本)和每个节点拥有的 GPU 数量(gpusPerReplica)。根据您的要求修改以下代码块并将其保存在名为的文件中mx-mnist-horovod-job.yaml.

    apiVersion: kubeflow.org/v1alpha2 kind: MPIJob metadata: name: <JOB_NAME> spec: slotsPerWorker: 1 cleanPodPolicy: Running mpiReplicaSpecs: Launcher: replicas: 1 template: spec: containers: - image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example name: <JOB_NAME> args: - --epochs - "10" - --lr - "0.001" command: - mpirun - -mca - btl_tcp_if_exclude - lo - -mca - pml - ob1 - -mca - btl - ^openib - --bind-to - none - -map-by - slot - -x - LD_LIBRARY_PATH - -x - PATH - -x - NCCL_SOCKET_IFNAME=eth0 - -x - NCCL_DEBUG=INFO - -x - MXNET_CUDNN_AUTOTUNE_DEFAULT=0 - python - /horovod/examples/mxnet_mnist.py Worker: replicas: <NUM_WORKERS> template: spec: containers: - image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-mxnet-training:1.8.0-gpu-py37-cu110-ubuntu16.04-example name: mpi-worker resources: limits: nvidia.com/gpu: <GPUS>
  3. 使用您刚创建的 pod 文件运行分布式训练任务。

    $ kubectl create -f mx-mnist-horovod-job.yaml
  4. 检查状态。任务名称显示在状态中。如果你正在运行任何其他测试或者之前运行过某项测试,它会出现在这个列表中。多次运行此项,直到您看到状态更改为“Running (正在运行)”。

    $ kubectl get pods -o wide

    您应该可以看到类似于如下输出的内容:

    NAME READY STATUS RESTARTS AGE mxnet-mnist-horovod-job-716-launcher-4wc7f 1/1 Running 0 31s mxnet-mnist-horovod-job-716-worker-0 1/1 Running 0 31s mxnet-mnist-horovod-job-716-worker-1 1/1 Running 0 31s mxnet-mnist-horovod-job-716-worker-2 1/1 Running 0 31s
  5. 根据上述启动程序 pod 的名称,检查日志以查看训练输出。

    $ kubectl logs -f --tail 10 <LAUNCHER_POD_NAME>
  6. 您可以检查日志以观察训练进度。您还可以继续检查“get pods”以刷新状态。当状态变为“Completed (已完成)”时,您将知道该训练任务已完成。

  7. 要清理并重新运行作业,请执行以下操作:

    $ kubectl delete -f mx-mnist-horovod-job.yaml

后续步骤

要在 Amazon EKS 上使用带有Deep Learning Containers 的 MXNet 学习基于 GPU 的推理,请参阅Apache MxNet(孵化)GPU 推理.

TensorFlow使用 Horovod 分布式 GPU 训练

本教程介绍如何设置分布式训练 TensorFlow 您的多节点 GPU 集群上使用的模型霍罗沃德. 它使用已包含训练脚本的示例映像,并且将一个 3 节点集群与 node-type=p3.16xlarge 结合使用。您可以将本教程与以下任一方法结合使用 TensorFlow 要么 TensorFlow 2. 要与之配合使用 TensorFlow 2,将 Docker 镜像更改为 TensorFlow 2 张图片。

  1. 验证 miJob 自定义资源是否已安装。

    $ kubectl get crd

    该输出应包含 mpijobs.kubeflow.org

  2. 创建 MPI Job 模板并定义节点数量(副本)和每个节点拥有的 GPU 数量(gpusPerReplica)。根据您的要求修改以下代码块并将其保存在名为的文件中tf-resnet50-horovod-job.yaml.

    apiVersion: kubeflow.org/v1alpha2 kind: MPIJob metadata: name: <JOB_NAME> spec: slotsPerWorker: 1 cleanPodPolicy: Running mpiReplicaSpecs: Launcher: replicas: 1 template: spec: containers: - image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-tensorflow-training:1.15.5-gpu-py37-cu100-ubuntu18.04-example name: <JOB_NAME> command: - mpirun - -mca - btl_tcp_if_exclude - lo - -mca - pml - ob1 - -mca - btl - ^openib - --bind-to - none - -map-by - slot - -x - LD_LIBRARY_PATH - -x - PATH - -x - NCCL_SOCKET_IFNAME=eth0 - -x - NCCL_DEBUG=INFO - -x - MXNET_CUDNN_AUTOTUNE_DEFAULT=0 - python - /deep-learning-models/models/resnet/tensorflow/train_imagenet_resnet_hvd.py args: - --num_epochs - "10" - --synthetic Worker: replicas: <NUM_WORKERS> template: spec: containers: - image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-tensorflow-training:1.15.5-gpu-py37-cu100-ubuntu18.04-example name: tensorflow-worker resources: limits: nvidia.com/gpu: <GPUS>
  3. 使用您刚创建的 pod 文件运行分布式训练作业。

    $ kubectl create -f tf-resnet50-horovod-job.yaml
  4. 检查状态。任务名称显示在状态中。如果您正在运行任何其他测试或之前运行过其他测试,则它们会出现在此列表中。多次运行此项,直到您看到状态更改为“Running (正在运行)”。

    $ kubectl get pods -o wide

    您应该可以看到类似于如下输出的内容:

    NAME READY STATUS RESTARTS AGE tf-resnet50-horovod-job-1794-launcher-9wbsg 1/1 Running 0 31s tf-resnet50-horovod-job-1794-worker-0 1/1 Running 0 31s tf-resnet50-horovod-job-1794-worker-1 1/1 Running 0 31s tf-resnet50-horovod-job-1794-worker-2 1/1 Running 0 31s
  5. 根据上述启动程序 pod 的名称,检查日志以查看训练输出。

    $ kubectl logs -f --tail 10 <LAUNCHER_POD_NAME>
  6. 您可以检查日志以观察训练进度。您还可以继续检查“get pods”以刷新状态。当状态变为“Completed (已完成)”时,您将知道该训练任务已完成。

  7. 要清理并重新运行作业,请执行以下操作:

    $ kubectl delete -f tf-resnet50-horovod-job.yaml

后续步骤

要在 Amazon EKS 上学习基于 GPU 的推理,请使用 TensorFlow 有关DDeep Learning Containers ContaTensorFlow GPU 推理.

PyTorch分布式 GU 训练

本教程将指导您进行分布式训练 PyTorch 在您的多节点 GPU 集群上。它使用 Gloo 作为后端。

  1. 验证 PyTorch 已安装自定义资源。

    $ kubectl get crd

    该输出应包含 pytorchjobs.kubeflow.org

  2. 确保 NVIDIA 插件daemonset正在运行。

    $ kubectl get daemonset -n kubeflow

    输出值应该与下面类似。

    NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE nvidia-device-plugin-daemonset 3 3 3 3 3 <none> 35h
  3. 使用以下文本创建基于 Gloo 的分布式数据并行作业。将其保存在名为的文件中distributed.yaml.

    apiVersion: kubeflow.org/v1 kind: PyTorchJob metadata: name: "kubeflow-pytorch-gpu-dist-job" spec: pytorchReplicaSpecs: Master: replicas: 1 restartPolicy: OnFailure template: spec: containers: - name: "pytorch" image: "763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-pytorch-training:1.7.1-gpu-py36-cu110-ubuntu18.04-example" args: - "--backend" - "gloo" - "--epochs" - "5" Worker: replicas: 2 restartPolicy: OnFailure template: spec: containers: - name: "pytorch" image: "763104351884.dkr.ecr.us-east-1.amazonaws.com/aws-samples-pytorch-training:1.7.1-gpu-py36-cu110-ubuntu18.04-example" args: - "--backend" - "gloo" - "--epochs" - "5" resources: limits: nvidia.com/gpu: 1
  4. 使用您刚创建的 pod 文件运行分布式训练任务。

    $ kubectl create -f distributed.yaml
  5. 您可以使用以下方法检查作业的状态:

    $ kubectl logs kubeflow-pytorch-gpu-dist-job

    要连续查看日志,请使用:

    $ kubectl logs -f <pod>

请参阅清除了解有关在使用完集群后清理集群的信息。

Amazon S3 插件适用于 PyTorch

Deep Learning Containers 包含一个插件,该插件使您可以将来自 Amazon S3 桶的数据用于 PyTorch 训练。查看Amazon EKSAmazon S3 插件适用于 PyTorch GU 指南开始使用。

有关更多信息和其他示例,请参阅Amazon S3 插件适用于 PyTorch存储库。

请参阅清除了解有关在使用完集群后清理集群的信息。

后续步骤

要在 Amazon EKS 上学习基于 GPU 的推理,请使用 PyTorch 有关DDeep Learning Containers ContaPyTorch GPU 推理.