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



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

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

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

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

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

不过它不是黑白的。如果出于某种原因,你发现使用实际模型更容易(例如,它变化很大,使用起来更容易,而不是维护和更新存根/固定装置(,你可能会缓存它。

我认为,为了帮助你进行模拟,你需要分享一些技术细节——功能是什么样子的,你试过什么,什么坏了,等等。

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

我认为您可以潜在地利用CI系统缓存来避免反复下载。这是与GitHub Actions相关的存储库,这是CircleCI。所有常见CI提供程序的想法都是相同的。顺便问一下,你在考虑用哪一个?

只需将模型文件放在git remote中即可完成。只需使用DVC来跟踪数据。

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

顺便说一句,如果你使用DVC或不看另一个开源项目,它是专门为ML-CML做CI/CD的。

最新更新