同步代码和工件#
SkyPilot 简化了将代码、数据和工件传输到云集群以及从云集群传输的过程:
要上传代码和项目文件 - 使用
workdir要上传工作目录之外的文件(例如,dotfiles)- 使用
file_mounts要上传/重用大文件(例如,数据集)- 使用SkyPilot 存储桶挂载
要从集群下载文件和工件 - 使用SkyPilot 存储桶挂载或
rsync
在这里,“upload”意味着将文件从您的本地机器(或云对象存储)上传到SkyPilot集群,而“download”则意味着相反的方向。相同的机制适用于文件和目录。
上传代码和项目文件#
SkyPilot 自动将本地工作目录同步到集群,每次执行
sky launch 和 sky exec 时都会进行同步。工作目录包含项目的
代码和其他文件,通常是一个 Git 文件夹。
工作目录可以通过以下方式配置
通过任务YAML文件中的
workdir字段,或者通过命令行选项
--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
如果您已经编辑了file_mounts部分,并希望在不重新运行setup命令的情况下将其反映在现有集群上,
请将--no-setup标志传递给sky launch。例如,sky launch --no-setup -c 。
注意
在本地文件挂载源下的.skyignore文件中列出的项目也会被忽略(与处理workdir的行为相同)。
注意
如果在file_mounts或workdir中使用相对路径,它们将相对于运行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/