使用预留资源#

随着最近的 GPU 短缺,云提供商的预留已成为确保特定时长内 GPU 可用性的常用方法。这些预留可以是短期(例如 1-30 天)的容量保证,也可以是长期(例如 1-3 年)的合约。

本指南展示了如何使用 SkyPilot 从预留中请求资源,甚至将它们与按需/Spot 资源结合使用,以充分利用您云账号中的容量。

https://i.imgur.com/FA0BT0E.png

AWS 容量预留和容量块#

AWS 的容量预留 (capacity reservations)容量块 (capacity blocks) 是在一段时间内预留一定计算容量的方法。容量块主要用于高端 GPU,例如 A100(P4d 实例)和 H100(P5d 实例),而容量预留适用于所有其他实例类型。您无需签订 1-3 年的长期合约,即可分别获得最短 1 秒或 1 天的容量预留或容量块。

要请求容量预留/容量块,请参阅官方文档

成功创建预留/容量块后,您将获得一个预留/容量块 ID,例如 cr-012345678

要使用预留/容量块,您可以在 ~/.sky/config.yaml 中指定两个字段

  • aws.prioritize_reservations:是否优先从任何区域/可用区中的容量预留启动集群,而不是按需/Spot 集群。这对于充分利用您使用 Instance eligibility: open 创建的预留容量很有用。

  • aws.specific_reservations:SkyPilot 可以使用的一系列预留 ID。如果您在多个区域/可用区为不同的实例类型拥有多个使用 Instance eligibility: targeted 的容量预留或容量块,这将很有用。

示例

aws:
  prioritize_reservations: true
  specific_reservations:
    # 1x H100 capacity block in us-east-1
    - "cr-0123456789"
    # 2x A100 reservation in us-east-2
    - "cr-123456789a"
    # 2x A100 reservation in us-west-2
    - "cr-23456789ab"
    # 2x M5a.16xlarge reservation in us-east-1
    - "cr-3456789abc"

有关这些字段的更多详细信息,请参阅高级配置

注意

如果指定了任何这些字段,SkyPilot 优化器可能需要大约 30 秒来从您的 AWS 账号中检索所有区域和可用区的最新预留/容量块状态。

利用预留资源#

通过指定上述配置,SkyPilot 在您启动集群/作业时,将优先使用预留/容量块中的任何可用容量(即将其视为零成本)。

具体来说,SkyPilot 的行为如下

  1. 查询 AWS 区域和可用区中的预留/容量块,以查找所有可用容量。(如果任务指定了要使用的特定区域或可用区,则仅查询这些区域/可用区。)

  2. 对于每个可用区,计算其成本:任何可用的预留容量都被视为零成本,如果需要任何按需/Spot 资源来补充可用的预留容量以完全满足请求,则将其按需/Spot 价格包含在内。

  3. 按照每个可用区成本递增的顺序,在这些可用区中自动故障转移,直到所需资源被配置。

例如,如果您使用以下 SkyPilot YAML 启动一个集群

resources:
  cloud: aws
  accelerators: A100:8

num_nodes: 2

SkyPilot 将按如下方式利用容量预留/容量块

  1. 分别查询 us-east-2us-west-2 中 ID 为 cr-123456789acr-23456789ab 的预留/容量块。假设结果如下

    • us-east-2 中有 1 个 A100 实例容量可用,

    • us-west-2 中没有可用容量。

  2. SkyPilot 按上述方式计算所有可用区的定价。结果是 us-east-2 可用区比所有其他可用区便宜,因为前者提供 2 个节点的成本是 1 个按需节点的成本(通过使用预留容量满足 1 个节点)。

  3. 因此,SkyPilot 将尝试在 us-east-2 中配置一个按需 A100 实例。如果不可用,SkyPilot 将继续自动故障转移到其他云/区域/可用区,以获取普通的按需/Spot 实例。

提示

如果您有一个容量块,其开始时间在未来,您可以运行 sky jobs launch --region us-east-1 --gpus H100:8 task.yaml,让 SkyPilot 自动等待直到开始时间到达。也就是说,您不必为了在新可用的容量块上启动作业而在太平洋夏令时凌晨 4:30 起床。

GCP 预留#

GCP 预留与 AWS 容量预留类似,您可以预留特定时长的计算容量。

要获取预留,请参阅 GCP 官方文档

与 AWS 类似,您可以在 ~/.sky/config.yaml 中指定两个字段

  • gcp.prioritize_reservations:是否优先从任何区域/可用区中的预留启动集群,而不是按需/Spot 集群。这对于充分利用您的自动消耗预留很有用。

  • gcp.specific_reservations:SkyPilot 可以使用的一系列预留 ID。如果您在多个区域/可用区为不同的实例类型拥有多个特定预留,这将很有用。

示例

gcp:
  prioritize_reservations: true
  specific_reservations:
    - projects/my-project/reservations/my-reservation1
    - projects/my-project/reservations/my-reservation2

SkyPilot 将像利用 AWS 预留一样,利用 GCP 预留,如利用预留资源中所述。

GCP 动态工作负载调度器 (DWS)#

GCP 动态工作负载调度器 (DWS) 是一种资源管理服务,它 (1) 接收 GPU 容量请求,(2) 在请求的资源可用时自动配置,以及 (3) 在指定时长内保持资源运行。

技巧

经验表明,与使用按需或 Spot 实例相比,使用 DWS 可以显著增加获取高端 GPU 资源(如 A100 和 H100)的机会。

将 DWS 用于虚拟机#

SkyPilot 允许您通过在 ~/.sky/config.yaml 中指定 gcp.managed_instance_group 字段来通过 DWS 启动资源

gcp:
  managed_instance_group:
    run_duration: 3600
    provision_timeout: 900
  1. run_duration:创建的实例保持活动状态的时长(单位:秒,必需)。

  2. provision_timeout:使用 DWS 配置实例的超时时间(单位:秒,可选)。如果在达到超时时间时仍未配置所需资源,SkyPilot 将自动故障转移到其他云/区域/可用区以获取资源。

有关更多详细信息,请参阅高级配置

如果您想为每个作业/集群指定 DWS 配置,您也可以在 SkyPilot 任务 YAML 中指定配置(参见此处

config:
  gcp:
    managed_instance_group:
      run_duration: 3600
      provision_timeout: 900

resources:
  cloud: gcp
  accelerators: A100:8

num_nodes: 4

在 GKE 上结合 Kueue 使用 DWS#

DWS 也支持在结合 Kueue 的 Google Kubernetes Engine (GKE) 上使用。要在 GKE 上启用 DWS,您需要使用 Kueue 和 DWS 设置 GKE 集群;请参阅 GCP 官方文档

要在结合 DWS 的 GKE 上启动 SkyPilot 集群或作业,您可以在 SkyPilot 任务 YAML 中指定 DWS 配置

config:
  kubernetes:
    pod_config:
      metadata:
        annotations:
          provreq.kueue.x-k8s.io/maxRunDurationSeconds: "3600"
    provision_timeout: 900

resources:
  cloud: kubernetes
  accelerators: A100:8
  labels:
    kueue.x-k8s.io/queue-name: dws-local-queue
  1. kueue.x-k8s.io/queue-name:提交资源请求的 Kueue 队列名称。

  2. provreq.kueue.x-k8s.io/maxRunDurationSeconds:创建的实例保持活动状态的最大时长(单位:秒,必需)。

  3. provision_timeout:使用 DWS 配置实例的超时时间(单位:秒,可选)。如果在达到超时时间时仍未获取所需资源,SkyPilot 将自动故障转移到其他云/区域/可用区以获取资源。

长期预留#

与上述短期预留不同,长期预留通常时长超过一个月,可视为一种本地集群

SkyPilot 通过 Kubernetes 支持长期预留和本地集群,即您可以在预留资源之上搭建一个 Kubernetes 集群,并通过 SkyPilot 与其交互。

有关在现有机器上设置 Kubernetes 集群的简单步骤,请参阅使用现有机器使用现有 Kubernetes 集群