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

卢卡斯·福特尼(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

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

来自分类Dev

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

来自分类Dev

使用openmp并行计算循环

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用RcppParallel的堆栈不平衡

来自分类Dev

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

来自分类Dev

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

来自分类Dev

XGBoost如何进行并行计算?

来自分类Dev

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

来自分类Dev

使用TensorFlow训练不平衡数据

来自分类Dev

KMeans的不平衡因子?

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用Dask和Xarray进行并行计算

来自分类Dev

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

来自分类Dev

PInvoke使堆栈不平衡

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

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

来自分类Dev

使用Matlab进行并行计算

来自分类Dev

使用Scilab或Octave进行并行计算

来自分类Dev

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

来自分类Dev

如何使图像不平衡?

来自分类Dev

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

Related 相关文章

热门标签

归档