es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué NumPy solo utiliza de 3 a 5 núcleos de mi CPU?

Por supuesto, echaré un vistazo a Python multiprocessing con “pool” para resolver eso, pero me pregunto por qué NumPy actúa de esa manera.

En el mejor de los casos, puedo ver lo siguiente:

  • 1 core al 100%
  • 2 cores alrededor del 70%
  • 3 cores alrededor del 5%

Con programas similares en Julia, hay mucho más paralelismo ocurriendo.

Básicamente, mi programa es una colección de operaciones de vectores NumPy en matrices muy grandes de imágenes y datos en 3D. Las únicas funciones que dependen de otras bibliotecas son Ransac e informes de exportación con MatPlotLib.

ransac_model, inliers = ransac(data, EllipseModel, min_samples, residual_threshold, max_trials=max_trials)
plt.imshow(self.image)
fig = plt.gcf()
ax = fig.gca()
for x,y,c in zip(annotated_centers_x,annotated_centers_y,annotated_diameters):
    circle = plt.Circle((x,y),c,alpha = 0.2,color = 'blue')
    ax.add_patch(circle)
plt.savefig(path)

Ni siquiera estoy seguro de que los otros núcleos sean utilizados por NumPy. Tal vez sean en realidad estas bibliotecas.

Sé que no es la mejor estrategia ejecutar programas grandes con NumPy. Habría sido más sabio usar Julia o tensores TensorFlow/PyTorch. Pero no tengo elección aquí.

¿Podrías explicarme cómo se comporta NumPy en términos de paralelismo?

También estaría interesado si sabes cómo identificar las partes del código que tardan mucho tiempo en Python. Algo así como la biblioteca de perfilado de Julia.

Gracias.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El comportamiento de NumPy en cuanto a paralelismo depende de varios factores, como el tamaño de los arrays, las funciones utilizadas y la versión de NumPy utilizada. En general, NumPy utiliza multi-threading para realizar operaciones vectoriales y matriciales de forma paralela. Sin embargo, algunas operaciones pueden no ser paralelizadas debido a la naturaleza de la operación en sí misma o al tamaño de los arrays. En algunos casos, el uso del módulo “ndarray” de NumPy puede conducir a la paralelización automática.

    En cuanto al perfilado de código, Python cuenta con un módulo integrado de perfilado llamado “cProfile” que proporciona información detallada sobre el tiempo y el número de llamadas realizadas a cada función en el código. Otra herramienta popular de perfilado es “line_profiler”, que puede identificar cuellos de botella en el código mediante el perfilado de líneas individuales.

    En cuanto a la comparación con Julia, cabe señalar que Julia fue diseñado teniendo en cuenta el paralelismo, y sus operaciones de arrays están altamente optimizadas para la ejecución paralela en CPUs y GPUs multi-core. Por lo tanto, no es sorprendente observar más paralelismo en Julia en comparación con NumPy.

    En conclusión, si estás trabajando con arrays grandes y deseas maximizar el paralelismo en NumPy, se recomienda utilizar la última versión de NumPy, utilizar funciones optimizadas para la ejecución paralela y considerar el uso del módulo “ndarray”. Para el perfilado de código, cProfile y line_profiler son buenos puntos de partida.

Comments are closed.