在某些情况下,数据太大,或者其处理的组织方式使其无法在本地机器磁盘中处理,最好避免将其从当前的外部位置移动。 例如,NAS 上的数据、在 HDFS 上处理数据、通过 SSH 运行 Dask,或者用于从 S3 流式传输数据以对其进行处理的脚本。
外部依赖和外部输出 提供了在项目外部跟踪和版本数据的方法。
外部依赖如何工作
DVC 将跟踪外部依赖项,检测它们何时发生变化(例如,在 dvc repro
上触发 Stage 执行)。
要将外部位置中的文件或目录定义为 stage 依赖,请在 dvc.yaml
(deps
字段)。 使用与某些 dvc remote
类型的 url
相同的格式。 目前, dvc remote
命令支持的类型/协议如下:
- Amazon S3
- Microsoft Azure Blob Storage
- Google Cloud Storage
- SSH
- HDFS
- HTTP
- 工作空间外的本地文件和目录
请注意,远程存储 是一项不同的功能。
示例
我们定义和运行一个download_file
Stage,它只是从外部位置下载文件,在所有受支持的位置类型上。
关于使用远程位置需要手动身份验证设置。更多信息,请参阅远程别名示例。
Amazon S3 示例
$ dvc run -n download_file \ -d s3://mybucket/data.txt \ -o data.txt \ aws s3 cp s3://mybucket/data.txt data.txt 复制代码
Microsoft Azure Blob Storage 示例
$ dvc run -n download_file \ -d azure://mycontainer/data.txt \ -o data.txt \ az storage copy \ -d data.json \ --source-account-name my-account \ --source-container mycontainer \ --source-blob data.txt 复制代码
Google Cloud Storage 示例
$ dvc run -n download_file \ -d gs://mybucket/data.txt \ -o data.txt \ gsutil cp gs://mybucket/data.txt data.txt 复制代码
SSH 示例
$ dvc run -n download_file \ -d ssh://user@example.com/path/to/data.txt \ -o data.txt \ scp user@example.com:/path/to/data.txt data.txt 复制代码
⚠️ DVC 需要 SSH 和 SFTP 访问才能使用远程 SSH 位置。 请检查您是否能够使用 ssh
和 sftp
(GNU/Linux) 等工具进行双向连接。
注意:您服务器的 SFTP 根目录可能与其物理根目录 (
/
) 不同。
HDFS 示例
$ dvc run -n download_file \ -d hdfs://user@example.com/data.txt \ -o data.txt \ hdfs fs -copyToLocal \ hdfs://user@example.com/data.txt data.txt 复制代码
HTTP/HTTPS 示例
$ dvc run -n download_file \ -d https://example.com/data.txt \ -o data.txt \ wget https://example.com/data.txt -O data.txt 复制代码
本地文件系统路径 示例
$ dvc run -n download_file \ -d /home/shared/data.txt \ -o data.txt \ cp /home/shared/data.txt data.txt 复制代码
示例:使用 DVC 远程别名
您可能希望将外部位置封装为可独立管理的可配置实体。如果连接需要身份验证,如果多个依赖项(或 Stage )重复使用同一位置,或者如果URL将来可能会更改,这将非常有用。
DVC remotes 可以做到这一点。 您可以使用 dvc remote add
来定义它们,然后使用格式为 remote://{remote_name}/ 的特殊 URL {path}
(远程别名)来定义外部依赖。
让我们看一个使用 SSH 的示例。 首先,注册并配置远程存储路径:
$ dvc remote add myssh ssh://user@example.com $ dvc remote modify --local myssh password 'mypassword' 复制代码
请参阅
dvc remote modify
了解更多详细信息,例如:为不同的远程存储类型设置访问凭据。
现在,在定义 Stage 时使用此远程存储的别名:
$ dvc run -n download_file \ -d remote://myssh/path/to/data.txt \ -o data.txt \ wget https://example.com/data.txt -O data.txt 复制代码
示例:import-url
命令
在前面的示例中,使用了特殊的下载工具:scp
、aws s3 cp
等。dvc import-url
简化所有支持的外部路径或 URL 类型的下载。
$ dvc import-url https://data.dvc.org/get-started/data.xml Importing 'https://data.dvc.org/get-started/data.xml' -> 'data.xml' 复制代码
上面的命令会创建导入 .dvc
文件 data.xml.dvc
,其中包含一个外部依赖项(在本例中为 HTTPS URL)。
生成的 .dvc
文件如下:
# ... deps: - etag: '"f432e270cd634c51296ecd2bc2f5e752-5"' path: https://data.dvc.org/get-started/data.xml outs: - md5: a304afb96060aad90176268345e10355 path: data.xml cache: true persist: false 复制代码
DVC 检查服务器返回的标头(Header),查找 HTTP ETag 或 Content-MD5 标头,并使用它来确定源是否已更改,同时,我们需要重新下载文件。
示例:import
命令
dvc import
可以从任何 DVC 项目或 Git 存储库下载文件或目录。 它还在其导入 .dvc
文件中创建了一个外部依赖项。
$ dvc import git@github.com:iterative/example-get-started model.pkl Importing 'model.pkl (git@github.com:iterative/example-get-started)' -> 'model.pkl' 复制代码
上面的命令创建了 model.pkl.dvc
,其中指定了外部依赖项(使用 repo
字段)。
生成的 .dvc
文件如下:
# ... deps: - path: model.pkl repo: url: git@github.com:iterative/example-get-started rev_lock: 6c73875a5f5b522f90b5afa9ab12585f64327ca7 outs: - md5: 3863d0e317dee0a55c4e59d2ec0eef33 path: model.pkl cache: true 复制代码
repo
下的 url
和 rev_lock
子字段分别用于保存依赖的来源和 版本。