分布式 GPU 训练 - AWSDeep Learning 容器

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

分布式 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 运营商被命名MXJob. 它将提供一种自定义资源,可让您轻松在 Kubernetes 上运行分布式或非分布式 MXNet 任务(训练和调整)。此操作员已在上一个设置步骤中安装。

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

$ kubectl get crd

该输出应包含 mxjobs.kubeflow.org

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

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

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

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

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

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

  • 您可以从“Always”、“OnFailure”和“Never”之一提供 restartPolicy。它确定 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"
    注意

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

    阶段-表示任务的阶段且将为 “Creating (正在创建)”、“Running (正在运行)”、“CleanUp (清除

    状态-提供任务的总体状态且将为 “Running (失败)” 之一。

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

    $ kubectl delete -f mx_job_dist.yaml

Apache MxNet(孵化)与 Horovod 分布式 GPU 培训

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

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

    $ 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 上学习基于 GPU 的推理,使用带有 Deep Learning Containers 的 MxNet,请参阅Apache MxNet(孵化)GPU 推理.

TensorFlow 采用 Horovod 分布式 GPU 训练

本教程将显示如何在使用的多节点 GPU 集群上设置 TensorFlow 模型的分布式训练。Horovod. 它使用已包含训练脚本的示例映像,并且将一个 3 节点集群与 node-type=p3.16xlarge 结合使用。您可以将本教程与 TensorFlow 或 TensorFlow 2 一起使用。要将其与 TensorFlow2 一起使用,请将 Docker 映像更改为 TensorFlow 2 映像。

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

    $ 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

后续步骤

要使用带有 Deep Learning Containers 的 TensorFlow 在 Amazon EKS 上学习基于 GPU 的推理,请参阅TensorFlow GPU 推理.

PyTorch 分布式 GPU 培训

本教程将指导您在多节点 GPU 集群上使用 PyTorch 进行分布式训练。它使用 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>

使用完集群后,请参阅 EKS 清除以获取有关清除集群的信息。

PyTorch 的 Amazon S3 插件

Deep Learning Containers 包括一个插件,使您能够将 Amazon S3 存储桶中的数据用于 PyTorch 培训。查看 Amazon EKSPyTorch 的 Amazon S3 插件 GPU 指南入门。

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

使用完集群后,请参阅 EKS 清除以获取有关清除集群的信息。

后续步骤

要在 Amazon EKS 上使用 PyTorch 与 Deep Learning Containers 一起学习基于 GPU 的推理,请参阅PyTorch GPU 推理.