将灵活启动虚拟机与 Slurm 集群搭配使用

本指南介绍了如何在 Gemini Enterprise Agent Platform 平台上配置和使用灵活启动型虚拟机与 Slurm。通过此集成,您可以为训练工作负载使用灵活的虚拟机预配模型。

配置和集群创建

在定义集群的配置之前,您必须先完成以下一次性前提步骤,以确保必要的服务账号已获得授权来管理 Flex Start 资源。

验证 Google APIs 服务代理的权限

  • 背景信息:Gemini Enterprise Agent Platform 上的 Slurm 使用托管式实例组来动态预配灵活启动型虚拟机实例并管理其生命周期。Google APIs 服务代理会为代管式实例组创建和管理底层 Compute Engine 资源。如托管式实例组和 IAM 文档中所述,此服务账号需要具备创建、删除和列出虚拟机实例的权限,以及将服务账号身份附加到这些实例的权限。
  • 操作:检查您的 Google API 服务代理 (PROJECT_NUMBER@cloudservices.) 是否已具有 Editor 角色 (roles/editor)。
    • 如果回答为“是”:您可能无需采取进一步行动。编辑者角色通常包含所有必需的权限。
    • 如果为“否”:如果未授予默认的 Editor 角色,您必须明确授予以下角色,以确保 MIG 可以正常运行:
      • Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) - 创建、列出和删除虚拟机实例所需的角色。
      • 服务账号用户 (roles/iam.serviceAccountUser) - 将服务账号附加到新虚拟机时需要此权限。

使用灵活启动预配模型创建 Slurm 集群

如需创建使用灵活启动预配模型的 Slurm 集群,您必须在使用 API 提交集群创建请求时,在集群规范的节点池配置中指定 provisioning_model

配置代码段示例:将以下 JSON 配置保存到名为 cluster_config.json 的文件中。此示例明确使用了 slurm_spec。将占位符(例如 <project-id>, <region>, <zone>)替换为实际值。

{
  "display_name": "flexvm",
  "name": "projects/<project-id>/locations/<region>/modelDevelopmentClusters/",
  "network": {
    "network": "projects/<project-id>/global/networks/default",
    "subnetwork": "projects/<project-id>/regions/<region>/subnetworks/default"
  },
  "node_pools": [
    {
      "id": "login",
      "machine_spec": { "machine_type": "n2-standard-8" },
      "scaling_spec": { "min_node_count": 1, "max_node_count": 1 },
      "enable_public_ips": "true",
      "zone": "<zone>",
      "boot_disk": { "boot_disk_type": "pd-standard", "boot_disk_size_gb": 120 }
    },
    {
      "id": "a3u",
      "machine_spec": {
        "machine_type": "a3-ultragpu-8g",
        "accelerator_type": "NVIDIA_H200_141GB",
        "accelerator_count": 8
      },
      "provisioning_model": "FLEX_START",
      "flex_start_max_duration": "604800s",
      "scaling_spec": { "min_node_count": 0, "max_node_count": 2 },
      "zone": "<zone>",
      "enable_public_ips": "true",
      "boot_disk": { "boot_disk_type": "hyperdisk-balanced", "boot_disk_size_gb": 400 }
    }
  ],
  "orchestrator_spec": {
    "slurm_spec": {
      "home_directory_storage": "projects/<project-id>/locations/<zone>/instances/<filestore-id>",
      "partitions": [ { "id": "a3u", "node_pool_ids": [ "a3u" ] } ],
      "login_node_pool_id": "login"
    }
  }
}

按照创建 Slurm 集群中的步骤进行身份验证并提交请求。

灵活启动时长上限:您可以选择为灵活启动实例设置运行时长上限。在节点池配置中使用 flex_start_max_duration 字段,以字符串形式指定值(以秒为单位),并附加“s”(例如,“172800s”表示 2 天)。如果省略,系统会默认设置为 7 天。

运营生命周期和弹性

了解 Gemini Enterprise Agent Platform 上的 Slurm 环境中灵活启动节点的生命周期对于规划作业至关重要。

灵活启动限制

所有灵活启动虚拟机的最大运行时长都是固定的,由 flex_start_max_duration 设置定义。

  • 时长限制:默认情况下,flex_start_max_duration 设置为 7 天。您可以在节点池配置中指定介于 30 秒到 7 天(604,800 秒)之间的自定义 flex_start_max_duration,以更好地匹配预期的作业运行时长,从而替换此限制。
  • 终止:达到此限制时,Compute Engine 会严格终止实例。

节点伸缩行为

以下各部分介绍了两种可用的伸缩策略:静态和动态。

静态节点

静态节点可让您维护始终可用的固定资源池(例如 min_node_count > 0)。

  • 预配:在创建集群或调整集群大小时,系统会立即请求节点,以满足最低节点数。
  • 过期和恢复:当静态灵活启动节点达到 flex_start_max_duration 并被 Compute Engine 终止时,系统会自动尝试重新创建该节点,以恢复定义的集群容量。无论 Slurm 作业是否在节点上等待,此周期都能确保静态池保持填充状态。

动态节点

借助动态节点,集群仅在需要时进行扩容。

  • 预配:当作业排队(进入 PENDING 状态)时,Slurm 调度程序会通过创建代管式实例组并发出调整大小请求来请求资源。
  • 过期和恢复:过期后,仅当节点上有待处理的 Slurm 作业时,系统才会预配新的 Flex Start 节点。

集群弹性和自动修复

Gemini Enterprise Agent Platform 上的 Slurm 会在作业生命周期的关键阶段监控节点健康状况。健康检查会在作业开始之前(序言)和完成之后(后记)运行,以帮助保持作业稳定性。

  • 硬件错误处理:如果服务检测到严重的硬件问题(例如 GPU 错误),则会尝试自动修复健康状况不佳的虚拟机。
  • 自动替换:如果作业仍处于 PENDING 状态(或由于节点故障而重新排队到 PENDING 状态),系统会自动预配新的 Flex Start 实例来替换运行状况不佳的虚拟机。这样,您的工作负载就可以在运行状况良好的硬件上继续运行,而无需手动干预。