Windows系统下如何用partykit包cforest的applyfun实现多核并行?
Windows下用parLapply实现cforest多核并行的正确方法
错误原因
你报错是因为applyfun要求传入和lapply签名一致的函数(第一个参数为X,第二个为FUN),但parLapply的参数顺序是(cl, X, fun),且你直接传入parLapply(clust)是把函数调用的结果而非符合要求的函数对象传进去,完全不匹配参数规则。
正确实现步骤
- 创建集群后,必须给每个节点加载
partykit包——Windows的集群是独立进程,默认不会继承主环境的包 - 写一个包装函数,把
parLapply的参数顺序调整成lapply的风格,适配applyfun的要求 - 将包装后的函数传给
applyfun - 模型训练完成后关闭集群,避免资源浪费
完整代码示例
library(partykit) library(parallel) # 获取核心数并创建集群 nCores <- detectCores() clust <- makeCluster(nCores) # 给每个集群节点加载partykit包 clusterEvalQ(clust, library(partykit)) # 定义适配applyfun的包装函数 parLapply_wrapper <- function(X, FUN, ...) { parLapply(cl = clust, X = X, fun = FUN, ...) } # 训练并行cforest模型 data(iris) rf_model <- cforest(Species ~ ., data = iris, applyfun = parLapply_wrapper) # 关闭集群 stopCluster(clust)
额外说明
- 如果模型用到自定义函数或其他包,需要用
clusterExport()把这些对象导出到集群节点中 - 也可以使用
parallel::clusterMap等其他并行函数,但同样需要包装成符合lapply签名的形式
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

