同步代码和工件#

SkyPilot 简化了将代码、数据和工件传输到云集群以及从云集群传输的过程:

在这里,“upload”意味着将文件从您的本地机器(或云对象存储)上传到SkyPilot集群,而“download”则意味着相反的方向。相同的机制适用于文件和目录。

上传代码和项目文件#

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。任务在该工作目录下调用(以便它可以调用脚本、访问检查点等)。

注意

要排除上传大文件,请参阅Exclude uploading files

注意

您可以在一个中心位置——使用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字段上传到集群

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

  • 云对象存储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

注意

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

注意

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

上传或重用大文件#

对于大文件(例如,10GB或100GB),将它们放入工作目录或文件挂载可能会很慢,因为它们是通过rsync处理的。使用SkyPilot bucket mounting来高效处理大文件。

排除上传文件#

默认情况下,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 bucket mounting 也可以用于直接上传任务生成的工件。 这是通过在任务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/