本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
分布式 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-OperatorMXJob
. 它将提供一种自定义资源,可让您轻松在 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 是否在其退出时重新启动。 -
提供要用于字段映像的容器映像。
-
要创建 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>
-
使用您刚创建的 pod 文件运行分布式训练任务。
$
# Create a job by defining MXJob kubectl create -f mx_job_dist.yaml -
列出正在运行的任务。
$
kubectl get mxjobs -
要获取正在运行的任务的状态,请运行以下命令。将 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、失败或完成。
状态-提供作业的总体状态,将为 “正在运行”、“成功” 或 “失败”。
-
如果要删除任务,请将目录更改为您启动任务的位置并运行以下命令:
$
kubectl delete -f mx_job_dist.yaml
使用 Horovod 分布式 GPU 训练的 Apache MXNet(孵化中)
本教程介绍如何在您的多节点 GPU 集群上设置 Apache MXNet(孵化)模型的分布式训练霍罗沃德node-type=p3.8xlarge
结合使用。本教程运行Horovod 示例脚本
-
验证 miJob 自定义资源是否已安装。
$
kubectl get crd该输出应包含
mpijobs.kubeflow.org
。 -
创建 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>
-
使用您刚创建的 pod 文件运行分布式训练任务。
$ kubectl create -f mx-mnist-horovod-job.yaml
-
检查状态。任务名称显示在状态中。如果你正在运行任何其他测试或者之前运行过某项测试,它会出现在这个列表中。多次运行此项,直到您看到状态更改为“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
-
根据上述启动程序 pod 的名称,检查日志以查看训练输出。
$
kubectl logs -f --tail 10<LAUNCHER_POD_NAME>
-
您可以检查日志以观察训练进度。您还可以继续检查“get pods”以刷新状态。当状态变为“Completed (已完成)”时,您将知道该训练任务已完成。
-
要清理并重新运行作业,请执行以下操作:
$
kubectl delete -f mx-mnist-horovod-job.yaml
后续步骤
要在 Amazon EKS 上使用带有Deep Learning Containers 的 MXNet 学习基于 GPU 的推理,请参阅Apache MxNet(孵化)GPU 推理.
TensorFlow使用 Horovod 分布式 GPU 训练
本教程介绍如何设置分布式训练 TensorFlow 您的多节点 GPU 集群上使用的模型霍罗沃德node-type=p3.16xlarge
结合使用。您可以将本教程与以下任一方法结合使用 TensorFlow 要么 TensorFlow 2. 要与之配合使用 TensorFlow 2,将 Docker 镜像更改为 TensorFlow 2 张图片。
-
验证 miJob 自定义资源是否已安装。
$
kubectl get crd该输出应包含
mpijobs.kubeflow.org
。 -
创建 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>
-
使用您刚创建的 pod 文件运行分布式训练作业。
$ kubectl create -f tf-resnet50-horovod-job.yaml
-
检查状态。任务名称显示在状态中。如果您正在运行任何其他测试或之前运行过其他测试,则它们会出现在此列表中。多次运行此项,直到您看到状态更改为“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
-
根据上述启动程序 pod 的名称,检查日志以查看训练输出。
$
kubectl logs -f --tail 10<LAUNCHER_POD_NAME>
-
您可以检查日志以观察训练进度。您还可以继续检查“get pods”以刷新状态。当状态变为“Completed (已完成)”时,您将知道该训练任务已完成。
-
要清理并重新运行作业,请执行以下操作:
$
kubectl delete -f tf-resnet50-horovod-job.yaml
后续步骤
要在 Amazon EKS 上学习基于 GPU 的推理,请使用 TensorFlow 有关DDeep Learning Containers ContaTensorFlow GPU 推理.
PyTorch分布式 GU 训练
本教程将指导您进行分布式训练 PyTorch 在您的多节点 GPU 集群上。它使用 Gloo 作为后端。
-
验证 PyTorch 已安装自定义资源。
$
kubectl get crd该输出应包含
pytorchjobs.kubeflow.org
。 -
确保 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
-
使用以下文本创建基于 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 -
使用您刚创建的 pod 文件运行分布式训练任务。
$
kubectl create -f distributed.yaml -
您可以使用以下方法检查作业的状态:
$
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 推理.