mlr3 - 基准测试:状态消息仅在完整基准测试完成后显示

mlr3 - benchmarking: status messages are only displayed after full benchmark is completed

我想监控 mlr3 中 benchmark() 的进度。对多个模型进行基准测试(包括对大型数据集进行超参数调整)可能需要数小时甚至数天。我希望能够在基准测试 运行ning 时监控进度,以便我可以决定是否中止基准测试。此外,如果在此过程中打印状态消息,我可以在某些部分完成后中止该过程,并知道某些步骤花费了多长时间。例如,朴素贝叶斯可能已经完成,但决策树的超参数调整仍在 运行ning(并且已经持续了几个小时......)。这样我就可以对下一个基准 运行 进行适当的更改(例如,限制对决策树的搜索 space 或仅使用朴素贝叶斯)。

问题是只显示第一条消息(运行ning 重采样实例)during/at 进程的开始。其余部分仅在完整基准测试完成后才会显示。换句话说,几个小时甚至几天显示的唯一状态消息是第一条。如果中止该过程,有关进度(单个步骤的持续时间)的所有信息都会丢失。

这是一个非常简短的例子。代码的相关部分直接取自 mlr3 book:

    design = benchmark_grid(
               tasks = task,
               learners = c(lrn("classif.featureless"), 
               lrn("classif.xgboost")
               ),
               resamplings = resampling
              )
     bmr = benchmark(design)

立即显示基准测试过程开始时的状态消息

其他消息 - 包括那些在进度开始后仅微秒的状态 - 仅在完整的基准测试过程完成后显示。

在这种情况下,只需要一分钟。但是,如果基准测试需要数小时或数天,那么立即观察新状态的消息会很有帮助,而不必等到整个过程完成。

我知道 benchmark() 支持 progressr::with_progress(),但是百分比级别对我来说不够详细。

有没有办法让 mlr3::benchmark() 在整个过程中立即显示状态消息,而不仅仅是在过程完成后?

此行为的原因是对 future.apply::future_mapply() 的内部调用。使用 base::mapply() 时,直接打印输出。 后者可以通过设置 options("mlr3.debug" = TRUE) 来强制执行,如下所示。

我已经打开了 pull request 以在 future.apply::future_mapply() 中也强制执行此行为,这是 options("mlr3.debug" = FALSE) 时的默认设置。

这是一个临时解决方法

library("mlr3")
tasks = list(tsk("penguins"), tsk("sonar"))
learners = list(lrn("classif.featureless"), lrn("classif.rpart"))
resamplings = list(rsmp("cv"), rsmp("subsampling"))

grid = benchmark_grid(tasks, learners, resamplings)
print(grid)

# workaround
options("mlr3.debug" = TRUE)

benchmark(grid)

我们正在考虑在 https://github.com/mlr-org/mlr3/pull/692 中通过未来不延迟标准输出。

或者,您可以配置 progressr 使用 progress 进度条包,然后输出附加信息(当前 运行 任务、学习者、迭代):

progressr::handlers(global = TRUE)
progressr::handlers("progress")