这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战
在您的工作空间中使用 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.local:这是一个本地配置文件,它将覆盖.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命令避免出乎意料的行为)。
原文链接:Project Structure