git远程使用教程(当Git和Git-LFS无法解决机器学习复现问题时)

选自towardsdatascience

作者:David Herron

机器之心编译

参与:高璇、王淑婷

为解决机器学习可复现性的问题,很多人会用 Git 和 Git-LFS,但这二者并不足以解决这个难题。为此,作者在文中提出了 DVC 并列出了它的三大优势:精准记录时间点和使用的文件、特定时间点使用命令的确切顺序、轻松实现数据和代码共享。

有人认为,由于软件工具的不充分,无法保证完全复现机器学习模型的结果,机器学习领域正「陷入危机」。这个危机可以通过为机器学习从业者提供更好的软件工具来解决。

可复现性问题非常重要,每年一度的 NeurIPS 会议也将其列为 NeurIPS 2019 讨论的主要议题。

所谓的危机是因为研究者难以复现同行或科学家们的工作,这制约了他们在彼此工作基础上进一步取得进展。由于机器学习和其他形式的人工智能软件在学术和企业研究中得到广泛应用,因此可复制性或可复现性是一个亟待解决的关键问题。

我们可能认为这可以通过典型的软件工程工具来解决,因为机器学习开发与普通软件工程类似。在这两种情况下,我们会生成某种编译软件工具,以便在计算机硬件上执行,并获得准确的结果。为什么我们不能利用丰富的软件工具和质量极佳的软件来为机器学习团队构建可复现流程呢?

图源:http://dvc.org/

DVC 使用与 Git 类似的命令结构。正如我们看到的,就像 git push 和 git pull 用于共享代码和配置一样,dvc push 和 dvc pull 用于共享数据。所有这些都将在后面的章节详细介绍,或者如果你想学习 DVC,请参阅教程:https://dvc.org/doc/tutorial。

DVC 可以精准记录时间点和使用的文件

DVC 的核心是为存储和版本控制大文件而优化的数据存储(DVC 缓存)。团队可以选择将哪些文件存储在 SCM(如 Git)中,哪些存储在 DVC 中。存储由 DVC 管理的文件,这样 DVC 可以维护每个文件的多个版本,并使用文件系统链接快速更换正在使用的文件版本。

从概念上讲,SCM(如 Git)和 DVC 都有存储库,其中包含每个文件的多个版本。如果查看「版本 N」,相应的文件将出现在工作目录中,然后查看「版本 N 1」,文件将会匹配新版本。

git远程使用教程(当Git和Git-LFS无法解决机器学习复现问题时)(1)

图源:http://dvc.org/

在 DVC 端,这在 DVC 缓存中处理。存储在缓存中的文件通过内容校验和(MD5 哈希值)进行索引。随着 DVC 管理的各个文件发生变化时,其校验和会发生变化,并会创建相应的缓存条目。缓存将保存每个文件的所有实例。

为了提高效率,DVC 使用多种链接方法(取决于文件系统支持)将文件插入工作区而无需复制。这样,DVC 可以在请求时快速更新工作目录。

DVC 使用所谓的「DVC 文件」来描述数据文件和工作流步骤。每个工作区将有多个 DVC 文件,每个文件都用相应的校验和描述一个或多个数据文件,每个文件都要描述在工作流中执行的命令。

cmd: python src/prepare.py data/data.xmldeps:- md5: b4801c88a83f3bf5024c19a942993a48 path: src/prepare.py- md5: a304afb96060aad90176268345e10355 path: data/data.xmlmd5: c3a73109be6c186b9d72e714bcedaddbouts:- cache: true md5: 6836f797f3924fb46fcfd6b9f6aa6416.dir metric: false path: data/preparedwdir: .

示例的 DVC 文件来自 DVC 入门示例(https://github.com/iterative/example-get-started),并显示了工作流的初始步骤。在下一节,我们会详细介绍工作流。现在,请注意此命令有两个依赖项 src/prepare.py 和 data/data.xml,以及一个名为 data/prepared 的输出数据目录。这些都会产生 MD5 哈希值,并且随着文件更改,MD5 哈希值将发生变化,更改后的数据文件的新实例将存储在 DVC 缓存中。

DVC 文件被检入 SCM 管理(Git)存储库。当存入 SCM 存储库时,每个 DVC 文件都会使用每个文件的新校验和来更新(如果适用)。因此,使用 DVC 可以精确地重新创建每个提交的数据集,团队也可以精确地重新创建项目的每个开发步骤。

DVC 文件类似于 Git-LFS 中使用的「指针」文件。

DVC 团队建议在每个实验中使用不同的 SCM 标签或分支。因此,访问适合该实验的数据文件、代码和配置就像切换分支一样简单。SCM 将自动更新代码和配置文件,DVC 将自动更新数据文件。

这意味着你不用再绞尽脑汁去记住哪些数据文件用于什么实验了。DVC 会为追踪这一切。

DVC 会记住特定时间点使用命令的确切顺序

DVC 文件不仅能记住特定执行阶段使用的文件,还能记住在该阶段执行的命令。

复现机器学习结果不仅需要使用相同的数据文件,而且需要相同的处理步骤和相同的代码/配置。一般创建模型的步骤,首先要准备在后续步骤中使用的样本数据。你可能会利用 Python 脚本 prepare.py 来拆分数据,并且在 data/data.xml 文件中输入数据。

$ dvc run -d data/data.xml -d code/prepare.py \ -o data/prepared \ python code/prepare.py

我们用该语句使 DVC 记录该处理步骤。DVC「run」命令根据命令行选项创建 DVC 文件。

-d 选项定义依赖项,在本例中,我们看到 XML 格式的输入文件以及 Python 脚本。-o 选项记录输出文件,这里列出了输出数据目录。最后,执行的命令是一个 Python 脚本。

因此,我们输入的数据、代码和配置以及输出数据,都被事无巨细地记录在生成的 DVC 文件中,该文件对应上一节中显示的 DVC 文件。

如果 prepare.py 从本次提交更改为下一次提交,则 SCM 将自动跟踪更改。同样,对 data.xml 的任何更改都会在 DVC 缓存中产生新实例,DVC 将自动跟踪该实例。如果结果数据目录发生更改,DVC 也会跟踪它们。

DVC 文件也可以简单地引用文件,如下所示:

md5: 99775a801a1553aae41358eafc2759a9outs:- cache: true md5: ce68b98d82545628782c66192c96f2d2 metric: false path: data/Posts.xml.zip persist: falsewdir: ..

这是 dvc add file 命令得到的结果,该命令仅在只有一个数据文件时使用,并且其他命令不会产生这个结果。例如,在 https://dvc.org/doc/tutorial/define-ml-pipeline 中会显示,结果会立刻出现在前面的 DVC 文件:

$ wget -P data https://dvc.org/s3/so/100K/Posts.xml.zip$ dvc add data/Posts.xml.zip

然后,Posts.xml.zip 文件是本教程中一系列步骤的数据源,每一步都要从这些数据中获取信息。

退一步讲,我们要明确这些是更大型工作流中的单个步骤,或者在 DVC 中称之为管道的步骤。通过 dvc add 和 dvc run,可以将多个阶段串联起来,每个阶段都使用 dvc run 命令创建,且由 DVC 文件描述。

这意味着每个工作目录将包含多个 DVC 文件,其中一个用于该项目流程的每个阶段。DVC 扫描 DVC 文件,构建复现流程所需命令的有向非循环图(Directed Acyclic Graph DAG)。

每个阶段都像一个 mini-Makefile,只有当依赖关系发生变化时,DVC 才会执行命令。它也有所不同,因为 DVC 不会像 Make 那样只考虑文件系统时间戳,而是考虑文件内容是否已更改,这由 DVC 文件中的校验和与文件的当前状态确定。

最重要的是,这意味着不需再费尽周章记住每个实验使用哪个版本的脚本。DVC 会跟踪所有内容。

git远程使用教程(当Git和Git-LFS无法解决机器学习复现问题时)(2)

图源:http://dvc.org/

DVC 使团队成员之间轻松实现数据和代码共享

机器学习研究人员可能需要与同事合作,需要共享数据、代码和配置。或者需要将数据部署到远程系统,例如在云计算系统(AWS、GCP 等)上运行软件,这意味着将数据需要上传到相应的云存储服务(S3、GCP 等)上。

DVC 工作空间的代码和配置端存储在 SCM 中(如 Git)。使用普通的 SCM 命令(如 git5 clone),你可以轻松地与同事共享代码和配置。但是如何与同事共享数据呢?

DVC 具有远程存储的概念。DVC 工作空间可以将数据传输到远程存储中或从远程存储中提取数据。远程存储池可以存在于任何云存储平台(S3、GCP 等)以及 SSH 服务器上。

因此,要与同事共享代码、配置和数据,首先要定义远程存储池。保存远程存储定义的配置文件由 SCM 跟踪。接下来,将 SCM 存储库传送到共享服务器,该服务器附带 DVC 配置文件。当你的同事克隆存储库时,他们就可以立即从远程缓存中提取数据。

这意味着你的同事不用再费心思量如何运行你的代码。他们可以轻松复现你的确切步骤,充分利用精确数据来生成结果。

git远程使用教程(当Git和Git-LFS无法解决机器学习复现问题时)(3)

图源:http://dvc.org/

结论

复现结果的关键是,不仅要确保数据的正确版本,还要保证代码和配置文件的正确版本,并自动执行各个步骤。成功的项目有时需要与同事协作,而这可以通过云存储系统更轻松地实现。有些工作要求在云计算平台上运行 AI 软件,因此需要将数据文件存储在云存储平台上。

借助 DVC,机器学习研究团队可以确保他们的数据、配置和代码全部同步。它是一个易于使用的系统,可以有效地管理共享数据存储库和 SCM 系统(如 Git),以存储配置和代码。

原文链接:https://towardsdatascience.com/why-git-and-git-lfs-is-not-enough-to-solve-the-machine-learning-reproducibility-crisis-f733b49e96e8

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页