betareg 不在 CentOS 上使用多线程

betareg not using multithreading on CentOS

模型拟合在 Cent 上运行单线程OS

我正在拟合 Beta 回归模型与 the betareg package 中的 betamix 函数的混合。我最初在 Mac OS X 上开发了代码,但现在 运行 它(即,在 HPC 集群上 规模化 )用于作业管理的 LSF 和节点上的 CentOS。对于这两种情况,我都使用由以下 YAML

定义的 Conda 环境

betareg.yaml

name: betareg
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - r-base=4.0.3
  - r-tidyverse
  - r-magrittr
  - r-cowplot
  - r-knitr  
  - r-flexmix
  - r-betareg

在我的本地机器上,betamix 步骤自动扩展到所有可用内核。然而,在集群上,我通过 Snakemake 部署作业并提供 threads: 16,监控显示所有作业都是 运行 单线程的,尽管 Snakemake 日志清楚地显示每个作业正确分配了 16 个内核。

并行包?

比较两种情况下的 sessionInfo() 输出显示缺少 parallel 在 HPC 上下文中加载。但是,显式添加 library(parallel) 并没有什么不同。

相同的 BLAS 库版本

另一个想法是,也许 BLAS 库不同,但是,它们似乎也匹配(尽管显然是特定于平台的构建)。

osx-64 BLAS

## Matrix products: default
## BLAS/LAPACK: /Users/user/miniconda3/envs/betareg/lib/libopenblasp-r0.3.12.dylib

linux-64 BLAS

## Matrix products: default
## BLAS/LAPACK: /home/user/mm-stem-cluster/.snakemake/conda/80842b70/lib/libopenblasp-r0.3.12.so

如何让 CentOS 执行使用所有分配的线程?

使用 RhpcBLASctl 指定线程

The RhpcBLASctl package 提供了一种方法 blas_set_num_threads(),该方法似乎足以启用指定数量的线程。对于这个特定的应用程序,我将 YAML 更新为

betareg.yaml

name: betareg
channels:
  - conda-forge
  - bioconda
  - defaults
dependencies:
  - r-base=4.0.3
  - r-tidyverse
  - r-magrittr
  - r-cowplot
  - r-knitr  
  - r-flexmix
  - r-betareg
  - r-rhpcblasctl

并添加以下内容以在脚本中设置正确的线程数:

RhpcBLASctl::blas_set_num_threads(snakemake@threads)