如何在CI管道中使用不属于git remote的模型文件的功能进行单元测试?

问题描述

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

人们在这种情况下通常会采取的最佳做法是什么?我可以想到几个选择-

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

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

解决方法

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

虽然不是黑白的。如果您出于某种原因看到使用实际模型更容易(例如,更改很多并且使用它比维护和更新存根/夹具更容易使用),则可以将其缓存。

我认为,要帮助您进行模拟,您需要共享一些技术细节-函数的外观,尝试过的内容,中断的内容等

之所以这样做,是因为每次您要运行时下载模型时,推送一些代码都会很快耗尽我的CI使用时间,这是一个昂贵的选择。

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

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

这可能是一种方法,但是如果模型足够大,则会严重污染Git历史记录。在某些CI系统上,它可能变得更慢,因为他们将使用常规git clone来获取它。无论如何,有效地下载模型。

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