同步代码和文件#
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/