限制黄土在 R 中的多核使用

Restricting loess' multicore usage in R

我尝试多次使用 loess() 函数将 +- 70.000 个值拟合为两个变量的函数。我想使用这种拟合来消除数据趋势。我的问题是,一旦我启动 loess 函数,R 会话就会占用系统上所有可用的核心,这对同一计算集群上的其他用户来说是不体谅的。

相关代码类似于以下内容:

# Approximation of the data
df <- data.frame(y = rpois(70000, rnorm(70000, 10, 2)), # y is count data
                 x = 50000 - rpois(70000, 100),
                 z = runif(70000))

# The problematic operation
fit <- loess(y ~ x + z, data = df)

当我在本地机器上 运行 这个例子时,它只占用 1 个内核,但在集群上它占用尽可能多的内核(最多 48 个)。理想情况下,我只在 1 个核心上 loess() 到 运行。

我试图在黄土代码中追踪任何多核参数,但我找不到。我知道 loess 调用 stats:::simpleLoess,后者又调用 C code, which in turn calls Fortran 代码。我没有使用 C 或 Fortran 的经验,也无法弄清楚如何限制此函数的 CPU 用法。

有人对我如何限制 loess 函数的 CPU 使用有什么建议吗?

我的知识不够丰富,无法对所有这些工作原理的细节发表评论,但我知道 R 的 C++ 和 FORTRAN 通常是使用 OpenMP framework 构建的,用于多线程编程。根据经验,我知道如果您在启动 R 之前设置 OMP_NUM_THREADS 参数或者在 R 会话中设置它,您的问题就可以得到解决。

假设您想为 loess 函数使用 2 个线程。在启动 R 之前,您可以这样做($ 表示在 shell 会话中键入此内容):

$ OMP_NUM_THREADS=2 R [whatever other options you use to launch R]

以下是在 R 中执行此操作的方法(> 表示交互式 R 会话):

> Sys.setenv("OMP_NUM_THREADS" = 2)

如果您需要从 R 中检查变量,可以执行以下操作(这将 return 带有数字的字符向量):

> Sys.getenv("OMP_NUM_THREADS")
# The result in our example will be "2"

为了完整起见,如果您想获得有关这些功能的更多信息,请务必使用 ?Sys.setenv?Sys.getenv,并查看 this site 以了解有关 OMP_NUM_THREADS 的详细信息.

希望对您有所帮助!

所以 McG 带领我走上了一条最终让我能够控制核心数量的道路,我将 post 作为另一个答案。

我愚蠢地忽略了一些细节,即我在 RStudio 服务器上工作。对于所有其他目的,我确实认为 McG 的回答非常好。

那个答案帮助我获得了 google 的正确术语,并且在搜索结果中闲逛时我偶然发现了这个 thread,它表明 RhpcBLASctl 包有一个函数可以设置核心数如下:

blas_set_num_threads(2)

在 运行 loess 之前在 RMarkdown 文档中设置此设置使我的 CPU 使用率保持在 200%,而 运行 之后的 loess 功能是有问题的之前。