unit-testing - 如何在 CI 管道中对使用不属于 git 远程的模型文件的函数进行单元测试?

标签 unit-testing machine-learning mocking continuous-integration dvc

我正在开发需要相当大的训练模型文件才能运行的机器学习存储库。这些文件不是 git remote 的一部分,而是由 DVC 跟踪并保存在单独的远程存储中。当我尝试在 CI 管道中为需要这些模型文件进行预测的函数运行单元测试时,我遇到了问题。由于我无法在 git 远程访问它们,因此无法测试它们。
人们在这种情况下通常做的最佳实践是什么?我能想到几个选择——

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

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

    最佳答案

    如果我们谈论单元测试,我认为做一个模拟确实更好。最好有小型单元测试,测试单元的实际逻辑等。最好有其他测试,尽管这会拉动模型并在此基础上运行一些逻辑 - 我称之为集成测试。
    不过也不是非黑即白。如果您出于某种原因看到使用实际模型更容易(例如,它发生了很大变化并且使用它而不是维护和更新 stub /夹具更容易),您可能会缓存它。
    我认为,为了帮助你进行模拟,你需要分享一些技术细节——函数的外观如何,你尝试了什么,什么中断等等。

    to do this because downloading models every time you want to run push some code will quickly eat up my usage minutes for CI and is an expensive option.


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

    Just put the model files in the git remote and be done with it. Only use DVC to track data.


    这可能是一种方式,但如果模型足够大,您将严重污染 Git 历史。在某些 CI 系统上,它可能会变得更慢,因为它们将使用常规 git clone 获取它。 .实际上,无论如何都要下载模型。
    顺便说一句,如果您使用或不使用 DVC,请查看另一个专门为 ML 执行 CI/CD 的开源项目 - CML .

    关于unit-testing - 如何在 CI 管道中对使用不属于 git 远程的模型文件的函数进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64456396/

    相关文章:

    java - JUnit 测试预期异常的正确方法

    node.js - 如何测试方法回调的内容

    ruby-on-rails - 在 FactoryGirl 中干净地设置多个模型以进行测试/规范

    c# - xunit-如何在单元测试中获取HttpContext.User.Identity

    java - 是否有等效的 verifyZeroInteractions() 用于验证与模拟对象交互的确切数量?

    function - 如何在 D 中模拟标准库函数

    machine-learning - 将向量加载到 gensim Word2Vec 模型中 - 不是 KeyedVectors

    python - 比较名称之间的相似性

    python - Tensorflow只保存检查点文件,不保存其他数据

    Python unittest 模拟补丁对象不是方法