Más sobre ciencia de datos en cienciadedatos.net
Este documento contiene ejemplos de cómo paralelizar bucles for con python. En concreto, se muestra cómo utilizar las funcionalidades de paralelizado que ofrecen las librerías multiprocessing
y joblib
.
Para las dos librerías, se muestra cómo paralelizar una función sencilla y cómo paralelizar el entrenamiento de modelos de scikit-learn.
# secuencial (no paralelizado)
# ==============================================================================
import pandas as pd
import numpy as np
# Se define la función
def suma_acumulada(number):
return sum(range(1, number + 1))
# Lista de elementos sobre los que se quiere aplicar la función
valores = [10**8, 10**8, 10**8, 10**8, 10**8]
%%time
# Aplicar la función sobre cada elemento de forma secuencial
resultados = []
for valor in valores:
resultado = suma_acumulada(valor)
resultados.append(resultado)
resultados
# multiprocessing Pool.map
# ==============================================================================
import pandas as pd
import numpy as np
import multiprocessing
# Se define la función
def suma_acumulada(number):
return sum(range(1, number + 1))
# Lista de elementos sobre los que se quiere aplicar la función
valores = [10**8, 10**8, 10**8, 10**8, 10**8]
%%time
# Aplicar la función sobre cada elemento en paralelo
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
resultados = pool.map(suma_acumulada, valores)
resultados
# joblib
# ==============================================================================
import pandas as pd
import numpy as np
import multiprocessing
from joblib import Parallel, delayed
# Se define la función
def suma_acumulada(number):
return sum(range(1, number + 1))
# Lista de elementos sobre los que se quiere aplicar la función
valores = [10**8, 10**8, 10**8, 10**8, 10**8]
%%time
# Aplicar la función sobre cada elemento en paralelo
n_jobs = multiprocessing.cpu_count()
Parallel(n_jobs=n_jobs)(delayed(suma_acumulada)(i) for i in valores)
# Secuencial (no paralelizado)
# ==============================================================================
import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
# Datos de entrenamiento
X, y = load_boston(return_X_y=True)
# Valores sobre los que iterar en paralelo
list_n_estimators = [1000, 2000, 5000, 10000]
# Función de entrenamiento
def train_model(X, y, n_estimators):
model = RandomForestRegressor(
n_estimators = n_estimators,
n_jobs = 1,
random_state = 123
)
model.fit(X, y)
return model
%%time
modelos = []
for n_estimators in list_n_estimators:
modelo = train_model(X, y, n_estimators)
modelos.append(modelo)
# Entrenamiento paralelo de múltiples modelos multiprocessing Pool.map()
# ==============================================================================
import pandas as pd
import numpy as np
import multiprocessing
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
# Datos de entrenamiento
X, y = load_boston(return_X_y=True)
# Valores sobre los que iterar en paralelo
list_n_estimators = [1000, 2000, 5000, 10000]
# Función de entrenamiento
def train_model(X, y, n_estimators):
model = RandomForestRegressor(
n_estimators = n_estimators,
n_jobs = 1,
random_state = 123
)
model.fit(X, y)
return model
%%time
n_jobs = multiprocessing.cpu_count()
pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
modelos = pool.starmap(train_model, [(X, y, n_estimators) for n_estimators in list_n_estimators])
# Entrenamiento paralelo de múltiples modelos joblib
# ==============================================================================
import pandas as pd
import numpy as np
from joblib import Parallel, delayed
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
# Datos de entrenamiento
X, y = load_boston(return_X_y=True)
# Valores sobre los que iterar en paralelo
list_n_estimators = [1000, 2000, 5000, 10000]
# Función de entrenamiento
def train_model(X, y, n_estimators):
model = RandomForestRegressor(
n_estimators = n_estimators,
n_jobs = 1,
random_state = 123
)
model.fit(X, y)
return model
%%time
n_jobs = multiprocessing.cpu_count()
modelos = Parallel(n_jobs=n_jobs)(delayed(train_model)(X, y, n_estimators) for n_estimators in list_n_estimators)
from sinfo import sinfo
sinfo()
¿Cómo citar este documento?
Paralelizar con Python by Joaquín Amat Rodrigo, available under a Attribution 4.0 International (CC BY 4.0) at https://www.cienciadedatos.net/documentos/py12-paralelizar-con-python.html
This work by Joaquín Amat Rodrigo is licensed under a Creative Commons Attribution 4.0 International License.