R и GNU Parallel - Как ограничить количество используемых ядер - PullRequest
1 голос
/ 05 марта 2019

(Новое в 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 параллельно запускать Test.R с использованием R (я установил это с помощью anaconda)

В терминале (после перехода на рабочий стол, где находится Test.Rи command.txt есть) Я использую команду:

parallel --jobs 2 < commands.txt

Что я хочу сделать, это использовать 2 ядра и запускать команды из command.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

1 Ответ

1 голос
/ 06 марта 2019

На основе выходных данных htop сценарий /Users/name/anaconda3/lib/R/bin/Rscript использует более одного потока ЦП (182%).У вас есть 4 потока ЦП, и, поскольку вы запускаете 2 Rscript с, мы не можем сказать, сожжет ли Rscript все 4 потока ЦП, если он будет запущен сам по себе.Возможно, он сожрет все доступные потоки ЦП (ваш тест на 64-ядерном компьютере предлагает это).

Если вы используете GNU / Linux, вы можете ограничить, какие потоки ЦП программа может использовать с taskset:

taskset 9 parallel --jobs 2 < commands.txt

Это должно заставить GNU Parallel (и все его дочерние элементы) использовать только процессорные потоки 1 и 4 (9 в двоичном виде: 1001).Таким образом, выполнение, которое должно ограничивать выполнение двух заданий только в двух потоках.

Используя 9 (1001 двоичный) или 6 (0110 двоичный), мы достаточно уверены, что два потока ЦП находятся на двух разных ядрах.3 (11 бинарных) может относиться к двум потокам в ядре процессора и, следовательно, будет медленнее.То же самое относится и к 5 (101 двоичный код).

В общем случае вы хотите использовать как можно больше потоков ЦП, поскольку это обычно ускоряет вычисления.Из вашего вопроса неясно, почему вы хотите этого избежать.

Если вы делите сервер с другими, лучшим решением будет использование nice.Таким образом, вы можете использовать всю мощность процессора, которую не используют другие.

...