云存储桶#

SkyPilot 任务可以访问云对象存储服务(例如 AWS S3、Google Cloud Storage (GCS)、Cloudflare R2、OCI Object Storage 或 IBM COS)中存储桶的数据。

存储桶在远程虚拟机上的本地路径可供每个任务使用,因此任务可以像访问本地文件一样访问存储桶对象。

使用方法#

对象存储使用 SkyPilot 任务中的 file_mounts 字段指定。

要访问现有存储桶(例如,通过云 CLI 或其他工具创建的),请指定 source

# Mount an existing S3 bucket
file_mounts:
  /my_data:
    source: s3://my-bucket/  # or gs://, https://<azure_storage_account>.blob.core.windows.net/<container>, r2://, cos://<region>/<bucket>, oci://<bucket_name>
    mode: MOUNT  # MOUNT or COPY or MOUNT_CACHED. Defaults to MOUNT. Optional.

这会将 s3://my-bucket/ 处的存储桶内容挂载到远程虚拟机上的 /my_data 处。

要创建空存储桶,请指定 name

# Create an empty gcs bucket
file_mounts:
  /my_data:
    name: my-sky-bucket
    store: gcs  # Optional: either of s3, gcs, azure, r2, ibm, oci

SkyPilot 将创建一个名为 my-sky-bucket 的空 GCS 存储桶,并将其挂载到 /my_data。此存储桶可用于直接将检查点、日志或其他输出写入云端。

注意

name 必须是唯一的才能创建新存储桶。如果存储桶已存在且由 SkyPilot 创建,SkyPilot 将获取并重复使用该存储桶,因此相同的 YAML 可以在多次运行中重复使用。

要创建新存储桶,将本地文件上传到此存储桶并将其附加到任务,请指定 namesource,其中 source 是本地路径。

# Create a new S3 bucket and upload local data
file_mounts:
  /my_data:
    name: my-sky-bucket
    source: ~/dataset  # Optional: path to local data to upload to the bucket
    store: s3  # Optional: either of s3, gcs, azure, r2, ibm, oci
    mode: MOUNT  # Optional: either MOUNT or COPY. Defaults to MOUNT.

SkyPilot 将创建一个名为 my-sky-bucket 的 S3 存储桶,并将 ~/dataset 的内容上传到其中。然后,该存储桶将挂载到 /my_data,您的数据将可供任务使用。

如果 store 被省略,SkyPilot 将使用与任务云相同的云提供商。

注意

如果存储桶已存在且由 SkyPilot 创建,SkyPilot 将获取并重复使用该存储桶。如果 source 处的任何文件发生更改,SkyPilot 将在任务开始时自动将新文件同步到存储桶。

您可以在 storage_demo.yaml 中找到更详细的使用示例。

存储模式#

云存储可以使用 MOUNT 模式、COPY 模式或 MOUNT_CACHED 模式。

  1. MOUNT 模式:存储桶直接“挂载”到远程虚拟机。即,任务访问文件时会进行流式传输,并且所有写入都会复制到远程存储桶。任何写入也会出现在挂载同一存储桶的其他虚拟机上。这是默认模式。

  2. COPY 模式:文件会被预取并缓存到本地磁盘。写入操作仅影响本地副本,并且不会流回存储桶。

  3. MOUNT_CACHED 模式:存储桶通过 VFS 缓存挂载到本地磁盘。写入操作会在上传到存储桶之前在本地进行缓存。SkyPilot 会等待缓存的条目上传到远程后再将任务或作业标记为完成。写入操作在多个节点之间不是立即一致的。

sky-storage-modes

选择存储模式#

MOUNTCOPYMOUNT_CACHED 模式中进行选择取决于工作负载、其性能要求以及数据大小。

mode: MOUNT

mode: COPY

mode: MOUNT_CACHED

最适合

写入任务输出;读取无法放入磁盘的超大型数据。

对可放入磁盘的数据集进行高性能只读访问。

高性能写入(例如模型检查点、日志),可放入磁盘缓存。

性能

🟡 读/写文件速度慢。调配速度快。

✅ 文件访问速度快。初始调配速度慢。

✅ 文件访问速度快。初始调配速度快。

写入存储桶

🟡 大多数写入操作 [1] 受支持。

❌ 不支持。只读。

✅ 支持所有写入操作。 [2]

磁盘大小

✅ 无磁盘大小要求 [3]

🟡 虚拟机磁盘大小必须大于存储桶的大小。

🟡 无磁盘大小要求,但缓存数据需要能放入磁盘。

注意

在底层,MOUNT 模式使用 FUSE 为附加的存储桶提供一种接近于“关闭即开放”的一致性模型。这意味着对文件调用 close() 会将整个文件上传到存储桶。任何后续读取都将看到最新数据。

注意

SkyPilot 不保证在附加存储桶时保留文件权限。您可能需要在任务执行期间设置文件权限。

注意

file_mounts 中,根据是否使用存储桶,符号链接的处理方式不同。对于存储桶挂载,符号链接不会复制到远程。对于直接通过 rsync 同步到虚拟机的本地 file_mounts,会直接复制符号链接,而不是其目标数据。目标必须单独挂载,否则符号链接可能会断开。

MOUNT_CACHED 模式详情#

MOUNT_CACHED 模式使用 rclone 提供一个与存储桶异步同步的虚拟文件系统。调用 close() 不保证文件已写入存储桶。rclone 会按照写入顺序异步将写入的文件同步回存储桶。本地文件系统应该是完全一致的,但在多个节点上使用 MOUNT_CACHED 的存储桶可能仅是最终一致。

MOUNT_CACHED 模式的重要注意事项

  • 如果文件写入速度快于上传到远程存储的速度,缓存将会增长直到磁盘空间耗尽。

  • 文件仅在被所有进程关闭后才开始上传。

  • 默认情况下,SkyPilot 一次使用一个传输,以确保文件按照在本地创建的相同顺序提交到远程存储。

  • 写入性能取决于用于缓存的磁盘层级——更快的磁盘提供更好的性能。

文件仅在被所有进程关闭后才开始上传。任务完成后,SkyPilot 会确保 SkyPilot YAML 的 run 部分中的所有缓存数据成功上传到远程存储桶,然后才将任务标记为完成。这保证了所有任务输出都安全地存储在云存储中,即使任务在上传完成之前就已完成执行。对于频繁写入的长时间运行任务,这可能会导致主计算完成后额外花费时间刷新缓存。

常见模式#

读取数据集#

如果您的数据集已在云存储桶中,您可以将其直接挂载到您的远程虚拟机。

# Mount an existing S3 bucket containing a dataset
file_mounts:
  /my_data:
    source: s3://my-dataset/
    mode: MOUNT

提示

如果您的数据集可以放入虚拟机的磁盘中,您可以使用 mode: COPY 来提高任务的 I/O 性能。有关详细信息,请参阅存储模式

存储任务输出#

您可以通过创建新存储桶并以 MOUNT 模式使用它,将任务的输出直接写入云存储桶。

💡 示例用例:写入模型检查点、训练运行日志。

# Creates an empty bucket. Any writes to /my_data will be replicated to s3://my-sky-bucket
file_mounts:
  /my_data:
    name: my-sky-bucket
    store: s3

然后,您的任务可以将文件写入 /my_data,并且这些文件将自动上传到云端。

避免在每次运行中重新上传数据#

与直接在 file_mounts 中使用本地路径相比,上传到存储桶可以更快,因为它具有持久性,因此需要从本地机器进行的上传次数更少。

💡 示例用例:上传本地数据集或文件一次,并在多个任务中使用。

# Creates a bucket and reuses it in multiple tasks and runs
file_mounts:
  /my_data:
    name: my-sky-bucket
    source: ~/my_local_path
    store: s3

注意

如果 source 处的数据发生更改,新文件将自动同步到存储桶。

工作节点之间的共享文件系统#

MOUNT 模式使用的存储桶可以充当运行在不同节点上的工作节点之间的共享文件系统。

💡 示例用例进程间通信 (IPC),在工作节点之间共享数据和输出。

num_nodes: 2

# This bucket will be mounted at /my_data on both nodes.
file_mounts:
  /my_data:
    name: my-sky-bucket
    store: s3

存储模型检查点#

MOUNT_CACHED 模式可以高效地将大型模型检查点存储在云存储桶中,而不会阻塞训练循环。

💡 示例用例:将模型检查点保存到云存储桶。

# Creates a bucket and reuses it in multiple tasks and runs
file_mounts:
  /my_checkpoint:
    name: my-sky-bucket
    store: gcs
    mode: MOUNT_CACHED

注意

当对检查点使用 MOUNT_CACHED 时,请确保您的检查点频率允许在写入下一个检查点之前将每个检查点完全刷新到远程存储桶。否则,本地缓存将持续增长,最终可能填满磁盘。新文件将在后台自动同步到存储桶。

使用 SkyPilot 存储 CLI#

要管理 SkyPilot 创建的存储桶,Sky CLI 提供了两个命令:sky storage lssky storage delete

  1. sky storage ls 显示 SkyPilot 创建的存储桶。

$ sky storage ls
NAME               CREATED     STORE  COMMAND                                        STATUS
sky-dataset        3 mins ago  S3     sky launch -c demo examples/storage_demo.yaml  READY
  1. sky storage delete 允许您删除 SkyPilot 创建的任何存储桶。

$ sky storage delete sky-dataset
Deleting storage object sky-dataset...
I 04-02 19:42:24 storage.py:336] Detected existing storage object, loading Storage: sky-dataset
I 04-02 19:42:26 storage.py:683] Deleting S3 Bucket sky-dataset

注意

sky storage ls 只显示由 SkyPilot 创建的存储。外部创建的存储桶或公共存储桶不会列在 sky storage ls 中,也无法通过 SkyPilot 进行管理。

存储 YAML 参考#

file_mounts:
  /remote_path:
    name: str
      Identifier for the storage object. Used when creating a new storage
      or referencing an existing storage created by SkyPilot. Not required
      when using an existing bucket created externally.

    source: str
      The source attribute specifies the path that must be made available
      in the storage object. It can either be:
      - A local path
      - A list of local paths
      - A remote path using one of the following formats:
        - s3://<bucket_name>
        - gs://<bucket_name>
        - https://<azure_storage_account>.blob.core.windows.net/<container_name>
        - r2://<bucket_name>
        - cos://<region_name>/<bucket_name>
        - oci://<bucket_name>@<region>

      If the source is local, data is uploaded to the cloud to an appropriate
      bucket (s3, gcs, azure, r2, oci, or ibm). If source is bucket URI,
      the data is copied or mounted directly (see mode flag below).

    store: str; either of 's3', 'gcs', 'azure', 'r2', 'ibm', 'oci'
      If you wish to force sky.Storage to be backed by a specific cloud object
      storage, you can specify it here. If not specified, SkyPilot chooses the
      appropriate object storage based on the source path and task's cloud provider.

    persistent: bool; default: True.
      Whether the remote backing stores in the cloud should be deleted after
      execution of the task. Set to True to avoid uploading files again
      in subsequent runs (at the cost of storing your data in the cloud). If
      files change between runs, new files are synced to the bucket.

    mode: str; either of MOUNT or COPY; default: MOUNT
      Whether attach the bucket by copying files, or mounting the remote
      bucket. With MOUNT mode, files are streamed from the remote bucket
      and writes are replicated to the object store (and consequently, to
      other workers mounting the same Storage). With COPY mode, files are
      copied at VM initialization and any writes to the mount path will
      not be replicated on the bucket.