R和GNU Parallel - 如何限制使用的核心数量

5

(GNU Parallel新手指南)

我的目标是在多个核心上运行相同的R脚本,但参数不同。我的第一个问题是如何在我的笔记本电脑上(2个实际核心,4个虚拟核心)使其工作,然后将其移植到有64个核心的计算机上。

当前:

我有一个名为"Test.R"的R脚本,它接受参数,执行某些操作(例如将一些数字相加,然后将结果写入文件),然后停止。

我有一个包含以下内容的"commands.txt"文件:

/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 100
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 5 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 100 1000
/Users/name/anaconda3/lib/R/bin/Rscript Test.R 50 200 1000

这条命令告诉GNU parallel使用R来运行Test.R(我已经通过anaconda安装了R)。

在终端中(在导航到桌面,即Test.R和commands.txt所在的位置后),我使用以下命令:

parallel --jobs 2 < commands.txt

我希望这个命令能够使用2个核心,并从commands.txt中运行所有任务,直到所有任务完成。(我尝试过对此命令进行变化,例如将2改为1,在这种情况下,2个核心的利用率达到100%,而其他两个核心的利用率在20-30%左右)。
当我运行此命令时,所有4个核心的利用率都达到了100% (如htop所示),前两个任务完成了,但没有更多的任务完成,尽管所有4个核心仍然保持在100%。
当我在64核计算机上运行相同的命令时,所有64个核心都达到了100%,我不得不取消任务。
非常感谢任何关于要查看的资源或我做错的地方的建议。
以下是运行上述命令时请求的htop输出(按CPU%排序):
   1  [||||||||||||||||||||||||100.0%]   Tasks: 490, 490 thr; 4 running
   2  [|||||||||||||||||||||||||99.3%]   Load average: 4.24 3.46 4.12 
   3  [||||||||||||||||||||||||100.0%]   Uptime: 1 day, 18:56:02
   4  [||||||||||||||||||||||||100.0%]
   Mem[|||||||||||||||||||5.83G/8.00G]
   Swp[||||||||||          678M/2.00G]

   PID USER      PRI  NI  VIRT   RES S CPU% MEM%   TIME+  Command
  9719 user     16   0 4763M  291M ? 182.  3.6  0:19.74 /Users/user/anaconda3
  9711 user     16   0 4763M  294M ? 182.  3.6  0:20.69 /Users/user/anaconda3
  7575 user     24   0 4446M 94240 ? 11.7  1.1  1:52.76 /Applications/Utilities
  8833 user     17   0 86.0G  259M ?  0.8  3.2  1:33.25 /System/Library/StagedF
  9709 user     24   0 4195M  2664 R  0.2  0.0  0:00.12 htop
  9676 user     24   0 4197M 14496 ?  0.0  0.2  0:00.13 perl /usr/local/bin/par

请注意您尝试使用的标签:[tag:rstudio] 明确表示“不要将此标签用于一般的 R 编程问题”,因为它仅涉及 IDE 本身。我不确定 [tag:anaconda] 如何与此相关。 - r2evans
1
我使用了这个标签,因为我认为由于我是通过anaconda使用Rstudio,这可能会影响结果。下次注意,谢谢。 - Hector Haffenden
1
你能发布 htop 的输出吗? - Ole Tange
1个回答

4

根据htop输出,脚本/Users/name/anaconda3/lib/R/bin/Rscript使用了超过一个CPU线程(182%)。你有4个CPU线程,由于你运行了2个Rscript,我们无法确定如果只运行一个Rscript它是否会占用所有4个CPU线程。也许它会占用所有可用的CPU线程(在64核机器上的测试表明它可能会这样做)。

如果你正在使用GNU/Linux,你可以通过taskset限制程序可以使用哪些CPU线程:

taskset 9 parallel --jobs 2 < commands.txt

这应该强制 GNU Parallel(及其所有子进程)仅使用 CPU 线程 1 和 4(二进制为 1001)。因此,运行此命令应限制这两个任务仅在两个线程中运行。
通过使用 9(二进制为 1001)或 6(二进制为 0110),我们可以合理地确定两个 CPU 线程位于两个不同的核心上。3(二进制为 11)可能指的是同一 CPU 核上的两个线程,因此速度可能会变慢。5(二进制为 101)也是如此。
通常情况下,希望使用尽可能多的 CPU 线程,因为这通常会使计算更快。从你的问题中无法确定为什么要避免这种方法。
如果你与他人共享服务器,则更好的解决方案是使用“nice”。这样,你就可以利用其他人没有使用的所有 CPU 动力。

我今天稍后会尝试这个(64位计算机有Linux),你知道Mac上的替代taskset的方法吗?抱歉没有说明清楚。至于动机,我正在与他人分享一个大型计算机,所以不想占用所有的核心 :) - Hector Haffenden
1
非常感谢。针对其他遇到相同问题的用户,使用 taskset —cpu-list 55,56,57,58,59,60 parallel --jobs 2 < commands.txt 可以指定要运行的核心,在这个例子中是从第 55 到第 60 个核心。 - Hector Haffenden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接