gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 15:47:44 26 4
gpt4 key购买 nike

(GNU Parallel 新手)

我的目标是在多个内核上运行具有不同参数的相同 Rscript。我的第一个问题是让它在我的笔记本电脑上运行(2 个真实内核,4 个虚拟内核),然后我将把它移植到一个有 64 个内核的机器上。

目前:

我有一个 Rscript,“Test.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 安装了它)

在终端中(在导航到 Test.R 和 commands.txt 所在的桌面后)我使用命令:
parallel --jobs 2 < commands.txt

我想要这样做,是使用 2 个内核,并从 commands.txt 运行命令,直到所有任务完成。 (我尝试了此命令的变体,例如将 2 更改为 1,在这种情况下,2 个内核以 100% 运行,另外 2 个运行在 20-30% 左右)。

当我运行它时,所有 4 个内核都达到 100%(如从 htop 看到的),并且前 2 个作业完成,并且没有更多的作业完成,尽管所有 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

最佳答案

基于 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(二进制中的 9:1001)。因此,运行应该限制两个作业仅在两个线程中运行。

通过使用 9(1001 二进制)或 6(0110 二进制),我们可以合理地确定两个 CPU 线程位于两个不同的内核上。 3(11 二进制)可能是指 CPU 核心上的两个线程,因此可能会更慢。 5(101 二进制)也是如此。

通常,您希望使用尽可能多的 CPU 线程,因为这通常会使计算速度更快。从您的问题中不清楚您为什么要避免这种情况。

如果您与他人共享服务器,更好的解决方案是使用 nice .这样您就可以使用其他人没有使用的所有 CPU 能力。

关于R 和 GNU Parallel - 如何限制使用的内核数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55010381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com