Pyradiomics: 多线程无法正常工作

创建于 2020-01-04  ·  7评论  ·  资料来源: AIM-Harvard/pyradiomics

亲爱的大家,感谢您提供这个好工具,我真的很感激它。

我向你提出我的疑问,因为我在其他地方找不到答案:

我正在处理一批大约 400 个图像+蒙版组合(在 csv 文件中),并且我正在使用一台小型计算机进行计算。 由于我想扫描大约 50 个 binWidth/binCounts,我正在尝试并行优化提取。

具体来说,我编写了一个 bash 脚本来扫描不同的配置,并使用 -j 24 参数(对于 24 个工作人员)运行它。 我有 2 个 Xeon 6Core HT(总逻辑核心 = 24)和大约 200GB 的 RAM。

但是我注意到 CPU 仅在一小部分时间内以 100% 的速度工作……这正常吗? 一些不能并行执行的脚本的使用是否存在瓶颈?

显然,我使用不同的参数而不是并行开始计算,即仅在第一批完成时才使用下一个参数开始计算。
例子:

bC="8 12 16 22 32 64 43 128 171 256 341 512 682 1024"
for i in $bC
do
  pyradiomics ./input/input_dyn.csv --param ./json/RadiomicsLogicParams_all.json --setting 
  "binCount:${i}" --setting "normalize:false" -o ./output/all_stackedOut.csv -f csv -j 24 -v 4
done

屏幕
Screenshot 2020-01-04 at 13 20 14

感谢您的关注!!

所有7条评论

但是我注意到 CPU 仅在一小部分时间内以 100% 的速度工作……这正常吗? 一些不能并行执行的脚本的使用是否存在瓶颈?

是的,这很正常。 这与 PyRadiomics 无关。

是的,这很正常。 这与 PyRadiomics 无关。

感谢您的神秘回复。 有没有办法解决它? 有原因吗?
这很常见吗?

对所有这三个问题都是肯定的。 怎么这么神秘?

我正在使用 ubuntu 19.4。 它与操作系统有关吗? 在这种情况下,我可以关闭线程。
我已经检查了 UEFI 以查找要禁用的省电设置....

我能做什么? 谢谢你,新年快乐。

它与 CPU 和软件的一般工作方式有关。

100% 的 CPU 核心利用率并不常见,因为进程通常需要相互等待。 如果你有一个单核机器,它可能不会达到持久的 100%,因为代码需要等待内存访问、网络等。在你的 python 脚本的情况下,核心可能也被交换到其他进程内核(或者你的屏幕会冻结等)。

总而言之:仅仅因为您没有看到 100% 的利用率,这并不意味着代码没有并行运行。 最后,根据代码和问题,并行化的好处很少与线程数呈线性关系。

所以你告诉我,如果我用 -j 1 启动 24 个不同的 pyradiomics 实例,我将获得相同的效果,不是吗?
我不太确定,我想这与读/写的磁盘访问或其他东西有关..

最后,我决定每次 CPU 低于 70% 时使用手动检查启动新的 pyradiomics 提取。
现在我总是有一个合理的 CPU 使用率(所有逻辑单元>50%,即总是 100% 的利用率)

wait4CpuReady () {
  cpuUsed=5 #debouncer
  while  [ ${cpuUsed} -gt 0 ] || [ $(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}') -ge 70 ]
  do
    sleep 5
    if [ ${cpuUsed} -gt 0 ] && [ $(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}') -ge 70 ]
    then
      cpuUsed=5
    else
      ((cpuUsed--))
      echo "CPU not used, debouncer = ${cpuUsed}"
    fi
  done
}

bW="$(seq -s ' ' 1 1 9) $(seq -s ' ' 10 2 28) $(seq -s ' ' 30 3 60)"


for i in $bW
do
  wait4CpuReady

  echo -e "\e[41m#########################################################################################\e[0m"
  echo -e "\e[41m#### Starting computing all features for all_times and SUB - NONnorm and binWidth $i ####\e[0m"
  echo -e "\e[41m#########################################################################################\e[0m"

  pyradiomics ./input/input_all_msub.csv --param ./json/RadiomicsLogicParams_all_noWarningGLCM.json --setting "binWidth:${i}.0" --setting "normalize:false" -o ./output/manualOut/all_allTmSub_stackedOut_bw${i}.csv -f csv -j 3 -v 4 &
done

Screenshot 2020-01-05 at 21 12 25

此页面是否有帮助?
0 / 5 - 0 等级