4

我正在开发需要相当大的训练模型文件才能运行的机器学习存储库。这些文件不是 git remote 的一部分,而是由 DVC 跟踪并保存在单独的远程存储中。当我尝试在 CI 管道中为需要这些模型文件进行预测的函数运行单元测试时,我遇到了问题。由于我无法在 git 远程访问它们,因此无法测试它们。

人们在这种情况下通常做的最佳实践是什么?我能想到几个选择——

  • 从 CI 管道内的 DVC 远程拉取模型。我不想这样做,因为每次你想运行 push 一些代码时下载模型会很快耗尽我的 CI 使用时间,而且是一个昂贵的选择。
  • 用于unittest.mock模拟模型预测的输出并测试我的代码的其他部分。这就是我现在正在做的事情,但是对于 unittest 的模拟功能来说有点痛苦。据我所知,该模块并没有真正考虑到 ML 开发。它缺少(或很难找到)一些我真正喜欢的功能。有没有专门针对 ML 的好工具来做这件事?
  • 对函数定义进行奇怪的重新格式化,使我基本上可以执行选项 2,但没有模拟模块。也就是只测试周边逻辑,不用担心模型输出。
  • 只需将模型文件放入 git 远程并完成它。仅使用 DVC 跟踪数据。

人们在这种情况下通常会做什么?

4

1 回答 1

3

如果我们谈论单元测试,我认为做一个模拟确实更好。最好有小型单元测试,测试单元的实际逻辑等。最好有其他测试,尽管这会拉动模型并在此之上运行一些逻辑 - 我称之为集成测试。

不过也不是非黑即白。如果您出于某种原因发现使用实际模型更容易(例如,它发生了很大变化并且使用它而不是维护和更新存根/固定装置更容易),您可能会缓存它。

我认为,为了帮助您进行模拟,您需要分享一些技术细节 - 函数的外观如何,您尝试了什么,什么中断等。

这样做是因为每次你想运行 push 一些代码时下载模型会很快耗尽我的 CI 使用时间,而且是一个昂贵的选择。

我认为您可以潜在地利用 CI 系统缓存来避免一遍又一遍地下载它。这是 GitHub Actions 相关存储库,这是CircleCI。这个想法在所有常见的 CI 提供者中都是相同的。顺便说一句,正在考虑使用哪一个?

只需将模型文件放入 git 远程并完成它。仅使用 DVC 跟踪数据。

这可能是一种方式,但如果模型足够大,您将严重污染 Git 历史。在某些 CI 系统上,它可能会变得更慢,因为它们会使用常规git clone的 . 实际上,无论如何都要下载模型。

顺便说一句,如果您使用 DVC 或不查看另一个专门为 ML- CML执行 CI/CD 的开源项目。

于 2020-10-21T21:04:50.770 回答