scikit - text classification python
Una forma sencilla de utilizar las opciones paralelas de las funciones de aprendizaje de scikit en HPC (1)
SKLearn gestiona su paralelismo con Joblib . Joblib puede intercambiar el backend de multiprocesamiento para 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 programador y trabajadores dask.distributed
en su clúster. Las instrucciones generales están disponibles aquí: 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 sintaxis 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
En muchas funciones de scikit-learn implementado paralelización fácil de usar. Por ejemplo, en sklearn.cross_validation.cross_val_score
solo 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 programas de Python se paralizan con el multiprocessing
fácil de escalar en toda la arquitectura MPI con la utilidad mpirun
. ¿Puedo distribuir el cálculo de sklearn
funciones de sklearn
en varios nodos de cómputo usando n_jobs
argumento mpirun
y n_jobs
?