在 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 工作负载。
准备工作
在开始之前,请确保您已执行以下任务:
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
Install the Google Cloud CLI.
-
Configure the gcloud CLI to use your federated identity.
For more information, see Sign in to the gcloud CLI with your federated identity.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- 安装
kubectl
:kubectl
是与 GKE 集群互动的主要命令行工具。如果您使用 Cloud Shell,则kubectl
已安装。否则,请运行gcloud components install kubectl
命令将其安装在终端中。如需验证您的安装,请运行以下命令:
kubectl version --client
- 安装 Ray:我们强烈建议您在安装 Ray 之前创建并进入 Python 虚拟环境 (
venv
),以便隔离其依赖项。- 安装 Python。
- 创建并激活新的虚拟环境。
- 在虚拟环境中运行以下命令,安装 Ray 的最新稳定版本:
pip install -U "ray[default]"
。 - 如需验证安装,请运行以下命令:
ray --version
。请记下输出中的 Ray 版本(例如 2.44.1)。
- 确保您的 Google Cloud 项目具有足够的 L4 GPU 配额。如需了解详情,请参阅 GPU 简介和分配配额。
创建 GKE 集群
您可以在 GKE Autopilot 或 Standard 集群中部署工作负载。我们建议您使用 Autopilot 集群获得全托管式 Kubernetes 体验。如需选择最适合您的工作负载的 GKE 操作模式,请参阅选择 GKE 操作模式。
Autopilot
在 Autopilot 模式下,Google 会管理您的集群配置,包括扩缩、安全性和其他预配置的设置。Autopilot 集群经过优化,可以运行大多数生产工作负载,并可根据 Kubernetes 清单预配计算资源。
在终端中,运行以下
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。
配置
kubectl
以与您的集群通信:gcloud container clusters get-credentials my-ray-enabled-cluster \ --region=us-central1
Standard
在 Standard 模式下,您可以更好地控制 GKE 集群的底层基础设施。您可以直接管理节点池、节点大小和其他配置,从而实现更出色的自定义。标准集群适合需要特定配置或对资源进行严格控制的工作负载。
在终端中,运行以下
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
:集群可扩缩到的内存量上限(以千兆字节为单位)。
配置
kubectl
以与您的集群通信:gcloud container clusters get-credentials my-ray-enabled-cluster \ --region=us-central1
安装 KubeRay kubectl ray
插件
kubectl ray
插件可简化 Kubernetes 上常见的 Ray 工作流。如需了解最新的安装说明,请参阅 KubeRay 文档。
前往版本页面,然后下载适合您平台的二进制程序。例如,如需在 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
中的目录。验证安装效果:
kubectl ray version
如果您看到
KubeRay operator installation cannot be found: no KubeRay operator deployments found in any namespace.
之类的警告,可以放心地予以忽略。 如果安装成功,则输出为kubectl ray
插件的版本。
在集群中创建自定义计算类
借助 GKE 中的自定义计算类,您可以按优先级定义特定的硬件要求,例如 GPU 类型和数量。GKE 在为工作负载预配节点时会使用此优先级。
如需创建本指南中的示例自定义计算类,请按照以下步骤操作:
将以下计算类规范保存为
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
运行以下命令以创建计算类:
kubectl apply -f nvidia-l4-compute-class.yaml
应用自定义计算类后会发生什么情况? 应用计算类 YAML 文件后,当 Ray 集群请求节点时,GKE 会自动预配具有一个 NVIDIA L4 GPU 的节点。它将优先使用清单中定义的 Spot 虚拟机。
whenUnsatisfiable: DoNotScaleUp
设置会指示 GKE 不要创建不符合指定要求的节点。
创建并验证 Ray 集群
现在,您可以在 GKE 集群上创建 Ray 集群。
创建 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
的节点上。
验证 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 头节点的 Pod,名称类似于
提交 Ray 作业
Ray 集群准备就绪后,您可以向 GKE 上正在运行的 Ray 集群提交 Ray 作业。
为此,请使用 kubectl ray session
命令启动互动式会话,并使用 ray job submit
命令开始执行作业。
启动 Ray 互动式会话。如需与 Ray 集群建立本地连接,请运行以下命令:
kubectl ray session my-ray-cluster
此命令会在您的本地机器与 GKE 集群中的 Ray 头节点之间启动端口转发。请注意,此会话处于活跃状态时,您的终端将被占用;如需继续操作,请打开单独的终端实例。
创建要运行的示例代码。将以下示例代码保存到名为
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"
打开新终端并提交 Ray 作业。
- 在本地机器上打开一个新终端。如果您为 Ray 安装创建了虚拟环境,请确保在此新终端中也激活该环境。
- 前往您保存
sample_code.py
文件的目录。 运行以下命令:
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
)。
查看 Ray 作业。您可以通过以下方式之一监控作业:
- Ray 信息中心:打开网络浏览器,然后前往
http://localhost:8265
。此网址会打开 Ray 信息中心,您可以在其中查看有关正在运行的作业的信息,包括状态、日志和资源使用情况。 - Metrics Explorer:使用Google Cloud 控制台中的预构建指标信息中心。如需了解详情,请参阅收集和查看 GKE 上的 Ray 集群的日志和指标。
- Ray 信息中心:打开网络浏览器,然后前往
终止 Ray 会话。完成与 Ray 集群的互动或监控作业后,您可以在运行
kubectl ray session
命令的终端中按Ctrl+C
来终止互动式会话。
清理
为避免因本页中使用的资源导致您的 Google Cloud 账号产生费用,请按照以下步骤操作。
如果您在新的 Google Cloud 项目中部署了快速入门,但不再需要该项目,请完成以下步骤来将其删除:
- 在 Google Cloud 控制台中,前往管理资源页面。
- 在项目列表中,选择要删除的项目,然后点击删除。
- 在对话框中,输入项目 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 资源利用率。