GPU 训练 - AWS 深度学习容器

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

GPU 训练

本节演示如何使用 Kubeflow 训练运算符和Deep Learning Containers 在 GPU 实例上训练模型。

运行示例之前,请确保您的集群有 GU 节点。如果您的集群中没有 GPU 节点,请使用以下命令向集群添加节点组。请务必在 “加速计算” 类别中选择 Amazon EC2 实例 (node-type)。

eksctl create nodegroup --cluster $CLUSTER_NAME --region $CLUSTER_REGION \ --nodes 2 --nodes-min 1 --nodes-max 3 --node-type p3.2xlarge

有关Deep Learning Containers 完整列表,请参阅Deep Learning Containers 映像。有关使用英特尔数学内核库 (MKL) 时配置设置的提示,请参阅AWSDeep Learning Containers 英特尔数学核心库 (MKL) 建议

PyTorch GPU 训练

随之而AWS来的是你对 Kubeflow 的部署PyTorchJob。这是 Kub ernetes 自定义资源的 Kube flow 实现,用于在亚马逊 EKS 上运行分布式 PyTorch 训练任务。

本教程展示了如何在单节点 GPU 实例 PyTorch 中训练模型。你将在你的容器中运行这个 PyTorch MNIST 示例,该Deep Learning Containers 由 Kubeflow 管理AWS。

  1. 创建一个 PyTorchJob.

    1. 创建任务配置文件。

      打开vivim,然后复制并粘贴以下内容。将此文件另存为 pytorch.yaml

      apiVersion: "kubeflow.org/v1" kind: PyTorchJob metadata: name: pytorch-training spec: pytorchReplicaSpecs: Worker: restartPolicy: OnFailure template: metadata: annotations: sidecar.istio.io/inject: "false" spec: containers: - name: pytorch imagePullPolicy: Always image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:2.0.0-gpu-py310-cu118-ubuntu20.04-ec2 command: - "/bin/sh" - "-c" args: - "git clone https://github.com/pytorch/examples.git && python examples/mnist/main.py --no-cuda --epochs=1" env: - name: OMP_NUM_THREADS value: "36" - name: KMP_AFFINITY value: "granularity=fine,verbose,compact,1,0" - name: KMP_BLOCKTIME value: "1" resources: limits: nvidia.com/gpu: 1
    2. 使用部署 PyTorchJob 配置文件kubectl以开始训练。

      kubectl create -f pytorch.yaml -n ${NAMESPACE}

      该任务创建了一个运行该容器的 Pod,该容器来自字段中引用的Deep Learning Containerspec.containers.image s。它位于上面的容器名称下的 YAML 文件中pytorch

    3. 您应当看到如下输出。

      pod/pytorch-training created
    4. 检查状态。

      作业名称pytorch-training显示在状态中。这份工作可能需要一段时间才能到达一个Running州。运行以下 watch 命令来监视作业的状态。

      kubectl get pods n ${NAMESPACE} -w

      您应当看到如下输出。

      NAME READY STATUS RESTARTS AGE pytorch-training 0/1 Running 8 19m
  2. 监视你的 PyTorchJob.

    1. 查看日志以查看训练进度。

      kubectl logs pytorch-training-worker-0 -n ${NAMESPACE}

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

      Cloning into 'examples'... Downloading http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz to ../data/MNIST/raw/train-images-idx3-ubyte.gz 9920512it [00:00, 40133996.38it/s] Extracting ../data/MNIST/raw/train-images-idx3-ubyte.gz to ../data/MNIST/raw Downloading http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz to ../data/MNIST/raw/train-labels-idx1-ubyte.gz Extracting ../data/MNIST/raw/train-labels-idx1-ubyte.gz to ../data/MNIST/raw 32768it [00:00, 831315.84it/s] Downloading http://yann.lecun.com/exdb/mnist/t10k-images-idx3-ubyte.gz to ../data/MNIST/raw/t10k-images-idx3-ubyte.gz 1654784it [00:00, 13019129.43it/s] Extracting ../data/MNIST/raw/t10k-images-idx3-ubyte.gz to ../data/MNIST/raw Downloading http://yann.lecun.com/exdb/mnist/t10k-labels-idx1-ubyte.gz to ../data/MNIST/raw/t10k-labels-idx1-ubyte.gz 8192it [00:00, 337197.38it/s] Extracting ../data/MNIST/raw/t10k-labels-idx1-ubyte.gz to ../data/MNIST/raw Processing... Done! Train Epoch: 1 [0/60000 (0%)] Loss: 2.300039 Train Epoch: 1 [640/60000 (1%)] Loss: 2.213470 Train Epoch: 1 [1280/60000 (2%)] Loss: 2.170460 Train Epoch: 1 [1920/60000 (3%)] Loss: 2.076699 Train Epoch: 1 [2560/60000 (4%)] Loss: 1.868078 Train Epoch: 1 [3200/60000 (5%)] Loss: 1.414199 Train Epoch: 1 [3840/60000 (6%)] Loss: 1.000870
    2. 监控作业状态。

      运行以下命令来刷新任务状态。当状态更改为时Succeeded,训练作业即告完成。

      watch -n 5 kubectl get pytorchjobs pytorch-training -n ${NAMESPACE}

清除有关在使用完集群后对其进行清理的信息,请参阅。

TensorFlow GPU 训练

你在 Kubeflow 上部署 TFJobAWS 是随附的。这是 Kub ernetes 自定义资源的 Kube flow 实现,用于在 Kubernetes 上运行分布式 TensorFlow 训练作业。

本教程指导您在单节点 GPU 实例中使用 Keras 在 MNIST 上训练分类模型,该实例运行由 Kubeflow 管理的Deep Learning Containers 中的容器AWS。

  1. 创建一个 TFJob。

    1. 创建任务配置文件。

      打开vivim,然后复制并粘贴以下内容。将此文件另存为 tf.yaml

      apiVersion: kubeflow.org/v1 kind: TFJob metadata: name: tensorflow-training spec: tfReplicaSpecs: Worker: restartPolicy: OnFailure template: metadata: annotations: sidecar.istio.io/inject: "false" spec: containers: - name: tensorflow image: 763104351884.dkr.ecr.us-east-1.amazonaws.com/tensorflow-training:2.12.0-gpu-py310-cu118-ubuntu20.04-ec2 command: ["/bin/sh","-c"] args: ["git clone https://github.com/keras-team/keras-io.git && python keras-io/examples/vision/mnist_convnet.py"] resources: limits: nvidia.com/gpu: 1
    2. 使用部署 TFJob 配置文件kubectl以开始训练。

      kubectl create -f tf.yaml ${NAMESPACE}

      该任务创建了一个运行该容器的 Pod,该容器来自字段中引用的Deep Learning Containerspec.containers.image s。它位于上面的容器名称下的 YAML 文件中tensorflow

    3. 您应当看到如下输出。

      pod/tensorflow-training created
    4. 检查状态。

      作业名称tensorflow-training显示在状态中。这份工作可能需要一段时间才能到达一个Running 州。运行以下 watch 命令来监视作业的状态。

      watch -n 5 kubectl get pods ${NAMESPACE}

      您应当看到如下输出。

      NAME READY STATUS RESTARTS AGE tensorflow-training 0/1 Running 8 19m
  2. 监控您的 Tob。

    1. 查看日志以查看训练进度。

      kubectl logs tensorflow-training-worker-0 ${NAMESPACE}

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

      Cloning into 'keras'... Using TensorFlow backend. Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz 8192/11490434 [..............................] - ETA: 0s 6479872/11490434 [===============>..............] - ETA: 0s 8740864/11490434 [=====================>........] - ETA: 0s 11493376/11490434 [==============================] - 0s 0us/step x_train shape: (60000, 28, 28, 1) 60000 train samples 10000 test samples Train on 60000 samples, validate on 10000 samples Epoch 1/12 2019-03-19 01:52:33.863598: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX512F 2019-03-19 01:52:33.867616: I tensorflow/core/common_runtime/process_util.cc:69] Creating new thread pool with default inter op setting: 2. Tune using inter_op_parallelism_threads for best performance. 128/60000 [..............................] - ETA: 10:43 - loss: 2.3076 - acc: 0.0625 256/60000 [..............................] - ETA: 5:59 - loss: 2.2528 - acc: 0.1445 384/60000 [..............................] - ETA: 4:24 - loss: 2.2183 - acc: 0.1875 512/60000 [..............................] - ETA: 3:35 - loss: 2.1652 - acc: 0.1953 640/60000 [..............................] - ETA: 3:05 - loss: 2.1078 - acc: 0.2422 ...
    2. 监控作业状态。

      运行以下命令来刷新任务状态。当状态更改为时Succeeded,训练作业即告完成。

      watch -n 5 kubectl get tfjobs tensorflow-training ${NAMESPACE}

清除有关在使用完集群后对其进行清理的信息,请参阅。