我试图多次使用loess()
函数来拟合+-70.000值作为两个变量的函数。我想使用这种拟合趋势来消除数据趋势。我的问题是,一旦启动了黄土功能,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个)。理想情况下,我会loess()
仅在1个内核上运行。
我试图在黄土代码中追踪任何多核参数,但找不到。我知道黄土调用stats:::simpleLoess
,后者依次调用C code,后者又调用Fortran代码。我没有使用C或Fortran的经验,也无法弄清楚如何限制此功能的CPU使用率。
有人对我如何限制黄土功能的CPU使用率有任何建议吗?
答案 0 :(得分:1)
我没有足够的知识来评论所有这些工作原理的细节,但是我知道C ++和FORTRAN for R通常是使用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中检查变量,则可以执行以下操作(这将返回带有数字的字符向量):
> Sys.getenv("OMP_NUM_THREADS")
# The result in our example will be "2"
出于完整性考虑,如果您希望获得有关这些功能的更多信息,请确保使用?Sys.setenv
或?Sys.getenv
,并查看this site以获得有关OMP_NUM_THREADS
的详细信息。 / p>
希望有帮助!
答案 1 :(得分:0)
因此,McG带领我走了一条路,最终使我能够控制内核数,我将其发布为另一个答案。
我愚蠢地忽略了一些细节,即我在RStudio服务器上工作。出于所有其他目的,我确实认为McG的答案会很好。
该答案帮助我正确地找到了Google的字词,并在偶然发现的搜索结果中徘徊了这个thread,这表明RhpcBLASctl
软件包具有如下功能来设置核数:
blas_set_num_threads(2)
在运行loess
之前在RMarkdown文档中对此进行设置,使我的CPU使用率保持在200%,而随后运行loess
函数则以前是有问题的。