mlr3 benchmark()状态仅完成后显示,如何实现运行时实时输出?
mlr3 benchmark() 实时输出状态消息解决方案
问题根因
mlr3默认使用lgr日志框架输出运行状态,且R的标准输出/标准错误默认开启缓冲,若使用并行计算时子进程的输出也会默认缓存至任务结束才统一返回,因此会出现只有流程启动消息实时展示、其余状态消息全部等待全流程跑完才输出的情况。
实现步骤
- 步骤1:调整日志框架配置,关闭输出缓冲
library(lgr) # 调整mlr3核心日志输出等级为INFO,保证状态消息可被输出 lgr::get_logger("mlr3")$set_threshold("info") # 关闭日志缓冲,消息生成后立即打印 lgr::get_logger("mlr3")$appenders[[1]]$set_buffer_size(0) # 若基准测试包含mlr3tuning超参数调优,同步配置对应日志 lgr::get_logger("mlr3tuning")$set_threshold("info") lgr::get_logger("mlr3tuning")$appenders[[1]]$set_buffer_size(0)
- 步骤2:(使用并行时必填)配置并行进程实时输出
library(future) # 以multisession并行模式为例,配置子进程消息实时传递到主进程打印 plan(multisession, stdout = "|", stderr = "|")
- 步骤3:运行基准测试代码
design = benchmark_grid( tasks = task, learners = c(lrn("classif.featureless"), lrn("classif.xgboost")), resamplings = resampling ) bmr = benchmark(design)
可选:自定义细粒度进度提示
如果默认日志的颗粒度无法满足需求,可以通过mlr3的回调机制自定义每一步的输出内容,例如每完成一个重采样折叠、每完成一轮超参数搜索就打印对应耗时和状态:
# 自定义基准测试回调,实时打印单步运行进度 custom_cb = callback_benchmark( on_begin = function(callback, context) { callback$state$global_start = proc.time()[3] }, on_learner_eval_end = function(callback, context) { step_cost = proc.time()[3] - callback$state$global_start message(sprintf("[%s] 进度更新 | 任务:%s | 学习器:%s | 重采样折叠:%d | 累计耗时:%.2fmin", Sys.time(), context$task$id, context$learner$id, context$resampling$iteration, step_cost / 60)) } ) # 运行benchmark时传入自定义回调 bmr = benchmark(design, callbacks = list(custom_cb))
内容的提问来源于stack exchange,提问作者AW2
相关产品推荐
相关产品推荐

