Python en Paralel
Introducció
A vegades és necessari executar un mateix model amb paràmetres diferents. És per això que aquest conjunt de scripts explica com paral·lelitzar processos mitjançant bash i python. Properament s’inclourà al manual una explicació amb llibreries de Python i C++ especialitzades.
Codi d’exemple
Suposem que volem executar el nostre script anomenat parallel_python.py, que rep 3 valors per paràmetres d’entrada. En el nostre cas els imprimirà per pantalla.
Un exemple de comanda seria:
python3 parallel_python.py 5 2 3
import sys
import socket
def main():
# Comprovem que hi han 3 paràmetres d'entrada. Sempre s'ha de sumar 1 ja que l'arg[0] és el nom del propi programa
if len(sys.argv) != 4:
print("Usage: introdueix el nombre correcte de paràmetres d'entrada")
sys.exit()
arg1 = sys.argv[1]
arg2 = sys.argv[2]
arg3 = sys.argv[3]
print('Hostname: ', socket.gethostname(),' ', 'Arg1: ', arg1, ' ', 'Arg2: ', arg2, ' ', 'Arg3: ', arg3, ' ')
if __name__ == '__main__':
main()
Crearem un arxiu per exemple anomenat parallel.sh en el què inclourem els valors que es passin per paràmetres.
Podem observar que creem tres vectors amb (en aquest cas) 2 valors cadascun i volem iterar sobre cadascun d’aquests
També acctivem un venv per a garantitzar que tenim un entorn aïllat de python.
#!/bin/bash
ROUTE=~/tests/parallel_example
params1=(1 2)
params2=(a b)
params3=(A B)
for param1 in "${params1[@]}"
do
for param2 in "${params2[@]}"
do
for param3 in "${params3[@]}"
do
srun --mem=512M --ntasks=1 --cpus-per-task=20 --output="$ROUTE/%j_${param1}_${param2}_${param3}.out" bash -c "source $ROUTE/venv/bin/activate && python3 $ROUTE/parallel_python.py $param1 $param2 $param3 && deactivate" &
done
done
done
Execució
És possible que al ser un script bash no ens permeti l’execució. És per això que hem de canviar les propietats d’execució de l’arxiu, fent:
chmod +x parallel.sh
Aleshores només haurem de fer l’execució:
./parallel.sh
El resultat del nostre programa un cop finalitzada l’execució serà visible al mateix directori a on hem fet l’execució.