我运行了以下 SLURM RStudio 设置脚本(当前正在运行):
#!/bin/bash
#SBATCH --job-name=nodes
#SBATCH --output=a.log
#SBATCH --ntasks=18
#SBATCH --cpus-per-task=8
#SBATCH --mem-per-cpu=7gb
date;hostname;pwd
module load R/4.2
rserver <- runs RStudio server
运行 8 个核心,18 个节点(144 个核心)。
但是,当我在 R 控制台中检查可用于并行处理的核心数量时,它显示为 32。
这是检查代码。
library(doParallel)
detectCores() # 32
更糟糕的是,使用另一个考虑调度程序设置的包
parallelly
(或future
),它的报告会有所不同。
来自并行包:
例如,如果使用计算集群调度程序(例如 TORQUE/PBS 和 Slurm),它们会设置特定的环境变量,指定分配给任何给定作业的核心数量; availableCores() 也承认这些。)
library(parallelly)
availableCores() # 8
我想知道当前的 R 是否正在使用上述调度程序规范(144 个核心)运行,以及我是否遗漏了一些重要的东西。
另外,您能否建议如何通过 slurm 设置检查已分配的可用资源(核心/内存)以及是否能够在 R 中使用?
提前非常感谢您。
Futureverse 的作者,包括 parallelly 和 future 包。
使用时:
#SBATCH --ntasks=18
#SBATCH --cpus-per-task=8
Slurm 将为您提供 18 个并行任务,每个任务最多允许 8 个 CPU 核心。如果没有进一步的规范,这 18 个任务可以分配在单个主机上或跨 18 个主机。
首先,
parallel::detectCores()
完全忽略了Slurm给你带来的东西。它报告当前机器硬件上的 CPU 核心数量。这将根据您的主要作业脚本最终运行在哪台机器上而有所不同。所以,你不想使用它。有关为什么 detectCores()
不是一个好主意的更多详细信息,请参阅 https://www.jottr.org/2022/12/05/avoid-detectcores/。
parallelly::availableCores()
尊重Slurm给你的东西。但是,根据设计,它仅报告 current 机器上可用的 CPU 核心数量以及 current 进程(此处为您的主要作业进程)。您的主要工作流程只是您请求的 18 项任务中的一 (1) 项。因此,您也不想使用它,除非您明确指定 --ntasks=1
或 --nodes=1
。
parallelly::availableWorkers()
。它将报告 Slurm 为您的作业分配了哪些机器以及每台机器上为您分配了多少个 CPU。这个字符向量的长度将是 Slurm 给你的并行任务的总数。
接下来,R 将不会自动并行运行。您需要设置一个并行集群并使用它。因此,在启动 R(在您的情况下通过 RStudio)后,您可以使用:
library(future)
plan(cluster) ## defaults to plan(cluster, workers = availableWorkers())
然后当您使用未来的并行化框架时
,您将拥有
nbrOfWorkers()
并行工作者可以使用,例如
library(future.apply)
y <- future_lapply(X, FUN = slow_fcn(x))
警告:R 本身有最多 125 个并行工作线程的限制,实际上更少。有关详细信息,请参阅 [parallelly::availableConnections()]。因此,您需要减少当前请求的并行工作线程总数 144,例如使用 --ntasks=14
和
--cpus-per-task=8
(= 112 个并行工作人员)。这是一个 Slurm 作业脚本
r-multihost.sh
,它启动一个 R 脚本,说明
availableWorkers()
的工作原理:
#! /usr/bin/bash -l
#SBATCH --ntasks=2
#SBATCH --cpus-per-task=8
echo "Started on: $(date --rfc-3339=seconds)"
echo "Hostname: $(hostname)"
echo "Working directory: $PWD"
## Run a small test R script using parallel workers
Rscript r-multihost.R
echo "Finished on: $(date --rfc-3339=seconds)"
这是上面作业脚本调用的 R 脚本r-multihost.R
:
library(future)
library(future.apply)
message(sprintf("Running R v%s", getRversion()))
ncores <- parallelly::availableCores()
message(sprintf("Number of CPU cores available on the current machine: %d", ncores))
workers <- parallelly::availableWorkers()
message(sprintf("Possible set of parallel workers: [n=%d] %s", length(workers), paste(workers, collapse = ", ")))
## Set up a cluster of parallel workers
t0 <- Sys.time()
message(sprintf("Setting up %d parallel workers ...", length(workers)), appendLF = FALSE)
plan(cluster, workers = workers)
message(sprintf("done [%.1fs]", difftime(Sys.time(), t0, units = "secs")))
message(sprintf("Number of parallel workers: %d", nbrOfWorkers()))
## Ask all parallel workers to respond with some info
info <- future_lapply(seq_len(nbrOfWorkers()), FUN = function(idx) {
data.frame(idx = idx, hostname = Sys.info()[["nodename"]], pid = Sys.getpid())
})
info <- do.call(rbind, info)
print(info)
print(sessionInfo())
将其提交为 sbatch r-multihost.sh
时,您会得到类似以下内容:
Started on: 2023-04-03 12:32:31-07:00
Hostname: c4-n37
Working directory: /home/alice/r-parallel-example
Running R v4.2.2
Number of CPU cores available on the current machine: 8
Possible set of parallel workers: [n=16] c4-n37, c4-n37, c4-n37, c4-n37, c4-n37, c4-n37, c4-n37, c4-n37, c4-n38, c4-n38, c4-n38, c4-n38, c4-n38, c4-n38, c4-n3
8, c4-n38
Setting up 16 parallel workers ...done [50.2 s]
Number of parallel workers: 16
idx hostname pid
1 1 c4-n37 45529
2 2 c4-n37 45556
3 3 c4-n37 45583
4 4 c4-n37 45610
5 5 c4-n37 45638
6 6 c4-n37 45665
7 7 c4-n37 45692
8 8 c4-n37 45719
9 9 c4-n38 99981
10 10 c4-n38 100164
11 11 c4-n38 100343
12 12 c4-n38 100521
13 13 c4-n38 100699
14 14 c4-n38 100880
15 15 c4-n38 101058
16 16 c4-n38 101236
R version 4.2.2 (2022-10-31)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: CentOS Linux 7 (Core)
Matrix products: default
BLAS: /software/R/lib64/R/lib/libRblas.so
LAPACK: /software/R/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] future.apply_1.10.0 future_1.32.0
loaded via a namespace (and not attached):
[1] compiler_4.2.2 parallelly_1.35.0 parallel_4.2.2 tools_4.2.2
[5] listenv_0.9.0 rappdirs_0.3.3 codetools_0.2-19 digest_0.6.31
[9] globals_0.16.2
Finished on: 2023-04-03 12:33:30-07:00