使用GPU启动Amazon EKS集群以运行KubeRay#

本指南将引导您完成创建带有GPU节点的Amazon EKS集群的步骤,专门用于KubeRay。此处概述的配置可以应用于文档中大多数KubeRay示例。

步骤 1:在 Amazon EKS 上创建一个 Kubernetes 集群#

按照 此 AWS 文档 中的前两个步骤进行操作,以:(1) 创建您的 Amazon EKS 集群和 (2) 配置您的计算机以与您的集群通信。

步骤 2:为 Amazon EKS 集群创建节点组#

按照 这份 AWS 文档 中的 “步骤 3: 创建节点” 来创建节点组。以下部分提供了更详细的信息。

创建一个 CPU 节点组#

通常情况下,避免在 Ray 头节点上运行 GPU 工作负载。为所有非 Ray GPU 工作者的 Pod 创建一个 CPU 节点组,例如 KubeRay 操作员、Ray 头节点和 CoreDNS Pod。

以下是一个适用于文档中大多数 KubeRay 示例的常见配置:

  • 实例类型: m5.xlarge (4 vCPU; 16 GB RAM)

  • 磁盘大小:256 GB

  • 期望大小:1,最小大小:0,最大大小:1

创建一个 GPU 节点组#

为 Ray GPU 工作者创建一个 GPU 节点组。

  1. 以下是一个适用于文档中大多数 KubeRay 示例的常见配置:

    • AMI 类型: Bottlerocket NVIDIA (BOTTLEROCKET_x86_64_NVIDIA)

    • 实例类型:g5.xlarge (1 GPU;24 GB GPU 内存;4 vCPU;16 GB RAM)

    • 磁盘大小: 1024 GB

    • 期望大小:1,最小大小:0,最大大小:1

  2. 请安装 NVIDIA 设备插件。(注意:如果在上述步骤中使用了 BOTTLEROCKET_x86_64_NVIDIA AMI,则可以跳过此步骤。)

    • 安装 NVIDIA 设备插件的 DaemonSet 以在您的 Amazon EKS 集群中运行启用 GPU 的容器。您可以参考 Amazon EKS 优化的加速 Amazon Linux AMINVIDIA/k8s-device-plugin 仓库获取更多详情。

    • 如果GPU节点有污点,请在 nvidia-device-plugin.yml 中添加 tolerations 以使DaemonSet能够在GPU节点上调度Pod。

    注意: 如果你在使用 kubectl 时遇到权限问题,请按照 AWS 文档 中的 “步骤 2:配置你的计算机以与你的集群通信” 进行操作。

    # Install the DaemonSet
    kubectl apply -f https://raw.githubusercontent.com/NVIDIA/k8s-device-plugin/v0.9.0/nvidia-device-plugin.yml
    
    # Verify that your nodes have allocatable GPUs. If the GPU node fails to detect GPUs,
    # please verify whether the DaemonSet schedules the Pod on the GPU node.
    kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"
    
    # Example output:
    # NAME                                GPU
    # ip-....us-west-2.compute.internal   4
    # ip-....us-west-2.compute.internal   <none>
    
  3. 向 Kubernetes 添加一个污点,以防止在此 GPU 节点组上调度 CPU Pod。对于 KubeRay 示例,请向 GPU 节点添加以下污点:Key: ray.io/node-type, Value: worker, Effect: NoSchedule,并为 GPU Ray 工作 Pod 包含相应的 tolerations

    警告:GPU 节点非常昂贵。如果您不再需要集群,请记得删除它。

步骤 3:验证节点组#

注意: 如果你在使用 eksctl 时遇到权限问题,请导航到你的 AWS 账户网页,并从“命令行或编程访问”页面复制凭证环境变量,包括 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYAWS_SESSION_TOKEN

eksctl get nodegroup --cluster ${YOUR_EKS_NAME}

# CLUSTER         NODEGROUP       STATUS  CREATED                 MIN SIZE        MAX SIZE        DESIRED CAPACITY        INSTANCE TYPE   IMAGE ID                        ASG NAME                           TYPE
# ${YOUR_EKS_NAME}     cpu-node-group  ACTIVE  2023-06-05T21:31:49Z    0               1               1                       m5.xlarge       AL2_x86_64                      eks-cpu-node-group-...     managed
# ${YOUR_EKS_NAME}     gpu-node-group  ACTIVE  2023-06-05T22:01:44Z    0               1               1                       g5.12xlarge     BOTTLEROCKET_x86_64_NVIDIA      eks-gpu-node-group-...     managed