⚠️ 这是针对特定情况的高级功能,除非绝对没有其他选择,否则不推荐使用。 在大多数情况下,dvc add
和 dvc import-url
的 to-cache 或 to-remote 策略更方便。
注意:外部输出不会从 远程存储push
或 pull
。
在某些情况下,数据如此之大,或者其处理的组织方式使其无法在本地机器磁盘中处理。 例如,对 NAS 上的现有数据进行版本控制、在 HDFS 上处理数据、通过 SSH 运行 Dask ,或任何直接生成大量文件到云端的代码。
外部输出(和 外部依赖 提供了在项目外部跟踪和版本化数据的方法。
外部输出如何工作
DVC 将跟踪外部输出以进行版本控制,检测它们何时发生变化(由 dvc status
报告)。
要将外部位置中的现有文件或目录用作输出,请将其远程 URL 或外部路径提供给 dvc add
,或将它们放入 dvc.yaml
中的 deps
字段。
对于以下 dvc remote
命令支持的类型/协议,使用相同的格式作为url
:
- Amazon S3
- SSH
- HDFS
- 工作空间外的本地文件和目录
避免将用于
dvc push
、dvc pull
等命令的 DVC 远程存储 用作外部缓存,因为这可能会导致数据冲突:外部输出的哈希值可能与具有不同内容的本地文件的哈希值发生冲突。注意:远程存储 是一项不同的功能。
设置外部缓存
DVC 需要将项目的缓存配置在与将要跟踪的数据(外部输出)相同的外部位置。 这样可以避免将文件传输到本地环境,并在外部存储中启用 文件链接。
例如,让我们在工作区外部创建一个目录并将其设置为缓存:
$ mkdir -p /home/shared/dvcstore $ dvc cache dir /home/shared/dvcstore 复制代码
请参阅
dvc cache dir
和dvc config cache
了解更多信息。
注意: 在现实生活场景中,目录通常位于远程位置,例如:s3://mybucket/cache
或 ssh://user@example.com/cache
(请参见下面的示例)。
可以在 DVC 项目的副本之间共享外部缓存。 但不要在这种情况下使用外部输出,因为任何项目中使用
dvc checkout
都会覆盖所有项目的工作数据。
样例
对所有支持的远程存储类型的操作如下:
- 使用
dvc config
在与外部数据相同的位置配置一个外部缓存目录(需要先添加一个dvc remote
*)。 - 使用
dvc add
(需要--external
选项)跟踪外部位置的现有数据。这会生成一个.dvc
文件,其outs
字段中有一个外部 URL 或路径。 - 使用
dvc run
(需要--external
选项)创建一个简单的 Stage ,将本地文件移动到外部位置。 这会在dvc.yaml
中产生一个外部输出。
注意: 对于某些远程存储身份验证方法,需要额外的配置步骤(有关的详细信息,请参阅
dvc remote modify
)。 一旦设置访问权限后,请在第 2 步中使用特殊的remote://
URL 格式。例如:dvc add --external remote://myxcache/existing-data
。
Amazon S3 示例
$ dvc remote add s3cache s3://mybucket/cache $ dvc config cache.s3 s3cache $ dvc add --external s3://mybucket/existing-data $ dvc run -d data.txt \ --external \ -o s3://mybucket/data.txt \ aws s3 cp data.txt s3://mybucket/data.txt 复制代码
SSH 示例
$ dvc remote add sshcache ssh://user@example.com/cache $ dvc config cache.ssh sshcache $ dvc add --external ssh://user@example.com/existing-data $ dvc run -d data.txt \ --external \ -o ssh://user@example.com/data.txt \ scp data.txt user@example.com:/data.txt 复制代码
DVC 需要 SSH 和 SFTP 可访问才能使用远程 SSH 位置。 请检查您是否能够使用 ssh
和 sftp
(GNU/Linux) 等工具进行双向连接。
注意: 您服务器的 SFTP 根目录可能与其物理根目录 (/
) 不同。
HDFS 示例
$ dvc remote add hdfscache hdfs://user@example.com/cache $ dvc config cache.hdfs hdfscache $ dvc add --external hdfs://user@example.com/existing-data $ dvc run -d data.txt \ --external \ -o hdfs://user@example.com/data.txt \ hdfs fs -copyFromLocal \ data.txt \ hdfs://user@example.com/data.txt 复制代码
注意: 只要您的数据有一个hdfs://...
URL,DVC 就可以处理它。 因此,支持像 Hadoop、Hive 和 HBase 等系统!
WebHDFS 示例
$ dvc remote add webhdfscache webhdfs://user@example.com/cache $ dvc config cache.webhdfs webhdfscache $ dvc add --external webhdfs://user@example.com/existing-data $ dvc run -d data.txt \ --external \ -o webhdfs://user@example.com/data.txt \ curl --upload-file data.txt \ "http://user@example.com:50075/webhdfs/v1/data.txt?op=CREATE" 复制代码
本地文件系统路径示例
默认情况,缓存位于 .dvc/cache
中,因此无需为项目之外的本地路径设置自定义缓存位置。
不同存储设备或安装在同一文件系统上的分区(例如,
/mnt/raid/data
)上的外部数据除外。 在这种情况下,请在同一驱动器中设置外部缓存以启用 文件链接 并避免复制数据。
$ dvc add --external /home/shared/existing-data $ dvc run -d data.txt \ --external \ -o /home/shared/data.txt \ cp data.txt /home/shared/data.txt