在 GKE 上部署 GPU 加速的 Ray 以运行 AI 工作负载


本页面介绍了如何在 Google Kubernetes Engine (GKE) 上设置和运行支持 GPU 的 Ray 集群,以扩缩 AI/机器学习工作负载。

为何使用 Ray?

借助 KubeRay 在 GKE 上使用 Ray,可让您扩缩 Python 和 AI 应用。Ray 处理应用扩缩,而 GKE 管理底层服务器和资源。

这种组合可让您更轻松地管理资源、自动调整容量、确保可靠性,以及在各种环境中部署应用。通过将分布式 Ray 应用与 GKE 上现有的云基础设施和工具相关联,您可以简化操作,并使用标准 Kubernetes 方法为复杂任务预配稳健且可扩缩的平台。

如需了解详情,请参阅博文为何将 GKE 用于 Ray AI 工作负载

准备工作

在开始之前,请确保您已执行以下任务:

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the GKE API.

    Enable the API

  4. Install the Google Cloud CLI.

  5. Configure the gcloud CLI to use your federated identity.

    For more information, see Sign in to the gcloud CLI with your federated identity.

  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. 安装 kubectlkubectl 是与 GKE 集群互动的主要命令行工具。如果您使用 Cloud Shell,则 kubectl 已安装。否则,请运行 gcloud components install kubectl 命令将其安装在终端中。

    如需验证您的安装,请运行以下命令:kubectl version --client

  8. 安装 Ray:我们强烈建议您在安装 Ray 之前创建并进入 Python 虚拟环境 (venv),以便隔离其依赖项。
    1. 安装 Python
    2. 创建并激活新的虚拟环境
    3. 在虚拟环境中运行以下命令,安装 Ray 的最新稳定版本:pip install -U "ray[default]"
    4. 如需验证安装,请运行以下命令:ray --version。请记下输出中的 Ray 版本(例如 2.44.1)。
  9. 确保您的 Google Cloud 项目具有足够的 L4 GPU 配额。如需了解详情,请参阅 GPU 简介分配配额

创建 GKE 集群

您可以在 GKE Autopilot 或 Standard 集群中部署工作负载。我们建议您使用 Autopilot 集群获得全托管式 Kubernetes 体验。如需选择最适合您的工作负载的 GKE 操作模式,请参阅选择 GKE 操作模式

Autopilot

Autopilot 模式下,Google 会管理您的集群配置,包括扩缩、安全性和其他预配置的设置。Autopilot 集群经过优化,可以运行大多数生产工作负载,并可根据 Kubernetes 清单预配计算资源。

  1. 在终端中,运行以下 gcloud container clusters create-auto 命令:

    gcloud container clusters create-auto my-ray-enabled-cluster \
        --enable-ray-operator \
        --enable-ray-cluster-monitoring \
        --enable-ray-cluster-logging \
        --location=us-central1
    

    此 Google Cloud CLI 命令会创建一个名为 my-ray-enabled-cluster 的 Autopilot 集群,设置如下:

    • --enable-ray-operator:在集群上安装 Ray Operator,从而简化 Kubernetes 中 Ray 集群的管理。
    • --enable-ray-cluster-monitoring:设置与 Cloud Monitoring 的集成,以获取 Ray 集群指标。
    • --enable-ray-cluster-logging:配置与 Cloud Logging 的集成,以从 Ray 集群收集日志。
    • --location=us-central1:指定将创建 GKE 集群的地理区域。请注意,加速器的可用性和支持的类型因位置而异。如需了解详情,请参阅 GPU 区域和可用区

    Autopilot 集群会根据工作负载需求自动预配和扩缩节点(包括使用计算类的支持 GPU 的节点),从而优化利用率和费用。Autopilot 集群中资源的自动预配和扩缩简化了资源管理,让您可以专注于模型,而不是基础设施。

    如果您使用的是 GKE Standard 集群,则用于启用 Ray 的标志和设置可能会有所不同。如需了解详情,请参阅在 GKE 上启用 Ray Operator

  2. 配置 kubectl 以与您的集群通信:

    gcloud container clusters get-credentials my-ray-enabled-cluster \
        --region=us-central1
    

Standard

Standard 模式下,您可以更好地控制 GKE 集群的底层基础设施。您可以直接管理节点池、节点大小和其他配置,从而实现更出色的自定义。标准集群适合需要特定配置或对资源进行严格控制的工作负载。

  1. 在终端中,运行以下 gcloud container clusters create 命令:

    gcloud container clusters create my-ray-enabled-cluster \
        --addons=RayOperator \
        --enable-ray-cluster-monitoring \
        --enable-ray-cluster-logging \
        --region=us-central1 \
        --enable-autoprovisioning \
        --max-cpu=10 \
        --max-memory=64
    

    此 Google Cloud CLI 命令会创建一个名为 my-ray-enabled-cluster 的 Standard 集群,设置如下:

    • --addons=RayOperator:在集群上安装 Ray Operator,从而简化 Kubernetes 中 Ray 集群的管理。
    • --enable-ray-cluster-monitoring:设置与 Cloud Monitoring 的集成,以获取 Ray 集群指标。
    • --enable-ray-cluster-logging:配置与 Cloud Logging 的集成,以从 Ray 集群收集日志。
    • --region=us-central1:指定将创建 GKE 集群的地理区域。请注意,加速器的可用性和支持的类型因位置而异。如需了解详情,请参阅 GPU 区域和可用区
    • --enable-autoprovisioning:根据工作负载的需求自动创建和删除节点池,并扩缩这些池内的节点。
    • --max-cpu:集群可扩缩到的核心数上限。
    • --max-memory:集群可扩缩到的内存量上限(以千兆字节为单位)。
  2. 配置 kubectl 以与您的集群通信:

    gcloud container clusters get-credentials my-ray-enabled-cluster \
        --region=us-central1
    

安装 KubeRay kubectl ray 插件

kubectl ray 插件可简化 Kubernetes 上常见的 Ray 工作流。如需了解最新的安装说明,请参阅 KubeRay 文档

  1. 前往版本页面,然后下载适合您平台的二进制程序。例如,如需在 Linux amd64 上安装 kubectl ray 插件 1.3.2 版,请运行以下命令:

    curl -LO https://github.com/ray-project/kuberay/releases/download/v1.3.2/kubectl-ray_v1.3.2_linux_amd64.tar.gz
    tar -xvf kubectl-ray_v1.3.2_linux_amd64.tar.gz
    cp kubectl-ray ~/.local/bin
    

    ~/.local/bin 替换为 PATH 中的目录。

  2. 验证安装效果:

    kubectl ray version
    

    如果您看到 KubeRay operator installation cannot be found: no KubeRay operator deployments found in any namespace. 之类的警告,可以放心地予以忽略。 如果安装成功,则输出为 kubectl ray 插件的版本。

在集群中创建自定义计算类

借助 GKE 中的自定义计算类,您可以按优先级定义特定的硬件要求,例如 GPU 类型和数量。GKE 在为工作负载预配节点时会使用此优先级。

如需创建本指南中的示例自定义计算类,请按照以下步骤操作:

  1. 将以下计算类规范保存为 nvidia-l4-compute-class.yaml

    apiVersion: cloud.google.com/v1
    kind: ComputeClass
    metadata:
      name: gpu-compute-class
    spec:
      priorities:
      - gpu:
          type: nvidia-l4
          count: 1
        spot: true
      - gpu:
          type: nvidia-l4
          count: 1
        spot: false
      nodePoolAutoCreation:
        enabled: true
      whenUnsatisfiable: DoNotScaleUp
    
  2. 运行以下命令以创建计算类:

    kubectl apply -f nvidia-l4-compute-class.yaml
    

    应用自定义计算类后会发生什么情况? 应用计算类 YAML 文件后,当 Ray 集群请求节点时,GKE 会自动预配具有一个 NVIDIA L4 GPU 的节点。它将优先使用清单中定义的 Spot 虚拟机。 whenUnsatisfiable: DoNotScaleUp 设置会指示 GKE 不要创建不符合指定要求的节点。

创建并验证 Ray 集群

现在,您可以在 GKE 集群上创建 Ray 集群

  1. 创建 Ray 集群。使用 kubectl ray create cluster 命令定义并创建 Ray 集群。此命令通过处理底层 Kubernetes 资源创建来简化该过程。

      kubectl ray create cluster my-ray-cluster \
          --worker-replicas=1 \
          --worker-cpu=2 \
          --worker-memory=4Gi \
          --worker-gpu=1 \
          --worker-node-selectors="cloud.google.com/compute-class=gpu-compute-class"
    

    kubectl ray create cluster 命令使用 KubeRay 插件将您的规范转换为 RayCluster 自定义资源定义,并将其发送到 Kubernetes API 以创建 RayCluster 对象。该对象充当蓝图,告知 Ray Operator 如何在 GKE 内预配和管理实际的 Ray 集群组件(头节点和工作器节点)。默认情况下,GKE 会将头 Pod 调度到 E2 机器系列中的节点。

    示例命令使用以下设置:

    • kubectl ray create cluster my-ray-cluster:指定要创建的 Ray 集群的名称。
    • --worker-node-selectors:告知 Kubernetes 将工作器 Pod 调度到标示为 cloud.google.com/compute-class=gpu-compute-class 的节点上。
  2. 验证 Ray 集群状态。使用以下命令验证您的 Ray 集群是否已启动且正常运行。

    • 运行以下命令,检查 RayCluster 资源:

      kubectl ray get cluster
      

      此命令会列出 Kubernetes 命名空间中的所有 Ray 集群。您应该会看到列出的 my-ray-cluster。集群初始化可能需要几分钟时间。

    • 运行以下命令检查 Kubernetes Pod:

      kubectl get pods
      

      此命令会列出 Kubernetes 命名空间中运行的所有 Pod。您应该会看到与 Ray 集群相关的 Pod:

      • Ray 头节点的 Pod,名称类似于 my-ray-cluster-head-0
      • Ray 工作器节点的一个或多个 Pod,名称类似于 my-ray-cluster-worker-group-0-xxxxx。工作器 Pod 的数量取决于 Ray 集群的初始配置以及可能发生的任何自动扩缩。

提交 Ray 作业

Ray 集群准备就绪后,您可以向 GKE 上正在运行的 Ray 集群提交 Ray 作业。

为此,请使用 kubectl ray session 命令启动互动式会话,并使用 ray job submit 命令开始执行作业。

  1. 启动 Ray 互动式会话。如需与 Ray 集群建立本地连接,请运行以下命令:

      kubectl ray session my-ray-cluster
    

    此命令会在您的本地机器与 GKE 集群中的 Ray 头节点之间启动端口转发。请注意,此会话处于活跃状态时,您的终端将被占用;如需继续操作,请打开单独的终端实例。

  2. 创建要运行的示例代码。将以下示例代码保存到名为 sample_code.py 的文件中。

      import ray
      import os
      import requests
    
      ray.init()
    
      @ray.remote
      class Counter:
          def __init__(self):
              # Used to verify runtimeEnv
              self.name = os.getenv("counter_name")
              assert self.name == "test_counter"
              self.counter = 0
    
          def inc(self):
              self.counter += 1
    
          def get_counter(self):
              return "{} got {}".format(self.name, self.counter)
    
      counter = Counter.remote()
    
      for _ in range(5):
              ray.get(counter.inc.remote())
              print(ray.get(counter.get_counter.remote()))
    
      # Verify that the correct runtime env was used for the job.
      assert requests.__version__ == "2.26.0"
    
  3. 打开新终端并提交 Ray 作业

    1. 在本地机器上打开一个新终端。如果您为 Ray 安装创建了虚拟环境,请确保在此新终端中也激活该环境。
    2. 前往您保存 sample_code.py 文件的目录。
    3. 运行以下命令:

        ray job submit \
            --working-dir=. \
            --runtime-env-json='{"pip": ["requests==2.26.0"], "env_vars": {"counter_name": "test_counter"}}' \
            --address http://localhost:8265 python sample_code.py
      

      示例命令使用以下设置:

      • --working-dir=.:指定当前目录作为工作目录,以供集群上的 Ray 作业使用。 理想情况下,此目录仅包含您要在 Ray 上运行的应用源代码。在我们的示例中,此文件为 sample_code.py 文件。
      • --runtime-env-json='{"pip": ["requests==2.26.0"], "env_vars": {"counter_name": "test_counter"}}':定义作业的运行时环境。它指定所需的 Python 库版本 (requests==2.26.0) 并为作业执行设置环境变量 (counter_name)。
  4. 查看 Ray 作业。您可以通过以下方式之一监控作业:

    • Ray 信息中心:打开网络浏览器,然后前往 http://localhost:8265。此网址会打开 Ray 信息中心,您可以在其中查看有关正在运行的作业的信息,包括状态、日志和资源使用情况。
    • Metrics Explorer:使用Google Cloud 控制台中的预构建指标信息中心。如需了解详情,请参阅收集和查看 GKE 上的 Ray 集群的日志和指标
  5. 终止 Ray 会话。完成与 Ray 集群的互动或监控作业后,您可以在运行 kubectl ray session 命令的终端中按 Ctrl+C 来终止互动式会话。

清理

为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。

如果您在新的 Google Cloud 项目中部署了快速入门,但不再需要该项目,请完成以下步骤来将其删除:

  1. 在 Google Cloud 控制台中,前往管理资源页面
  2. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中,输入项目 ID,然后点击关停以删除该项目。

如果您没有创建新的 Google Cloud 项目,但不再需要 GKE 集群,则可以运行以下命令将其删除:

gcloud container clusters delete my-ray-enabled-cluster \
    --location=us-central1

后续步骤

  • 探索 GKE 上的 Ray 的其他示例、最佳实践和工具:如需了解详情,请参阅 ai-on-gke GitHub 代码库。
  • 详细了解如何在 GKE 上使用加速器:在机器学习和数据分析任务中使用 GPU 进行并行处理。使用 TPU 加速大规模深度学习模型训练和推理。
  • 详细了解 Ray Operator:如需详细了解如何使用 Ray Operator 管理 Ray 部署(包括 Ray 作业),请参阅 GKE 上的 Ray 简介
  • 利用 Kueue 进行作业排队:探索 Kubernetes 原生作业排队系统 Kueue 如何帮助管理 AI/机器学习工作负载并确定其优先级,从而提高资源利用率。如需了解详情,请参阅针对混合 AI/机器学习训练和推理工作负载优化 GKE 资源利用率