保留、容量块、DWS#

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

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

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

AWS 容量预留和容量块#

AWS 容量预留容量块 是在一段时间内保留一定计算容量的方法。后者适用于高端GPU,如A100s(P4d实例)和H100s(P5d实例),而前者适用于所有其他实例类型。 与签订1-3年的长期合同不同,您可以分别获得短至1秒或1天的容量预留或容量块。

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

一旦你成功创建了一个预订/区块,你将获得一个预订/区块的ID,例如 cr-012345678

要使用预订/阻止功能,您可以在 ~/.sky/config.yaml 中指定两个字段:

  • aws.prioritize_reservations: 是否优先从任何区域/区域的容量预留中启动集群,而不是按需/竞价集群。这对于充分利用您使用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. 对于每个区域,计算其成本:任何可用的预留容量被视为零成本,如果需要任何按需/竞价资源来补充可用的预留容量以完全满足请求,则包括它们的按需/竞价价格。

  3. 自动故障转移 通过这些区域,按照每个区域成本递增的顺序,直到请求的资源被分配。

例如,如果您正在使用以下SkyPilot YAML启动集群:

resources:
  cloud: aws
  accelerators: A100:8

num_nodes: 2

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

  1. us-east-2us-west-2中分别查询预订/区块,预订号为cr-123456789acr-23456789ab。假设结果如下:

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

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

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

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

提示

如果你有一个未来开始时间的容量块,你可以运行sky jobs launch --region us-east-1 --gpus H100:8 task.yaml让SkyPilot自动等待直到达到开始时间。也就是说,你不必在PDT时间凌晨4:30起床来在新可用的容量块上启动你的任务。

GCP 预留#

GCP 预留类似于 AWS 容量预留,您可以在任何时间段内预留一定量的计算容量。

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

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

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

  • 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 动态工作负载调度器 (DWS)#

GCP Dynamic Workload Scheduler (DWS) 是一种资源管理服务,它(1)接收GPU容量请求,(2)在资源可用时自动配置所请求的资源,以及(3)保持资源在指定时间内运行。

提示

据观察,与使用按需或竞价实例相比,使用DWS可以显著增加获得高端GPU资源(如A100和H100)的机会。

使用DWS进行虚拟机管理#

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

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

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

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

如果你想为每个作业/集群指定DWS配置,你也可以在SkyPilot任务YAML中指定配置(参见这里):

experimental:
  config_overrides:
    gcp:
      managed_instance_group:
        run_duration: 3600
        provision_timeout: 900

resources:
  cloud: gcp
  accelerators: A100:8

num_nodes: 4

在GKE上使用Kueue的DWS#

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

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

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

resourcse:
  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将自动failover到其他云/区域/区域以获取资源。

长期预订#

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

SkyPilot 支持通过 Kubernetes 进行长期预留和本地集群,即您可以在预留资源上设置 Kubernetes 集群,并通过 SkyPilot 与其进行交互。

查看在现有机器上设置Kubernetes集群的简单步骤,请参阅使用现有机器引入您现有的Kubernetes集群