如何为优化求解器设定基准?

比较求解器的最佳方法是什么?应该测量什么,如何测量?我应该关心硬件吗?让我们一探究竟!

简介

速度是数学优化求解器最重要的因素。基准测试需要三样东西:可靠的硬件、有代表性的测试数据、强大的测试设置。

将模型整理为文件夹中的 .mps 或 .lp 文件,并使用带有多个随机种子的 CLI 求解每个模型。如果方法得当,基准测试将改善优化项目的整体测试和部署。

让我们来谈谈性能

模型的性能取决于三个方面:

  • 硬件
  • 测试数据
  • 代码/测试设置

硬件

从 1991 年到 2015 年,机器的性能估计提高了 130 万倍。除此之外,我们还拥有多线程、总线速度改进、片上系统 (SOC),所有这些都让您的代码运行得更快。

现在的 10 秒 = 1991 年的 5 个月

这意味着:代码在哪里运行很重要!不同的机器会产生截然不同的运行时间,尤其是在云中:

  • 一般经验法则 一般原则:接近生产(BCPT),即在您希望以后在生产中运行的硬件上进行基准测试。
  • 请记住:在云计算中,您不知道您的模型运行在哪些实际硬件上,因此需要格外小心。这意味着要在一天中的不同时间进行多次运行,最好是在不同的可用性区域和地区。
  • 尽可能接近裸机:抽象层(虚拟机、Docker、Kubernetes 等)越多,引入的噪音就越大。

如何在基准测试中作弊:测试数据

基准测试的第一条规则是:测试集决定测试结果

测试集是做基准测试最 “有用 ”的部分。如果方法得当,您将有一个非常好的起点来跟踪应用程序的性能。哇哦!

这在实践中意味着什么?

  • 尽可能多的不同实例(至少大于 5 个,最好大于 15 个)
  • 尽可能多的不同实例,就像在现实生活中看到的那样:从小到大,涵盖代码中所有不同的设置组合
  • 但如果我只有一个或两个问题怎么办?那么你可以(a)努力工作以获得更多,或者(b)清楚地认识到这会带来巨大的统计偏差。如果求解器的启发式恰好在这一个实例中非常有效,那么它可能会骗过你。

代码/测试设置

实际测试什么?大体上有两种选择:

  • [首选] 纯求解:向求解器提供 .mps 或 .lp 文件,求解器求解,然后测量输出。
  • 代码求解:运行一些代码,建立并运行模型,然后测量输出结果。

主要区别在于,在方案 1 中,输出结果(无论是时间还是最优性差距)完全由求解过程产生,而在方案 2 中,我们在求解过程本身的基础上又增加了一层。

这意味着你需要确保你拥有相同的版本、数据库连接和延迟等。

参考资料

完成任务:实际基准测试

如果您的基准测试只涉及单个模型的求解,那么基准测试的最佳工作流程如下:

  • 将所有模型文件放在一个文件夹中
  • 使用命令行界面,用 3-5 个不同的随机种子运行该文件夹中的每个文件和所有要测试的求解器
  • 保存日志文件并提取有关运行时间的信息。

著名的 Mittelmann 基准就是一个很好的例子,您可以在其中看到所有日志等信息。

使用多个随机种子(最少 3 个,最好 5 个)运行所有基准非常重要。这样就可以平均掉伪随机数生成器的噪声。如果您想了解有关此主题的详细内容,请留言评论。

但如果我的设置不那么简单呢?

我见过不少无法轻松完成基准测试的情况。一个常见的例子是,你必须连续解决多个优化问题,而一个问题的输出是另一个问题的输入。

在这种情况下,您需要编写代码来完成基准测试。此外,这类基准测试明确不包括模型构建时间。如果模型构建时间较长(> 20%),那么这也应该是基准的一部分。
我应该调整求解器吗?

我应该调整求解器吗?

所有求解器都有可以调整的参数:公差、算法选择或在不同部分花费的时间等。这对求解时间的影响有时很小,有时却很大(从无解到找到解)。这就引出了一个问题:

  • 如何调整?我将就此单独撰写一篇博文,敬请关注:)
  • 我应该比较已调整还是未调整的求解器?

实际的答案是,你应该做你有时间做的事。当你拥有丰富的经验时,你就能很快判断出是否有明显的问题需要解决,但即便如此,调整也是非常耗时的。

有些解题者会主动提出为你调试,我总是会接受他们的提议,哪怕只是想看看有什么可能。假设求解器 A 帮你调整了模型,并告诉你原始单纯形是进行根松弛的方法。然后你就可以在求解器 B 中使用这些信息,看看是否也会产生不同的结果。

有些参数无法在求解器之间转换。不过,即使这样也很有价值,因为这可能会成为该求解器的竞争优势。

结论

制定基准很难。但它背后蕴含着科学和技术。因此,只要你有良好的测试数据,尽可能保持硬件设置的整洁,并用足够多的随机种子测试代码的正确部分,你就能得到可靠的答案。

我认为这很有趣!这就像去赛车场,但你可以和赛车一起玩。然后坐下来,看看谁最适合你。

posted @   磁石空杯  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 【.NET】调用本地 Deepseek 模型
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示