同步代码和文件#

SkyPilot 简化了代码、数据和文件在云集群之间的传输

这里,“上传”指将本地机器(或云对象存储)中的文件上传到 SkyPilot 集群,“下载”则指相反的方向。同样机制适用于文件和目录。

上传代码和项目文件#

SkyPilot 在每次 sky launchsky exec 时都会自动将本地工作目录同步到集群。工作目录包含项目的代码和其他文件,通常是一个 Git 文件夹。

工作目录可以通过以下方式配置:

  1. 任务 YAML 文件 中使用 workdir 字段,或者

  2. 使用命令行选项 --workdir

$ # Assuming task.yaml has a 'workdir: <path>' field, these commands
$ # sync the workdir to the cluster:
$ sky launch -c dev task.yaml
$ sky exec dev task.yaml

$ # Add a --workdir flag if the yaml doesn't contain the field, or
$ # to override it.

这些命令将工作目录同步到远程虚拟机上的 ~/sky_workdir。任务将在该工作目录下调用(以便能够调用脚本、访问检查点等)。

注意

要排除大型文件不被上传,请参阅 排除上传文件

注意

您可以在一个中心位置——使用 sky 的本地机器——保留和编辑代码,并将其透明地同步到多个远程集群以供执行

$ sky exec cluster0 task.yaml

$ # Make local edits to the workdir...
$ # cluster1 will get the updated code.
$ sky exec cluster1 task.yaml

上传工作目录外部的文件#

任务 YAML 中使用 file_mounts 字段,可以将以下内容上传到集群:

  • 工作目录之外的本地文件(例如点文件)

  • 云对象存储 URI(目前 SkyPilot 支持 AWS S3、GCP GCS、Cloudflare R2 和 IBM COS)

每次调用 sky launch 都会重新同步这些文件。

文件挂载示例

file_mounts:
  # Format: <cluster path>: <local path/cloud object URI>

  # Upload from local machine to the cluster via rsync.
  /remote/datasets: ~/local/datasets
  ~/.vimrc: ~/.vimrc
  ~/.ssh/id_rsa.pub: ~/.ssh/id_rsa.pub

  # Download from S3 to the cluster.
  /s3-data-test: s3://fah-public-data-covid19-cryptic-pockets/human/il6/PROJ14534/RUN999/CLONE0/results0

更多详情请参阅 此示例YAML 配置

如果您编辑了 file_mounts 部分,并且希望在现有集群上反映更改而无需重新运行 setup 命令,请将 --no-setup 标志传递给 sky launch。例如:sky launch --no-setup -c <cluster_name> <task.yaml>

注意

本地 file_mount 源路径下 .skyignore 文件中列出的项目也会被忽略(与处理 workdir 的行为相同)。

注意

如果在 file_mountsworkdir 中使用相对路径,它们将相对于运行 sky 命令的位置进行评估。

上传或重用大文件#

对于大型文件(例如数十或数百 GB),将其放入工作目录或 file_mount 可能会很慢,因为它们是由 rsync 处理的。请使用 SkyPilot 存储桶挂载 来高效处理大型文件。

排除上传文件#

默认情况下,SkyPilot 会使用您现有的 .gitignore.git/info/exclude 文件来排除同步文件。

或者,如果您希望将 SkyPilot 的同步行为与 Git 分开,可以使用 .skyignore。如果您使用 .skyignore 文件,SkyPilot 将仅根据该文件排除文件,而不会使用默认的 Git 文件。

您的工作目录或 file_mounts 源路径下的任何 .skyignore 文件都会被遵循。

.skyignore 遵循 RSYNC 过滤规则,例如:

# Files that match pattern under CURRENT directory
/file.txt
/dir
/*.jar
/dir/*.jar

# Files that match pattern under ALL directories
*.jar
file.txt

请_勿_使用 . 表示本地目录(例如,写 /file 而不是 ./file)。

下载文件和产物#

任务产物,例如 日志和检查点,可以透明地上传到云对象存储,或直接从远程集群复制。

将产物写入云对象存储#

除了处理数据集和其他任务输入外,SkyPilot 存储桶挂载 还可以直接上传任务生成的产物。这可以通过在任务 YAML 中创建一个 MOUNT 模式的存储挂载来实现,如下所示:

file_mounts:
  /outputs:
    name: my-sky-outputs    # Can be existing S3 bucket or a new bucket
    store: s3
    mode: MOUNT

file_mount 将把存储桶 s3://my-sky-outputs/ (如果不存在则创建)挂载到 /outputs。由于指定了 mode: MOUNT,任何写入 /outputs 的文件也将自动写入 s3://my-sky-outputs/ 存储桶。

因此,如果您的代码将文件输出到 /outputs/,当它们被写入 /outputs/ 时,这些文件将在 S3 存储桶上可用。然后您可以使用 S3 Web 控制台 或 aws-cli(例如 aws s3 ls my-sky-outputs)获取这些文件。

使用 rsync 直接传输#

文件和产物也可以直接从远程集群传输到本地机器。

要从集群节点传输文件,请使用 rsync(或 scp

$ # Rsync from head
$ rsync -Pavz dev:/path/to/checkpoints local/

$ # Rsync from worker nodes (1-based indexing)
$ rsync -Pavz dev-worker1:/path/to/checkpoints local/