【问题标题】:Restricting loess' multicore usage in R限制 loess 在 R 中的多核使用
【发布时间】:2019-07-19 09:29:24
【问题描述】:

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

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

# 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 个内核上运行。

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

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

【问题讨论】:

    标签: r core loess


    【解决方案1】:

    我没有足够的知识来评论所有这些如何工作的细节,但我知道用于 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 中执行此操作的方法(&gt; 表示交互式 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 的详细信息。

    希望有帮助!

    【讨论】:

      【解决方案2】:

      因此,McG 带领我走上了一条最终让我能够控制核心数量的道路,我将把它作为另一个答案发布。

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

      该答案帮助我找到了正确的 google 术语,并在搜索结果中闲逛时偶然发现了这个 thread,这表明 RhpcBLASctl 包具有如下设置核心数量的功能:

      blas_set_num_threads(2)
      

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

      【讨论】:

        猜你喜欢
        • 2020-11-15
        • 2013-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-27
        • 2015-03-03
        • 2018-03-07
        • 1970-01-01
        相关资源
        最近更新 更多