使用预留资源#
随着最近的 GPU 短缺,云提供商的预留已成为确保特定时长内 GPU 可用性的常用方法。这些预留可以是短期(例如 1-30 天)的容量保证,也可以是长期(例如 1-3 年)的合约。
本指南展示了如何使用 SkyPilot 从预留中请求资源,甚至将它们与按需/Spot 资源结合使用,以充分利用您云账号中的容量。

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 的行为如下
查询 AWS 区域和可用区中的预留/容量块,以查找所有可用容量。(如果任务指定了要使用的特定区域或可用区,则仅查询这些区域/可用区。)
对于每个可用区,计算其成本:任何可用的预留容量都被视为零成本,如果需要任何按需/Spot 资源来补充可用的预留容量以完全满足请求,则将其按需/Spot 价格包含在内。
按照每个可用区成本递增的顺序,在这些可用区中自动故障转移,直到所需资源被配置。
例如,如果您使用以下 SkyPilot YAML 启动一个集群
resources:
cloud: aws
accelerators: A100:8
num_nodes: 2
SkyPilot 将按如下方式利用容量预留/容量块
分别查询
us-east-2
和us-west-2
中 ID 为cr-123456789a
和cr-23456789ab
的预留/容量块。假设结果如下在
us-east-2
中有 1 个 A100 实例容量可用,在
us-west-2
中没有可用容量。
SkyPilot 按上述方式计算所有可用区的定价。结果是
us-east-2
可用区比所有其他可用区便宜,因为前者提供 2 个节点的成本是 1 个按需节点的成本(通过使用预留容量满足 1 个节点)。因此,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
run_duration
:创建的实例保持活动状态的时长(单位:秒,必需)。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
kueue.x-k8s.io/queue-name
:提交资源请求的 Kueue 队列名称。provreq.kueue.x-k8s.io/maxRunDurationSeconds
:创建的实例保持活动状态的最大时长(单位:秒,必需)。provision_timeout
:使用 DWS 配置实例的超时时间(单位:秒,可选)。如果在达到超时时间时仍未获取所需资源,SkyPilot 将自动故障转移到其他云/区域/可用区以获取资源。
长期预留#
与上述短期预留不同,长期预留通常时长超过一个月,可视为一种本地集群。
SkyPilot 通过 Kubernetes 支持长期预留和本地集群,即您可以在预留资源之上搭建一个 Kubernetes 集群,并通过 SkyPilot 与其交互。
有关在现有机器上设置 Kubernetes 集群的简单步骤,请参阅使用现有机器或使用现有 Kubernetes 集群。