如何对 CI 管道中使用不属于 git 远程模型文件的函数进行单元测试?
How do I unit test a function in the CI pipeline that uses model files that are not part of the git remote?
我正在开发需要相当大的训练模型文件才能 运行 的机器学习存储库。这些文件不是 git 远程的一部分,但由 DVC 跟踪并保存在单独的远程存储中。当我尝试在 CI 管道中对需要这些模型文件进行预测的函数进行 运行 单元测试时,我 运行 遇到了问题。由于我无法在 git 远程访问它们,因此无法测试它们。
人们在这种情况下通常采取的最佳做法是什么?我可以想到几个选项 -
- 从 CI 管道内的 DVC 远程拉取模型。我不想这样做,因为每次你想 运行 推送一些代码时都下载模型会很快耗尽我 CI 的使用时间,这是一个昂贵的选择。
- 使用
unittest.mock
模拟模型预测的输出并测试我的代码的其他部分。这就是我现在正在做的,但是 unittest 的模拟功能有点痛苦。据我所知,该模块在开发时并没有真正考虑到 ML。它缺少(或很难找到)一些我真正喜欢的功能。有专门针对 ML 的好工具吗?
- 对函数定义进行奇怪的重新格式化,这使我基本上可以执行选项 2,但没有模拟模块。即只测试周边逻辑,不用担心模型输出。
- 只需将模型文件放入 git 远程即可。仅使用 DVC 跟踪数据。
人们在这种情况下通常会做什么?
如果我们谈论单元测试,我认为做一个模拟确实更好。最好进行较小的单元测试,测试单元的实际逻辑等。最好进行其他测试,尽管这会拉动模型,运行 一些逻辑在其之上——我将它们称为集成测试。
虽然不是非黑即白。如果您出于某种原因发现使用实际模型更容易(例如,它发生了很大变化并且更容易使用它而不是维护和更新 stubs/fixtures),您可能会缓存它。
我认为,为了帮助您进行模拟,您需要分享一些技术细节 - 函数看起来如何,您尝试了什么,有什么问题等等。
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 操作相关 repository, this is 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,请查看另一个 open-source 项目,该项目专门用于 CI/CD 机器学习 - CML.
我正在开发需要相当大的训练模型文件才能 运行 的机器学习存储库。这些文件不是 git 远程的一部分,但由 DVC 跟踪并保存在单独的远程存储中。当我尝试在 CI 管道中对需要这些模型文件进行预测的函数进行 运行 单元测试时,我 运行 遇到了问题。由于我无法在 git 远程访问它们,因此无法测试它们。
人们在这种情况下通常采取的最佳做法是什么?我可以想到几个选项 -
- 从 CI 管道内的 DVC 远程拉取模型。我不想这样做,因为每次你想 运行 推送一些代码时都下载模型会很快耗尽我 CI 的使用时间,这是一个昂贵的选择。
- 使用
unittest.mock
模拟模型预测的输出并测试我的代码的其他部分。这就是我现在正在做的,但是 unittest 的模拟功能有点痛苦。据我所知,该模块在开发时并没有真正考虑到 ML。它缺少(或很难找到)一些我真正喜欢的功能。有专门针对 ML 的好工具吗? - 对函数定义进行奇怪的重新格式化,这使我基本上可以执行选项 2,但没有模拟模块。即只测试周边逻辑,不用担心模型输出。
- 只需将模型文件放入 git 远程即可。仅使用 DVC 跟踪数据。
人们在这种情况下通常会做什么?
如果我们谈论单元测试,我认为做一个模拟确实更好。最好进行较小的单元测试,测试单元的实际逻辑等。最好进行其他测试,尽管这会拉动模型,运行 一些逻辑在其之上——我将它们称为集成测试。
虽然不是非黑即白。如果您出于某种原因发现使用实际模型更容易(例如,它发生了很大变化并且更容易使用它而不是维护和更新 stubs/fixtures),您可能会缓存它。
我认为,为了帮助您进行模拟,您需要分享一些技术细节 - 函数看起来如何,您尝试了什么,有什么问题等等。
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 操作相关 repository, this is 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,请查看另一个 open-source 项目,该项目专门用于 CI/CD 机器学习 - CML.