在 SLURM 上检查 R 中的可用内核

问题描述 投票:0回答:1

我运行了以下 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 中使用?

提前非常感谢您。

r parallel-processing rstudio future slurm
1个回答
3
投票

Futureverse 的作者,包括 parallellyfuture 包。

使用时:

#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
    
© www.soinside.com 2019 - 2024. All rights reserved.