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