Раньше я выполнял некоторые параллелизуемые вычисления, используя python на сервере, теперь я хочу перейти на HP C, работающий над SLURM, но я считаю, что у меня есть некоторые концептуальные проблемы.
Для моих вычислений требуются матрицы и параметры (в виде словаря), одинаковые для всех прогонов, и некоторые входные параметры, которые отличаются. В основном это выглядит так:
def evaluate(inp, matrices, params):
.....
return output
load matrices, create params dict...
inputs = [(k, matrices, params) for k in input_parameters]
with multiprocessing.Pool(processes=n) as pool:
results =pool.starmap(evaluate,inputs)
save_results(results)
и bash скрипт:
#!/bin/bash
#SBATCH -J ****
#SBATCH --ntasks=1
#SBATCH --cpus-per-task=40
#SBATCH --mem=500M
#SBATCH --time=1:00:00
#SBATCH --partition=standard
module load python
source $HOME/env/bin/activate
python3 main.py
Итак, моя проблема здесь в том, что на одном узле, даже если процессы активны, они получают % 0 CPU и ожидает, пока SLURM не завершит задание из-за превышения времени, и когда я попытался использовать multiprocessing.get_context.Pool вместо multiprocessing.Pool, код выполняется и никогда не завершается. Я не совсем понимаю, в чем может быть проблема?
Также, если я хочу выполнить эту программу на нескольких узлах, я понимаю, что мне нужно привязать MPI, и для этой цели можно использовать mpi4py или ray. Это также относится к работе с одним узлом?