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ó.