Resumable Experiment

初衷

用 matlab 实现可恢复的批量实验

由于学术研究(攒paper)需要,经常需要针对许多参数进行枚举优化。尤其在一些比较大的数据集上,做多个参数的枚举扫描优化的时候,运行速度慢,实验进行时间长。所以想设计一种这样的批量进行实验的程序。

  1. 在批量进行参数扫描时,为每一次单独实验生成一组参数,调用这组参数进行实验,记录参数和实验结果。
  2. 完成一个实验之后,自动进行下一个实验。
  3. 如果一个实验由于意外、或者人工中断,没有完成,再次打开 matlab 进行实验时,可以接着上次的实验继续进行。
  4. 如果实验出现意外,出错了,可以记录出错,不退出,自动进行下一个实验。

进展

详见代码在 GitHub 上的 repo。

balance/ResumableExperiment at master · quxiaofeng/balance · GitHub

基本想法

基本想法是,先把参数排列组合成参数组的集合,把进度保留在一个mat文件里面。每次开始批量之前检查是否有当前批量的进度记录,如果有记录,载入进度记录继,使用当前进度的参数组进行一次实验,记录结果并继续;如果没有记录,创建进度记录文件,记录进度,进行实验。

意外

在自己造轮子的时候,我记得有一次半夜在网上看到类似功能的代码/函数/工具箱,可以直接保存实验运行时状态,稍后再载入的。当时没有保存下来,隔天清醒之后就忘了。

暂时找不到了,再投入精力去也没有什么意义,不如继续已有的工作。

TODO - 要进行的工作

  1. 修改重订函数名。修改程度较大,不考虑前向兼容。
  2. 编写unittest
  3. 传递环境变量到每个参数集中。
  4. 保存每一次实验的结果到 excel
  5. 当参数小于等于两个时,保存到一个excel。
  6. 当参数大于两个时,其他参数及其取值以excel文件名的形式保存。
  7. 整理所有函数到一个函数,保存到一个文件中。
  8. 写一个example。
  9. 将参数组合的解析用函数指针实现。现在为了使用resumable,还需要修改原始函数,接收参数组合之后解析各个参数。
  10. 拆分 resumable 和 excel saving 代码。现有的 resumable 是跟 excel 结果保存程序结合的。
  11. BUG 当程序被中断,并退出matlab,然后再次打开matlab,应用程序的时候,前些次实验的结果没能保留下来。(只要不退出 matlab,结果还存在。)分析 主要原因是结果作为全局函数,每次保存结果时,都会保存到当前实验目录下。但如果退出matlab,以前的实验结果就不见了。解决方案 当前比较简单的方法是把结果数据跟进度progress一起保存。
  12. 环境变量现在是用手动增加的方法保存,可以保存为一个结构或用一个函数指针,这样可以支持多一些变量。