限制黄土在 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
功能是有问题的之前。
我尝试多次使用 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
功能是有问题的之前。