Estoy desarrollando una pequeña red neuronal cuyos parámetros necesitan mucha optimización, por lo tanto, un montón de tiempo de procesamiento. He perfilado mi script con cProfile
y lo que toma el 80% del tiempo del procesador es la función NumPy dot
, el resto es inversión de matriz con la función numpy.linalg.solve
. Mi versión actual de numpy usa blas
, o es lo que parece, ya que numpy.core._dotblas.dot
aparece como la función que toma el 80% del tiempo total de procesamiento.¿Cómo acelerar las multiplicaciones de matrices en Python?
Como es el núcleo de mi red neuronal y como tengo que ejecutar esto mucho, cualquier ganancia de velocidad menor podría ahorrarme mucho tiempo en las numerosas optimizaciones de parámetros repetidos.
Más precisiones: la multiplicación de la matriz se basa en matrices que tienen una forma mínima de 100 * 100 hasta 500 * 500. Tengo una computadora con 12 núcleos y los utilizo hasta ahora para ejecutar la optimización de los diferentes parámetros de la red neuronal en paralelo, pero ¿quizás la multiplicación de la matriz podría hacerse en paralelo?
¡Gracias por su tiempo!
Respuesta:
pasé unos pocos días de pruebas e instalación de bibliotecas desinstalación ... Este es el resultado de lo que he probado: Por defecto en mi versión de Ubuntu (12.04) y la versión instalada repositorio de Numpy, la Las bibliotecas BLAS son bibliotecas ATLAS. Hice algunas pruebas que reflejan la mejora ESPECÍFICAMENTE en los cálculos que me interesan, por lo que estos resultados no deben interpretarse como la respuesta final. Estos cálculos implican una multiplicación de matriz (producto de puntos) en un bucle de iteraciones de 55000, con una matriz de 500 * 500 y 1000 * 1000. Utilizo una estación de trabajo HP Z800 con un Xeon X5675 @ 3.07GHZ con 12 núcleos. Todos los resultados (porcentaje) son la comparación entre la condición descrita y la referencia que aquí está la biblioteca ATLAS empaquetada.
Scipy.sparse module
: No sé si fijo correctamente pero con una poca densidad 10%, el uso de este módulo se vuelve útil a partir de 1500 * 1500 matrices con OpenBLAS y MKL. Si tiene alguna sugerencia sobre cómo usarlos correctamente, ¡estoy interesado!- Con OpenBlas obtengo un aumento de velocidad del 33% para 500 * 500 matrices pero del 160% para 1000 * 1000. Pero con OpenBLAS, el módulo scipy.sparse no funciona mejor, pero es peor de hecho.
- El gran ganador aquí son las bibliotecas MKL. ¡La aceleración sube al 230% con matrices 1000 * 1000 de las bibliotecas ATLAS originales! Para las matrices 500 * 500, la aceleración es más modesta (100%) pero sigue siendo muy buena. Además, con la compilación con OpenMP, las multiplicaciones de matrices pueden ejecutarse en mis 12 procesadores y aquí es dos veces más rápido que en un procesador con bibliotecas MKL. Pero es una pérdida de potencia de procesamiento, es mucho más eficiente usar módulos de multiprocesamiento para ejecutar scripts/multiplicaciones de matrices en paralelo.
Openblas es una buena opción gratuita que podría acelerar considerablemente las cosas. Debería ser bastante fácil de conseguir en la mayoría de los sistemas Linux, por ejemplo. – seberg
No me di cuenta de que MKL no es gratis (como en la cerveza); [OpenBLAS] (http://xianyi.github.com/OpenBLAS/) es probablemente una buena alternativa. EPD es gratis para los académicos. – Dougal
Mi red neuronal es realmente escasa (10% de conectividad), obtengo una aceleración del 20%, que no es mucho, pero es mejor que nada. Hablas de OpenBLAS, ¿funcionará más rápido que mi versión actual de Numpy, que ya usa una versión de BLAS? – PierreE