同步代码和文件#
SkyPilot 简化了代码、数据和文件在云集群之间的传输
上传代码和项目文件(To upload code and project files) - 使用
workdir上传工作目录外部的文件(例如点文件)(To upload files outside of workdir) - 使用
file_mounts上传/重用大文件(例如数据集)(To upload/reuse large files) - 使用 SkyPilot 存储桶挂载
从集群下载文件和产物(To download files and artifacts from a cluster) - 使用 SkyPilot 存储桶挂载 或
rsync
这里,“上传”指将本地机器(或云对象存储)中的文件上传到 SkyPilot 集群,“下载”则指相反的方向。同样机制适用于文件和目录。
上传代码和项目文件#
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。任务将在该工作目录下调用(以便能够调用脚本、访问检查点等)。
注意
要排除大型文件不被上传,请参阅 排除上传文件。
注意
您可以在一个中心位置——使用 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
如果您编辑了 file_mounts 部分,并且希望在现有集群上反映更改而无需重新运行 setup 命令,请将 --no-setup 标志传递给 sky launch。例如:sky launch --no-setup -c <cluster_name> <task.yaml>。
注意
本地 file_mount 源路径下 .skyignore 文件中列出的项目也会被忽略(与处理 workdir 的行为相同)。
注意
如果在 file_mounts 或 workdir 中使用相对路径,它们将相对于运行 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/