Код: Выделить всё
#!/bin/bash
##----------------------- Start job description -----------------------
#SBATCH --partition=standard
#SBATCH --job-name=multi_Leaspy
#SBATCH --nodes=1
#SBATCH --ntasks=40
#SBATCH --mem-per-cpu=4096
#SBATCH --time=160:00:00
#SBATCH --mail-type=ALL
#SBATCH --output=out-%j.log
#SBATCH --error=err-%j.log
##------------------------ End job description ------------------------
Код: Выделить всё
num_workers = ntasks = int(os.environ.get('SLURM_NTASKS', 1))
if __name__ == "__main__":
with ProcessPoolExecutor(max_workers = num_workers - 1) as executor:
arg_list = [(i, row, df_test, id_test, btstrp, classes, classes_auc,
results_table, MAE_table, features_set, vector_range) for i, row in feat_sub.iterrows()]
for result, MAE_row in executor.map(multiLeaspyIter, arg_list):
if result is not None and MAE_row is not None:
results_table = results_table.append(result, ignore_index=True)
MAE_table = MAE_table.append(MAE_row, ignore_index = True)
htop results:
Задачи = 1627, 501 тыс., 40 работает
Средняя нагрузка = 201,3, 180,94, 117,36
Каждый узел имеет 40 процессоров с включенной технологией Hyper-Threading.
Раньше я использовал ProcessPoolExecutor с тем же кодом, но он работал намного медленнее.
Я не уверен, подходит ли многопроцессорная обработка для среды Slurm, или я что-то упускаю .
Раньше я использовал ProcessPoolExecutor с тем же кодом, но он работал медленнее.
Когда я настраиваю .sh так --ntasks = 1 и .py, поэтому max_workers = 1, код работает быстрее. Если --ntasks = 5 и max_workers = 5, он работает медленнее и создает дополнительные процессы ожидания.
Кроме того, я заметил, что всего лишь с одним процессом создается много потоков.
Я пробовал тот же код в Windows, он работает быстрее.
Подробнее здесь: https://stackoverflow.com/questions/787 ... w-on-slurm