在您的工作空间中使用 dvc init
将开始一个 DVC 项目,包括内部的 .dvc/
目录。 从那里开始,您将创建和管理不同的 DVC 文件,并在使用 DVC 并进行数据科学实验时占据缓存。
dvc.yaml
流水线文件:定义了构成项目流水线的 Stages。 此处指定了所有基于Stage的功能,例如:dvc params
、dvc metrics
和dvc plots
。.dvc
文件:是跟踪数据文件和目录的占位符。.dvcignore
文件(可选):包含 DVC 要忽略的路径列表,这可以显著提高其操作性能。.dvc/
中的内部文件和目录:包含本地配置文件、默认本地缓存位置以及 DVC 需要运行的其他实用程序。
这些元数据文件使用 Git 进行版本控制。
流水线文件 (dvc.yaml
)
您可以通过在一个或多个 dvc.yaml 文件(或流水线文件)中定义各个阶段(Stage)来构建数据科学或机器学习流水线(Pipeline)。 Stage 相互连接时形成 Pipeline (形成依赖关系图,具体请见: dvc dag
)。
注意:命令
dvc stage
可用于创建和列出 Stage 。
dvc.yaml
文件可以使用 Git 进行版本控制。
这些文件使用 YAML 1.2 文件格式。 我们鼓励您熟悉它,以便您可以自己修改、编写或生成 Stage 和 Pipeline。
.dvc
文件
您可以使用 dvc add
来跟踪位于当前工作空间中的数据文件或目录。 此外,dvc import
和 dvc import-url
允许您将数据从外部的位置带到您的项目,并开始在本地跟踪它。
以 .dvc
扩展名结尾的文件由这些命令创建为可以使用 Git 进行版本控制的数据占位符。 它们包含随时间跟踪目标数据所需的信息。
示例如下:
outs: - md5: a304afb96060aad90176268345e10355 path: data.xml desc: Cats and dogs dataset remote: myremote # 支持撰写评论和用户元数据信息 meta: name: 'Devee Bird' email: devee@dvc.org 复制代码
这些文件也是使用 YAML 1.2 文件格式。 我们鼓励您熟悉它,以便您可以自行修改、编写或生成 .dvc
文件。
.dvcignore
文件
.dvcignore
文件标记在遍历 DVC 项目时应排除哪些文件和目录。有时您可能希望 DVC 在处理项目时忽略某些文件。
例如,在工作区目录中处理大量数据文件时,对于dvc status
这样简单的操作,您可能会遇到执行时间延长的问题。 在其他情况下,您可能希望省略与项目无关的文件或文件夹(如:macOS 上的 .DS_Store
)。 为了解决这些情况,DVC 支持 .dvcignore
文件(可选的)。
.dvcignore
类似于 Git 中的 .gitignore
,可以使用我们的辅助命令 dvc check-ignore
进行测试。
.dvc/
目录下的内部目录和文件
在项目中初始化后,DVC 将使用 DVC 操作所需的内部目录和文件填充其安装目录(.dvc/
)。
.dvc/config
:这是一个配置文件。可以手动或使用dvc config
命令编辑配置文件。.dvc/config.loca
l:这是一个本地配置文件,它将覆盖.dvc/config
中的选项。当您需要在配置中指定不想通过 Git 跟踪和共享的私有选项(凭证、私有位置等)时,这很有用。本地配置文件可以手动或使用命令dvc config --local
进行编辑。.dvc/cache
:缓存目录的默认位置。缓存以特殊结构存储项目数据。工作区中的数据文件和目录将仅包含指向缓存中数据文件的链接,相关配置参数请参阅dvc config cache
,包括更改其位置。
注意:DVC 在初始化期间将缓存目录包含在
.gitignore
中。 DVC 跟踪的任何数据都不应该被推送到 Git 存储库,Git 中只有下载或重现该数据所需的DVC 文件。
.dvc/cache/runs
:运行缓存的默认位置。.dvc/plots
:图表模板的目录.dvc/tmp
:各种临时文件的目录.dvc/tmp/index
:用于优化dvc push
、dvc pull
、dvc fetch
和dvc status -c
操作的远程索引文件的目录。此位置可能会被dvc config index.dir
覆盖。.dvc/tmp/md5s
:此目录用于优化。它包含一个 SQLite 状态数据库,用于存储在 DVC 项目中跟踪的文件的哈希值。它还保存了相应的时间戳和 inode,以避免不必要的文件哈希计算。此父位置可能会被dvc config state.dir
覆盖。.dvc/tmp/links
:此目录用于在调用dvc checkout
时清理您的工作区。它包含一个 SQLite 状态数据库,该数据库存储由 DVC 创建的文件链接列表(从缓存到工作区)。此父位置可能会被dvc config state.dir
覆盖。.dvc/tmp/updater
:此文件用于存储 DVC 的最新可用版本。用于在安装的版本落后时提醒用户升级。.dvc/tmp/updater.lock
:.dvc/tmp/updater
的锁定文件.dvc/tmp/lock
:整个DVC项目的锁定文件.dvc/tmp/rwlock
:一个包含特定依赖项和输出的读写锁的 JSON 文件,允许安全地并行运行多个 DVC 命令.dvc/tmp/exps
:此目录将包含用于临时或并行实验的工作区副本(请参考命令:dvc exp run
)。
缓存目录的结构
DVC 缓存是一种内容可寻址存储(默认情况下位于 .dvc/cache
中),它在代码和数据之间添加了一层间接层。
缓存数据有两种方式,具体取决于它是单个文件还是目录(可能包含多个文件)。
注意:文件被重命名,重新组织,目录树在缓存中被展平,缓存总是只有一级深度,包含 2 个字符的目录(基于数据内容的哈希值)。
文件
DVC 计算文件哈希,一个 32 个字符长的字符串(通常是 MD5)。 前两个字符用于命名缓存内的目录,其余字符成为缓存文件的文件名。
例如,如果数据文件的哈希值为 ec1d2935f811b77cc49b031b999cbf17
,则其在缓存中的路径将为 .dvc/cache/ec/1d2935f811b77cc49b031b999cbf17
。
注意:文件哈希仅根据文件内容计算。 工作空间中可以存在2个或多个不同名称但内容相同的文件并被DVC跟踪,但缓存中只存储一份。 这有助于避免数据重复。
目录
让我们来添加一个包含 2 个图像的目录:
$ tree data/images/ data/images/ ├── cat.jpeg └── index.jpeg $ dvc add data/images 复制代码
生成的缓存目录如下所示:
.dvc/cache/ ├── 40 │ └── 2e97968614f583ece3b35555971f64 ├── 6f │ └── db5336fce0dbfd669f83065f107551.dir └── de └── 7371b0119f4f75f9de703c7c3bac16 复制代码
其中,目录中的文件正常缓存。目录本身也有一个类似的条目,它带有 .dir
扩展名。 它包含内部文件的映射(作为 JSON 数组),由它们的哈希值进行标识:
$ cat .dvc/cache/6f/db5336fce0dbfd669f83065f107551.dir [{"md5": "de7371b0119f4f75f9de703c7c3bac16", "relpath": "cat.jpeg"}, {"md5": "402e97968614f583ece3b35555971f64", "relpath": "index.jpeg"}] 复制代码
这就是为什么 DVC 知道其他两个缓存文件属于该目录。
运行缓存
默认情况下,dvc exp run
和 dvc repro
命令会迁移并重新利用项目中已运行的Stage日志。它位于缓存(或远程存储)内的 runs/
目录中。
运行被标识为确切的依赖内容(或参数值)和要执行的文字命令的组合。这些组合由特殊散列表示,这些散列转换为运行缓存目录中的文件路径:
$ tree .dvc/cache/runs .dvc/cache/runs └── 86 └── 8632e1555283d6e23ec808c9ee1fadc30630c888d5c08695333609ef341508bf └── e98a34c44fa6b564ef211e76fb3b265bc67f19e5de2e255217d3900d8f... 复制代码
文件本身是该运行产生的 dvc.lock
文件的备份。
注意:运行的输出是从普通缓存(.dvc/cache/)中存储和检索的。
dvc push
和 dvc pull
(和 dvc fetch
)可以从远程存储进行下载运行缓存或将其上传到远程存储,以进行共享和作为备份。
注意:运行缓存假定 Stage 命令是确定性的(请参考
dvc run
命令避免出乎意料的行为)。