использовать GNU parallel для распараллеливания многопоточной команды

Я только что написал скрипт на Python, который включает в себя многопоточность, например:

    python myScript.py -cpu_n 5 -i input_file

Чтобы запустить команду для моих сотен входных файлов, я создаю список (commands.list) команд для каждого из них:

    python myScript.py -cpu_n 5 -i input_file1
    python myScript.py -cpu_n 5 -i input_file2
    python myScript.py -cpu_n 5 -i input_file3
    ...

И я пытаюсь запланировать их с помощью команды «параллельно» и 10 процессоров трех разных машин:

   parallel -S 10/$server1 -S 10/$server2 -S 10/$server3 < commands.list

Мой вопрос: какое максимальное количество процессоров будет использоваться на каждом сервере с помощью команды parallel? Будет ли это 5 * 10 = 50 или только 10 процессоров?


person Ezekiel Kuo    schedule 26.01.2017    source источник
comment
Трудно сказать без кода.   -  person Klaus D.    schedule 26.01.2017
comment
Во-первых, будьте осторожны, чтобы отличать ЦП от ядер, один ЦП может иметь 8 или более ядер. Во-вторых, вам нужно быть осторожным с заданиями и ядрами — вы можете создать одно задание, которое может блуждать и выполняться на разных ядрах в разное время — подумайте о ЦП. /основное сходство. Теоретически одно задание может выполняться на каждом из 10 процессоров на каком-то этапе его жизни.   -  person Mark Setchell    schedule 26.01.2017
comment
Если файл commands.list такой простой, вы можете просто сгенерировать его с помощью GNU Parallel: parallel python myScript.py -cpu_n 5 -i ::: input_file*; Если команда очень сложная, используйте функцию bash: gnu.org/software/parallel/   -  person Ole Tange    schedule 26.01.2017


Ответы (1)


С 1_:

   --jobs N
   -j N
   --max-procs N
   -P N     Number of jobslots on each machine. Run up to N
            jobs in parallel.  0 means as many as possible.
            Default is 100% which will run one job per CPU
            core on each machine.


   -S
   [@hostgroups/][ncpu/]sshlogin[,[@hostgroups/][ncpu/]sshlogin[,...]]
   :
            GNU parallel will determine the number of CPU
            cores on the remote computers and run the number
            of jobs as specified by -j.  If the number ncpu
            is given GNU parallel will use this number for
            number of CPU cores on the host. Normally ncpu
            will not be needed.

Таким образом, ваша команда будет запускать до 10 заданий на каждом сервере параллельно.

Неясно, будет ли каждая из ваших команд использовать 5 ядер ЦП. Если каждая из ваших команд использует 5 ядер, будет использоваться 50 ядер на сервер, и в этом случае я рекомендую вам не использовать синтаксис ncpu/server, а вместо этого использовать:

parallel -j 20% -S $server1,$server2,$server3 < commands.list

Таким образом, вы можете смешивать серверы с разным количеством ядер, и GNU Parallel будет запускать 1/5 этого количества параллельно.

person Ole Tange    schedule 26.01.2017
comment
Я согласен, что процент должен быть включен. Интересно то, что я только что попробовал в меньшем масштабе: скрипт python, использующий 2 процессора, и команду prallel с 2 процессорами на трех серверах соответственно. В результате каждый сервер предоставляет только 2 процессора, а не 2 * 2 процессора. - person Ezekiel Kuo; 27.01.2017