Мне нужно обработать много данных одним сценарием, поэтому я пытаюсь запустить сценарий Python с многопроцессорным использованием SLURM.Я чувствую, что я так близок к правильному ответу, но каждый раз, когда что-то идет не так.
Мой стартовый пакет включает в себя:
- текстовый файл с аргументами;одна строка содержит некоторые параметры и аргументы, которые управляют объемом обрабатываемых данных, например
2011-02-19 56755 70 2012-01-01 2012-01-04
Последние два аргумента означают, что данные за 4 дня должны быть обработаны(они начинаются и заканчиваются днем)
сценарий обработки .py со множеством необходимых функций
сценарий main.py гдеиспользуется многопроцессорная обработка
файл sbatch run.sh с командами и параметрами для SLURM.
Итак, вот мой main.py и run.Скрипт sh.
main.py
Аргументы - это кортежи данных.Если мне нужно обработать N дней, len (arg_array_filt) = N * M * 3 и len (arg_array_map) = N * M.
if __name__ == '__main__':
arg_array_filt, arg_array_map = myut.get_args(dates)
if FILTER:
pool_filt = Pool()
pool_filt.map(ft.partial(myut.filt_worker, RESPONSE), arg_array_filt)
pool_filt.close()
pool_filt.join()
if CORRELATE:
pool = Pool()
pool.map(ft.partial(myut.map_worker, tmp_date, t0, tt, rock_consts, latitudes, longitudes, deep_coordinates), arg_array_map)
pool.map(ft.partial(myut.st_reduce_worker, tmp_date, t0, const_r), dates)
pool.close()
pool.join()
Одна из версий для run.sh
#!/bin/bash
#SBATCH -n4 # number of tasks
module load python-intel-18.3/3.6
for i in {1..4}
do
line=`sed "${i}q;d" arrayparams.txt`
srun -n1 python3 main0.py $line &
done
wait
Я запустил эту схему только для одного дня данных и знаю, что это занимает около 7 минут.Например, упомянутый выше скрипт run.sh выполняет 4 задачи параллельно, но общая продолжительность составляет 23 минуты.И я полагаю, что больше данных потребует больше времени даже при параллельной работе.Это можно преодолеть?Я прочитал, что карта содержит результаты, пока не завершится последний процесс.Но их время работы почти одинаково.Я не нашел объяснений этому.
Также у меня есть проблемы с картой.Он не выполняет рабочих по нескольким аргументам.Я пытался найти различное количество процессоров на задачу в run.sh, а также количество процессов в пуле.Все выглядит так, будто карта использует только один процессор.Вероятно, я не понимаю, как распределять ресурсы ...
Я боролся с этой задачей в течение нескольких недель, поэтому буду признателен за любую помощь и советы.Заранее спасибо!
UPD
Я нашел некоторую информацию о количестве потоков, поэтому я вставил следующую строку в скрипт run.sh:
export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK
и следующий фрагмент кода находится в main.py:
os.environ["OMP_NUM_THREADS"] = os.environ['SLURM_CPUS_PER_TASK']
pool_size = int(os.environ['SLURM_CPUS_PER_TASK'])
Вчера я изменил количество потоков и размер пула и получил следующие результаты для обработки данных за один день:
- 1 процессор / задача,
pool_size = 1
-> 1 час 19 минут - 1 процессор / задача,
pool_size = 8
-> 14 минут 49 секунд - 1 процессор / задача,
pool_size = 16
-> 8 минут 39 секунд - никаких указанных параметров нет, как раньше, но использовался 1 процессор -> 7 минут 39 секунд.
Итак, на данный момент яИнтересно, сколько потоков в одном процессоре?Основываясь на примерах времени, могу ли я предположить, что в одном процессоре 16 потоков?
Также я нашел полезную статью об отправке гибридных заданий: https://hpcrcf.atlassian.net/wiki/spaces/TCP/pages/7289570/How-to+Submit+a+Hybrid+Job
Есть интересная таблица о числепроцессоров, потоков и времени работы.