No estoy seguro de si esto cuenta más como un problema del sistema operativo, pero pensé en preguntar aquí en caso de que alguien tenga alguna idea del final de Python.
He estado tratando de paralelizar un for
ciclo de CPU pesado usando joblib
, pero encuentro que en lugar de que cada proceso de trabajo se asigne a un núcleo diferente, termino con todos ellos asignados al mismo núcleo y sin ganancia de rendimiento.
Aquí hay un ejemplo muy trivial ...
from joblib import Parallel,delayed
import numpy as np
def testfunc(data):
# some very boneheaded CPU work
for nn in xrange(1000):
for ii in data[0,:]:
for jj in data[1,:]:
ii*jj
def run(niter=10):
data = (np.random.randn(2,100) for ii in xrange(niter))
pool = Parallel(n_jobs=-1,verbose=1,pre_dispatch='all')
results = pool(delayed(testfunc)(dd) for dd in data)
if __name__ == '__main__':
run()
... y esto es lo que veo htop
mientras se ejecuta este script:
Estoy ejecutando Ubuntu 12.10 (3.5.0-26) en una computadora portátil con 4 núcleos. Claramente joblib.Parallel
está generando procesos separados para los diferentes trabajadores, pero ¿hay alguna forma de que pueda ejecutar estos procesos en diferentes núcleos?