sklearn.utils.parallel_backend

sklearn.utils.parallel_backend()

Cambia el backend predeterminado utilizado por Parallel dentro de un bloque with.

Si backend es una cadena, debe coincidir con una implementación previamente registrada mediante la función register_parallel_backend.

Por defecto están disponibles los siguientes backends:

  • “loky”: paralelismo basado en procesos de un solo host (utilizado por defecto),

  • “threading”: paralelismo basado en hilos y en un solo host,

  • “multiprocessing”: paralelismo heredado de un solo host y basado en procesos.

“loky” se recomienda para ejecutar funciones que manipulan objetos de Python. “threading” es una alternativa de baja sobrecarga que es más eficiente para las funciones que liberan el Bloqueo Global del Intérprete: por ejemplo, código I/O-bound o código CPU-bound en unas pocas invocaciones al código nativo que explícitamente libera el GIL.

Además, si se instalan los paquetes dask y distributed de Python, es posible utilizar el backend dask para programar mejor las invocaciones paralelas anidadas sin sobresuscripción y distribuir potencialmente las invocaciones paralelas en un conglomerado en red de varios hosts.

También es posible utilizar el backend distribuido “ray” para distribuir la carga de trabajo a un conglomerado de nodos. Para utilizar el backend joblib “ray” añade las siguientes líneas:

>>> from ray.util.joblib import register_ray  
>>> register_ray()  
>>> with parallel_backend("ray"):  
...     print(Parallel()(delayed(neg)(i + 1) for i in range(5)))
[-1, -2, -3, -4, -5]

Alternativamente, el backend se puede pasar directamente como una instancia.

Por defecto se utilizarán todos los trabajadores disponibles (n_jobs=-1) a menos que el invocador pase un valor explícito para el parámetro n_jobs.

Esta es una alternativa a pasar un argumento backend='backend_name' al constructor de la clase Parallel. Es particularmente útil cuando se llama al código de la biblioteca que utiliza joblib internamente pero no expone el argumento backend en su propia API.

>>> from operator import neg
>>> with parallel_backend('threading'):
...     print(Parallel()(delayed(neg)(i + 1) for i in range(5)))
...
[-1, -2, -3, -4, -5]

Advertencia: esta función es experimental y está sujeta a cambios en una versión futura de joblib.

Joblib también intenta limitar la sobresuscripción limitando el número de hilos utilizables en algunos threadpools de bibliotecas de terceros como OpenBLAS, MKL u OpenMP. El límite predeterminado en cada trabajador se establece en max(cpu_count() // effective_n_jobs, 1) pero este límite puede sobrescribirse con el argumento inner_max_num_threads que se utilizará para establecer este límite en los procesos hijos.

Nuevo en la versión 0.10.