创建 Ray on Vertex AI 集群

您可以使用 Google Cloud 控制台或 Vertex AI SDK for Python 创建 Ray 集群。一个集群最多可以有 2,000 个节点。一个工作器池中的节点数上限为 1,000。工作器池的数量没有限制,但如果有大量工作器池(例如,有 1,000 个工作器池,每个工作器池有一个节点),可能会对集群性能产生负面影响。

在开始之前,请务必阅读 Ray on Vertex AI 概览设置您需要的所有必要工具。

Vertex AI 上的 Ray 集群在您创建后可能需要 10-20 分钟才能启动。

控制台

根据 OSS Ray 最佳实践建议,强制在 Ray 头节点上将逻辑 CPU 数量设置为 0,以便避免在头节点上运行任何工作负载。

  1. 在 Google Cloud 控制台中,转至“Ray on Vertex AI”页面。

    转至“Ray on Vertex AI”页面

  2. 点击创建集群,打开创建集群面板。

  3. 对于创建集群面板中的每个步骤,请查看或替换默认集群信息。点击继续以完成每个步骤:

    1. 名称和区域中,为集群指定名称并选择位置

    2. 计算设置中,指定 Vertex AI 上的 Ray 集群的头节点的配置,包括其机器类型、加速器类型和数量、磁盘类型和大小以及副本数量。(可选)您可以添加自定义映像 URI 来指定自定义容器映像,以添加默认容器映像未提供的 Python 依赖项。请参阅自定义映像

      高级选项下,您可以:

      • 指定您自己的加密密钥。
      • 指定自定义服务账号
      • 如果您在训练期间不需要监控工作负载的资源统计信息,请停用指标收集。
    3. (可选)如需为集群设置专用端点(而非公共端点),请指定要与 Ray on Vertex AI 搭配使用的 VPC 网络。如需了解详情,请参阅专用连接和公共连接

      如果您还没有为 VPC 网络设置连接,请点击设置连接。在创建专用服务访问连接面板中,完成以下每个步骤,然后点击继续

      1. 启用 Service Networking API

      2. 对于分配 IP 地址范围,您可以选择、创建或允许 Google 自动分配 IP 地址范围。

      3. 对于创建连接,请查看网络分配的 IP 范围信息。

      4. 点击创建连接

  4. 点击创建

Vertex AI SDK 上的 Ray

根据 OSS Ray 最佳实践建议,强制在 Ray 头节点上将逻辑 CPU 数量设置为 0,以便避免在头节点上运行任何工作负载。

在交互式 Python 环境中,使用以下命令在 Vertex AI 上创建 Ray 集群:

import ray
import vertex_ray
from google.cloud import aiplatform
from vertex_ray import Resources

# Define a default CPU cluster, machine_type is n1-standard-16, 1 head node and 1 worker node
head_node_type = Resources()
worker_node_types = [Resources()]

# Or define a GPU cluster.
head_node_type = Resources(
  machine_type="n1-standard-16",
  node_count=1,
  custom_image="us-docker.pkg.dev/my-project/ray-custom.2-9.py310:latest",  # Optional. When not specified, a prebuilt image is used.
)

worker_node_types = [Resources(
  machine_type="n1-standard-16",
  node_count=2,  # Must be >= 1
  accelerator_type="NVIDIA_TESLA_T4",
  accelerator_count=1,
  custom_image="us-docker.pkg.dev/my-project/ray-custom.2-9.py310:latest",  # When not specified, a prebuilt image is used.
)]

aiplatform.init()
# Initialize Vertex AI to retrieve projects for downstream operations.
# Create the Ray cluster on Vertex AI
CLUSTER_RESOURCE_NAME = vertex_ray.create_ray_cluster(
  head_node_type=head_node_type,
  network=NETWORK, #Optional
  worker_node_types=worker_node_types,
  python_version="3.10",  # Optional
  ray_version="2.33",  # Optional
  cluster_name=CLUSTER_NAME, # Optional
  service_account=SERVICE_ACCOUNT,  # Optional
  enable_metrics_collection=True,  # Optional. Enable metrics collection for monitoring.
  labels=LABELS,  # Optional.

)

其中:

  • CLUSTER_NAME:Ray on Vertex AI 集群的名称,该名称在整个项目中必须是唯一的。

  • NETWORK:(可选)VPC 网络的完整名称,格式为 projects/PROJECT_ID/global/networks/VPC_NAME。如需为集群设置专用端点(而非公共端点),请指定要与 Ray on Vertex AI 搭配使用的 VPC 网络。如需了解详情,请参阅专用连接和公共连接

  • VPC_NAME:(可选)虚拟机运行所在的 VPC。

  • PROJECT_ID:您的 Google Cloud 项目 ID。 您可以在 Google Cloud 控制台欢迎页面中找到项目 ID。

  • SERVICE_ACCOUNT:(可选)用于在集群中运行 Ray 应用的服务账号。应授予所需角色

  • LABELS:(可选)带有用户定义元数据的标签,用于整理 Ray 集群。标签键和值不能超过 64 个字符(Unicode 代码点),并且只能包含小写字母、数字字符、下划线和短划线。允许使用国际字符。如需了解详情和标签示例,请访问 https://goo.gl/xmQnxf

您应该会看到以下输出,直到状态更改为 RUNNING

[Ray on Vertex AI]: Cluster State = State.PROVISIONING
Waiting for cluster provisioning; attempt 1; sleeping for 0:02:30 seconds
...
[Ray on Vertex AI]: Cluster State = State.RUNNING

请注意以下几点:

  • 第一个节点用作头节点。

  • 不支持 TPU 机器类型。

生命周期管理

在 Ray on Vertex AI 集群的生命周期内,每个操作都与一个状态相关联。下表总结了各个状态的结算状态和管理选项。参考文档提供了每种状态的定义。

操作 状态 计费? 是否可以执行删除操作? 是否可以取消操作?
用户正在创建集群 正在预配
用户手动扩缩 正在更新 是,按实时大小
集群正在运行 正在运行 不适用 - 您可以删除
集群正在进行自动扩缩 正在更新 是,按实时大小
用户正在删除集群 正在停止 不适用 - 已停止
集群进入错误状态 错误 不适用 - 您可以删除
不适用 状态不明 不适用

自定义图片(可选)

预构建的映像适用于大多数用例。如果您想构建自己的映像,建议您使用 Ray on Vertex 预构建映像作为基础映像。如需了解如何从基础映像构建映像,请参阅 Docker 文档

这些基础映像包含 Python、Ubuntu 和 Ray 的安装。它们还包含以下依赖项:

  • python-json-logger
  • google-cloud-resource-manager
  • ca-certificates-java
  • libatlas-base-dev
  • liblapack-dev
  • g++、libio-all-perl
  • libyaml-0-2
  • rsync

如果您想在不使用我们的基础映像的情况下构建自己的映像(高级),请确保您的映像包含:

  • Ray 2.33.0 或 2.9.3
  • Python 3.10
  • python-json-logger==2.0.7

专用连接和公共连接

默认情况下,Ray on Vertex AI 会创建一个安全的公共端点,以便通过 Ray on Vertex AI 上的 Ray 集群使用 Ray 客户端进行交互式开发。建议您将公共连接用于开发或临时用例。此公共端点可通过互联网访问。只有在 Ray 集群的用户项目中至少拥有 Vertex AI 用户角色权限的授权用户才能访问集群。

如果您需要与集群建立专用连接,或者如果您使用的是 VPC Service Controls,Vertex AI 上的 Ray 集群支持 VPC 对等互连。只有位于与 Vertex AI 对等互连的 VPC 网络中的客户端才能访问具有专用端点的集群。

如需为 Ray on Vertex AI 使用 VPC 对等互连设置专用连接,请在创建集群时选择 VPC 网络。VPC 网络需要在您的 VPC 网络和 Vertex AI 之间建立专用服务连接。如果您要在控制台中使用 Ray on Vertex AI,则可以在创建集群时设置专用服务访问通道连接。

如果您想在 Vertex AI 上将 VPC Service Controls 和 VPC 对等互连与 Ray 集群搭配使用,则需要进行额外的设置才能使用 Ray 信息中心和交互式 shell。按照使用 VPC-SC + VPC 对等互连的 Ray 信息中心和交互式 Shell 中的说明,在您的用户项目中使用 VPC-SC 和 VPC 对等互连配置交互式 Shell 设置。

在 Vertex AI 上创建 Ray 集群后,您可以使用 Vertex AI SDK for Python 连接到头节点。连接环境(例如 Compute Engine 虚拟机或 Vertex AI Workbench 实例)必须位于与 Vertex AI 对等互连的 VPC 网络中。请注意,专用服务连接的 IP 地址数量有限,这可能会导致 IP 地址用尽。因此,建议您为长时间运行的集群使用专用连接。

使用 VPC-SC + VPC 对等互连的 Ray 信息中心和交互式 Shell

  1. 配置 peered-dns-domains

    {
      VPC_NAME=NETWORK_NAME
      REGION=LOCATION
      gcloud services peered-dns-domains create training-cloud \
      --network=$VPC_NAME \
      --dns-suffix=$REGION.aiplatform-training.cloud.google.com.
    
      # Verify
      gcloud beta services peered-dns-domains list --network $VPC_NAME);
    }
        
    • NETWORK_NAME:更改为对等互连的网络。

    • LOCATION:所需位置(例如 us-central1)。

  2. 配置 DNS managed zone

    {
      PROJECT_ID=PROJECT_ID
      ZONE_NAME=$PROJECT_ID-aiplatform-training-cloud-google-com
      DNS_NAME=aiplatform-training.cloud.google.com
      DESCRIPTION=aiplatform-training.cloud.google.com
    
      gcloud dns managed-zones create $ZONE_NAME  \
      --visibility=private  \
      --networks=https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/$VPC_NAME  \
      --dns-name=$DNS_NAME  \
      --description="Training $DESCRIPTION"
    }
        
    • PROJECT_ID:您的项目 ID。您可以在 Google Cloud 控制台的欢迎页面中找到这些 ID。

  3. 记录 DNS 事务。

    {
      gcloud dns record-sets transaction start --zone=$ZONE_NAME
    
      gcloud dns record-sets transaction add \
      --name=$DNS_NAME. \
      --type=A 199.36.153.4 199.36.153.5 199.36.153.6 199.36.153.7 \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction add \
      --name=*.$DNS_NAME. \
      --type=CNAME $DNS_NAME. \
      --zone=$ZONE_NAME \
      --ttl=300
    
      gcloud dns record-sets transaction execute --zone=$ZONE_NAME
    }
        
  4. 提交已启用交互式 shell 和 VPC-SC 以及 VPC 对等互连的训练作业。

后续步骤