MindOpt 调参器(MindOpt Tuner,简称 MTuner)是一款超参自动优化工具。
它可以帮助运筹优化工程师在使用求解器时自动搜索最佳参数组合。优化求解器往往拥有很多配置参数,例如启发式方法的开关、割平面方法的开关、预处理的配置以及各种误差容忍度等等。MindOpt Tuner会尝试不同的参数组合,评估每组参数的性能,然后基于这些结果来确定最佳参数。这样可以大大减少手动调整参数的时间和精力,并且可以帮助提升求解性能。
不同于常见的贪心算法、遗传算法、粒子群算法等调参算法,MindOpt Tuner使用了团队新研发的快速算法,只需要相对少的评估就能给出性能很好的参数。
输入:
- 业务场景中的优化问题数据,一个或者多个均可以
- 待调的求解器
- (可选)这个求解器待调的参数。若没有指定,则会自动用MindOpt Tuner内部内置的能力。
输出:
- 一套最优参数。采用此参数运行该求解器,在您的业务场景上会得到更优的效果。
- 一系列结果文件和日志,给出调参效果分析。比如会列出对效果影响更大的几个参数。
MindOpt Tuner 当前支持以下几种用法:
- web页面作业提交:可直接在浏览器访问“作业提交”来提交和管理任务、获取结果,在其他渠道提交的任务也可在此任务管理查看到。
- Notebook容器:类似MindOpt求解器和建模语言,可以访问MindOpt建模求解平台的Notebook容器中使用Mtuner。其内核同单机版,但无需安装步骤直接浏览器中使用。采用Notebook项目方便记录笔记、查询接口和参数说明、混合编程、公开分享项目等。
- 单机版:支持在MacOS、Linux、Windows平台环境下来创建并触发调参任务。适合需要定制化集成或私有化部署的客户,安装包获取>>
本篇系列将重点讲解下Notebook容器中如何使用命令行(本篇)和PythonAPI,并且给出web页面任务提交用法示例截图。
注:下面的文件包含code源码,您可复制本项目,然后在浏览项目内容页点击右上角的NoteBook按钮,进入环境后查看、运行、修改调试代码。
下文将通过以下顺序讲解:
- 提交任务:根据一个问题调优
- 学习查询指令
- 查询结果
- 使用结果
- 提交一组数据用于调参(本地和OSS)
- 其他常用指令
这里假设我们业务场景搜集到两个数据,nl_train_1.nl用来调参,nl_test_1.nl用来验证调参结果可用。
首先我们运行如下指令提交一个调参任务:
这里需注意:为了节省数据存储空间,同用户下的MD5值相同的数据文件,服务端仅会存一次。因此重复提交后会提醒文件已存在。此时调参任务继续执行,线上存的数据不更新。
这里小编已经提交了测试过,新提交taskID会和后文描述不一样。小编提交的taskID是 。后文将基于此ID来讲解获取结果,用户请注意更换自己的ID测试。
这段任务提交的指令可以解析为:
在上一节中我们提到了
这里,我们可以试运行以下指令,查询接口的用法:
这里我们得到了操作词和功能说明,然后我们还可以根据 来查询对应操作词的使用说明。比如如何获取结果:
根据上面的指令,我们可以通过以下方式来查询我们刚刚提交的任务的结果。用户测试时候,请注意更换上面自己任务的ID号。
这个日志列出了比较详细的信息,其中:
- 代表调参前的求解时间是 3.21s
- 调参结束后的 代表的是优化调参后的建议取值和重要性评估。
- 这句话代表,调参后的最快速度是0.09秒求解(wallclock_time),比原始参数提速 35.67 = 3.21/0.09 倍。
我们还可以运行如下指令,去获取上面表格 里面的文件信息,比如:
这里我们可以验证下效果。刚求解的是.nl文件,可以参考MindOpt APL建模语言的设置求解器参数的指引来使用和设置参数。
如以下跑的代码:
- 用cbc默认参数,原始参数求解完后,(Wallclock seconds):2.07 秒。
- 用MindOpt Tuner调参后的参数,(Wallclock seconds): 0.09 秒。
2.07 / 0.09 ≈ 23 倍
这里需要注意的是:不同机器运行的耗时不一样,因此计算的提升倍数有差异,最优参数推荐值也可能不一样。上面调参器调优的结果是在云平台的远程服务器中运行,与本容器的环境并不一致,从本容器的运行结果大致也能看到速度有明显提升。
下面的指令输出的日志太长,为了优化阅读体验,我们删除了运行记录,您可以将下面的cell属性从Raw更改为Code后运行:
这里我们还可以测试以下这个参数的迁移性,nl_test_1.nl文件是和nl_train_1.nl相似的一个问题,我们可以看看用训练出来的参数求解表现如何。
从运行结果看,花费的时间与训练数据接近,调优后的参数能提速近20倍。
下面的指令输出的日志太长,为了优化阅读体验,我们删除了运行记录,您可以将下面的cell属性从Raw更改为Code后运行:
除了对于单个文件调参,还可以根据一组数据进行调参。举例:我们将数据存在 文件夹(这些数据来源于MindOpt求解器单机版的安装包的 文件夹,),其访问路径(相对本运行环境)存储为一个txt文件mps_train_local.txt。
同时不仅仅支持文件存在本地容器,也支持存在云端oss。这个方式适合大文件(不适合浏览器上传或者这个容器放不下),我们可以用阿里云的对象存储OSS。这里我们举例有几个数据,存在了云端OSS(公开可访问),然后将数据的地址存入mps_train_oss.txt。
然后我们运行如下提交指令进行测试提交:
小编运行的时候得到taskID:438398613857509376New 和 438398626012602368。
运行结束后,我们可以获得结果。从结果可以看出,可以得到提升。
Tips :对于求解器的调参,我们建议只在同一场景的问题上调优。如果问题结构差异很大,调参效果并不一定好
如果任务等待了很久,忘记了taskID,您还可以运行下面的指令查询自己账号下面的所有任务ID。任务排队也可以查看当前环境和账号支持的额度。更多的指令可以参考上文的 的 来表示。