使用多核心时pbsapply为何出现卡顿无响应?
并行计算中
pbsapply偶尔卡住的问题排查(Windows 8核环境) 问题描述
我有一段可正常运行的代码:
clus <- makeCluster(7) clusterExport(clus, c("gen_dat", "run_simulation", "grid", "get_models")) clusterEvalQ(clus, { library(cmdstanr) library(dplyr)}) pbsapply(1:nrow(grid), run_simulation, folder = "simplex")
但在添加cl = clus参数改用集群并行执行时:
pbsapply(1:nrow(grid), run_simulation, folder = "simplex", cl = clus)
代码有时能正常运行,有时会永久卡住——进度条停在0%,没有任何输出(原本每次迭代都会保存模型结果,但卡住时无结果生成)。
我在Windows系统的8核笔记本上运行这段代码,想知道这种异常行为的可能根源是什么?
可能的根源
- Windows PSOCK集群的通信缺陷:Windows上
makeCluster默认创建PSOCK集群,进程间通过网络套接字通信,偶尔会出现连接超时、资源竞争导致的阻塞。8核机器开7个集群进程,CPU和内存资源接近饱和,容易触发这类调度问题。 cmdstanr内部并行的冲突:cmdstanr在编译或采样Stan模型时,可能默认启用多线程并行。如果集群进程和Stan内部并行同时抢占CPU核心,会导致资源调度死锁,进而卡住整个任务。- 集群节点的环境初始化不全:虽然用
clusterExport导出了指定对象,但run_simulation可能依赖未导出的隐性环境变量、全局状态或其他包的隐性依赖,偶尔会导致集群节点初始化失败,进而阻塞任务。 - 文件IO竞争:多个集群进程同时向
"simplex"文件夹写入模型结果,Windows的文件系统锁机制可能导致进程等待IO资源释放,最终挂起。 - 进度条的输出同步问题:Windows终端的进度条实现与PSOCK集群的输出缓冲存在兼容性问题,有时进程在后台正常运行,但进度条无法更新,看起来像是卡住了。
内容的提问来源于stack exchange,提问作者Cpo
相关产品推荐
相关产品推荐

