mlr3嵌套交叉验证并行化配置优化技术咨询
嵌套交叉验证的并行设置与参数疑问解答
问题背景
现有一台32核机器,希望高效执行含5个外层折、3个内层折的嵌套交叉验证(nested CV)。外层折需对2个及以上学习器进行基准测试(benchmark),内层折需对其中1个或多个学习器进行超参数调优。需明确以下问题:
- 如何设置
batch_size与future::plan()? term_evals与batch_size存在怎样的关联?- 提供的代码是否合理?(个人倾向于让内层循环并行运行,但对
term_evals和batch_size的设置存疑)
用户提供的代码如下:
lrn1 <- auto_tuner( method = "random_search", learner = lrn1, resampling = rsmp("cv", folds = 3), measure = msr("classif.auc"), term_evals = 100, batch_size = 10, store_models = TRUE ) design = benchmark_grid(task = task, learner = c(lrn1, lrn2), resampling = rsmp("cv", folds = 5)) # Runs the inner loop in parallel and the outer loop sequentially future::plan(list("sequential", "multisession")) bmr = benchmark(design, store_models = TRUE)
解答
1. future::plan() 设置
你选择的list("sequential", "multisession")完全符合「内层并行、外层串行」的需求,这个方向是对的,还可以进一步优化核数利用:
- 外层串行意味着5个外层折会依次执行,每个外层折内的任务(比如
lrn1的超参数调优+lrn2的直接训练)可以并行处理。 - 考虑到是32核机器,内层并行时建议指定
workers参数避免资源浪费,比如写成plan(list("sequential", multisession(workers = 24)))——预留8个核给系统进程和外层任务的基础开销,防止机器负载过高导致运行效率下降。
2. term_evals与batch_size的关联
term_evals是随机搜索的总超参数组合尝试次数,你设置为100,就意味着会测试100组不同的超参数配置。batch_size是每一批次并行执行的超参数组合数量,也就是每次同时跑多少个调优任务。- 两者的直接关系:总批次数 =
term_evals/batch_size(能整除时),若不能整除则最后一批的任务数少于batch_size。比如你设置的100和10,会分成10批,每批跑10个任务。 - 设置
batch_size时要匹配并行资源:如果内层并行的workers是24,把batch_size设为24(或略低的20),能让每一批都把并行资源用满,减少批次切换的额外开销。
3. 代码合理性分析
- 整体架构是合理的:用
auto_tuner封装内层3折交叉验证的超参数调优,用benchmark_grid+benchmark实现外层5折交叉验证的基准测试,并行策略也契合你的需求。 - 可优化点:
batch_size可以根据内层并行的worker数调整,比如内层用24个workers时,把batch_size设为24会比10更高效,避免资源闲置。- 若想进一步挖掘32核的潜力,也可以尝试外层并行的配置:
list(multisession(workers=5), multisession(workers=6))——外层5个折并行执行,每个折分配6个核(总核数5*6=30,留2个给系统),但这种方式需要注意任务间的资源竞争,如果你更倾向稳定的内层并行,原来的串行外层设置更稳妥。 term_evals=100是否合适取决于超参数空间的大小:如果超参数维度多、可选值范围大,100次尝试可能不足以覆盖有效配置;如果超参数空间较小,100次足够,这个需要结合具体任务判断,没有绝对标准。
内容的提问来源于stack exchange,提问作者persephone
相关产品推荐
相关产品推荐

