为什么使用降雪进行并行计算时不平衡负载?

卢卡斯·福特尼(Lucas Fortini)

很长时间以来,我一直在许多并行r脚本中使用sfLapply。但是,最近,随着我对并行计算的更多研究,我一直在使用sfClusterApplyLB,如果各个实例的运行时间不相同,则可以节省大量时间。因为sfLapply将在加载新批次之前等待批次的每个实例完成(这可能导致空闲实例),而完成任务的sfClusterApplyLB实例将立即分配给列表中的其余元素,从而潜在地节省了很多时间实例花费的时间不完全相同的时间。这使我提出疑问,为什么在使用降雪时我们不希望不对运行进行负载平衡?到目前为止,我唯一发现的是,当并行脚本中出现错误时,在给出错误之前,sfClusterApplyLB仍将循环遍历整个列表,而在尝试第一批操作后,sfLapply将停止。我还想念什么?负载平衡还有其他成本/缺点吗?下面是一个示例代码,显示了两者之间的区别

rm(list = ls()) #remove all past worksheet variables
working_dir="D:/temp/"
setwd(working_dir)
n_spp=16
spp_nmS=paste0("sp_",c(1:n_spp))
spp_nm=spp_nmS[1]
sp_parallel_run=function(sp_nm){
  sink(file(paste0(working_dir,sp_nm,"_log.txt"), open="wt"))#######NEW
  cat('\n', 'Started on ', date(), '\n') 
  ptm0 <- proc.time()
  jnk=round(runif(1)*8000000) #this is just a redundant script that takes an arbitrary amount of time to run
  jnk1=runif(jnk)
  for (i in 1:length(jnk1)){
    jnk1[i]=jnk[i]*runif(1)
  }
  ptm1=proc.time() - ptm0
  jnk=as.numeric(ptm1[3])
  cat('\n','It took ', jnk, "seconds to model", sp_nm)

  #stop sinks
  sink.reset <- function(){
    for(i in seq_len(sink.number())){
      sink(NULL)
    }
  }
  sink.reset()
}
require(snowfall)
cpucores=as.integer(Sys.getenv('NUMBER_OF_PROCESSORS'))

sfInit( parallel=T, cpus=cpucores) # 
sfExportAll() 
system.time((sfLapply(spp_nmS,fun=sp_parallel_run)))
sfRemoveAll()
sfStop()

sfInit( parallel=T, cpus=cpucores) # 
sfExportAll() 
system.time(sfClusterApplyLB(spp_nmS,fun=sp_parallel_run)) 
sfRemoveAll()
sfStop()
史蒂夫·韦斯顿

sfLapply函数很有用,因为它将每个可用工作程序的输入值分成一组任务,这就是mclapply函数所谓的preschedulingsfClusterApplyLB与任务用时不长的情况相比这可以提供更好的性能

这是一个极端的例子,演示了预先安排的好处:

> system.time(sfLapply(1:100000, sqrt))
   user  system elapsed
  0.148   0.004   0.170
> system.time(sfClusterApplyLB(1:100000, sqrt))
   user  system elapsed
 19.317   1.852  21.222

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在sklearn中使用RandomForestClassifier进行不平衡分类

来自分类Dev

使用Matlab进行并行计算

来自分类Dev

使用Scilab或Octave进行并行计算

来自分类Dev

使用RcppParallel的堆栈不平衡

来自分类Dev

使用TensorFlow训练不平衡数据

来自分类Dev

在评估长格式不平衡数据之前和之后进行可靠的改进计算

来自分类Dev

为什么二叉搜索树趋向于变得不平衡?

来自分类Dev

为什么插入后红黑树保持不平衡?

来自分类Dev

为什么要添加不平衡二叉搜索树O(n)?

来自分类Dev

为什么我的AVL树删除功能不平衡?

来自分类Dev

使用自定义segue进行不平衡的开始/结束外观转换的调用

来自分类Dev

在队列集群上使用Python进行并行计算

来自分类Dev

如何使用C#进行并行计算

来自分类Dev

可能进行优化或使用并行计算

来自分类Dev

如何使用Rayon进行PI的并行计算

来自分类Dev

使用Dask和Xarray进行并行计算

来自分类Dev

在 C++ 中使用线程进行并行计算

来自分类Dev

对不平衡样品重复进行随机采样和峰度

来自分类Dev

执行自定义序列时的呼叫不平衡

来自分类Dev

数据集不平衡时的连接优化

来自分类Dev

KMeans的不平衡因子?

来自分类Dev

PInvoke使堆栈不平衡

来自分类Dev

如何使图像不平衡?

来自分类Dev

使用libSVM的SVM中的数据不平衡

来自分类Dev

XGBoost如何进行并行计算?

来自分类Dev

SVM硬边距:为什么数据集不平衡可能会导致不良结果?

来自分类Dev

如何平衡不平衡的面板数据?

来自分类Dev

使用多个提取路径时,JSON格式的提取文档数据选项节点会引发“不平衡对”错误

来自分类Dev

使用openmp并行计算循环

Related 相关文章

热门标签

归档