Una forma sencilla de utilizar las opciones paralelas de las funciones de aprendizaje de scikit en HPC

En muchas funciones de scikit-learn implementado paralelización fácil de usar. Por ejemplo, en sklearn.cross_validation.cross_val_score , simplemente pasa la cantidad deseada de trabajos computacionales en el argumento n_jobs . Y para PC con procesador multi-core funcionará muy bien. ¿Pero si quiero usar dicha opción en un clúster de alto rendimiento (con el paquete OpenMPI instalado y utilizando SLURM para la gestión de recursos)? Como sé, sklearn usa joblib para la paralelización, que usa multiprocessing . Y, como sé (a partir de esto, por ejemplo, el multiprocesamiento de Python dentro de mpi ), los progtwigs de Python se paralizan con el multiprocessing fácil de escalar en toda la architecture MPI con la utilidad mpirun . ¿Puedo distribuir el cálculo de sklearn funciones de sklearn en varios nodos de cómputo simplemente usando los argumentos mpirun y n_jobs ?

SKLearn gestiona su paralelismo con Joblib . Joblib puede intercambiar el backend de multiprocesamiento por otros sistemas distribuidos como dask.distributed o IPython Parallel . Vea este tema en la página de sklearn github para más detalles.

Ejemplo usando Joblib con Dask.distributed

Código tomado de la página de problema vinculada arriba.

 from distributed.joblib import DistributedBackend # it is important to import joblib from sklearn if we want the distributed features to work with sklearn! from sklearn.externals.joblib import Parallel, parallel_backend, register_parallel_backend ... search = RandomizedSearchCV(model, param_space, cv=10, n_iter=1000, verbose=1) register_parallel_backend('distributed', DistributedBackend) with parallel_backend('distributed', scheduler_host='your_scheduler_host:your_port'): search.fit(digits.data, digits.target) 

Esto requiere que configure un progtwigdor y trabajadores dask.distributed en su clúster. Las instrucciones generales están disponibles aquí: http://distributed.readthedocs.io/en/latest/setup.html

Ejemplo usando Joblib con ipyparallel

Código tomado de la misma página de problema.

 from sklearn.externals.joblib import Parallel, parallel_backend, register_parallel_backend from ipyparallel import Client from ipyparallel.joblib import IPythonParallelBackend digits = load_digits() c = Client(profile='myprofile') print(c.ids) bview = c.load_balanced_view() # this is taken from the ipyparallel source code register_parallel_backend('ipyparallel', lambda : IPythonParallelBackend(view=bview)) ... with parallel_backend('ipyparallel'): search.fit(digits.data, digits.target) 

Nota: en los dos ejemplos anteriores, el parámetro n_jobs parece que ya no importa.

Configurar dask.distributed con SLURM

Para SLURM, la forma más fácil de hacer esto es probablemente ejecutar un dask-scheduler localmente

 $ dask-scheduler Scheduler running at 192.168.12.201:8786 

Y luego use SLURM para enviar muchos trabajos de dask-worker apuntan a este proceso.

 $ sbatch --array=0-200 dask-worker 192.168.201:8786 --nthreads 1 

(En realidad no conozco bien a SLURM, por lo que la syntax de arriba podría ser incorrecta, espero que la intención sea clara)

Utilice dask.distributed directamente

Alternativamente, puede configurar un clúster dask.distributed o IPyParallel y luego usar estas interfaces directamente para paralelizar su código SKLearn. Aquí hay un video de ejemplo del desarrollador de SKLearn y Joblib, Olivier Grisel, haciendo exactamente eso en PyData Berlin: https://youtu.be/Ll6qWDbRTD0?t=1561

Prueba dklearn

También puede probar el paquete experimental dklearn , que tiene un objeto RandomizedSearchCV que es compatible con API con scikit-learn pero implementado computacionalmente sobre Dask

https://github.com/dask/dask-learn

 pip install git+https://github.com/dask/dask-learn