2012-09-02 85 views
8

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.

Respuesta

7

Si aún no se encuentra, podría intentar vincular numpy a una biblioteca muy optimizado BLAS como Intel MKL (que es free-as-in-beer for non-commercial use o discounted for academic use, que al parecer no cuenta como no comercial; instructions from Intel for using it with numpy) o OpenBLAS (gratis -as-en-habla). También está el Enthought Python Distribution, que está pre-vinculado a MKL y gratuito para los académicos. Eso puede paralelizar las multiplicaciones de su matriz de forma automática y puede ser mucho más rápido que la instalación de referencia típica de BLAS/ATLAS en la mayoría de las distribuciones de Linux, o lo que sea que esté utilizando.

De lo contrario, lo único que sé de lo que podría hacer serían algunos trucos matemáticos para no tener que calcular tantas multiplicaciones/soluciones.Sin saber exactamente lo que estás haciendo, es difícil dar alguna sugerencia allí.

Supongo que sus matrices son densas, ya que generalmente están en redes neuronales, pero si está haciendo algo inusual, scipy.sparse también podría ayudar.

+0

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

+0

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

+0

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

4

Numpy utiliza algoritmos y representaciones internos realmente rápidos basados ​​en bibliotecas de terceros (como BLAS, como tú lo llamaste) que ya usan optimizaciones de SSE, entre otros. Debido a que el BLAS original es un poco lento (porque pretende ser una implementación de referencia, centrándose en la precisión en lugar del rendimiento), es posible que desee utilizar otro sabor centrado en el rendimiento, como OpenBLAS. Para usar OpenBLAS, necesita encontrar un paquete Numpy preinstalado habilitado para OpenBLAS o recompilar una versión vinculada a OpenBLAS. Una vez que esté utilizando una implementación eficiente de BLAS, no encontrará una mejor opción de aceleración en python puro, a menos que escriba una biblioteca en C y tome mucho tiempo para optimizarla.

Por otro lado, puede verificar si su biblioteca Numpy y BLAS están compiladas de la manera más eficiente posible en su arquitectura. Por ejemplo, si puede activar la biblioteca OpenMP en la compilación Numpy, permitiría que varios núcleos trabajen en su problema utilizando el paralelismo de nivel de datos. Esta puede ser una fuente importante de aceleración si posee múltiples núcleos en su computadora y sus cálculos están vinculados a la CPU. Si su tipo de problema lo permite, incluso podría usar una biblioteca de programación en paralelo basada en tareas (SCOOP [Deslinden: lo escribí], Celery, etc.) para propagar su trabajo en múltiples computadoras.

Como último recurso, otra posibilidad sería comprar nuevo hardware. Hace que el software sea potencialmente más rápido sin cambiar una sola línea de código.

+0

Gracias, comprobaré qué versión de Blas está instalada e intentaré compilar con OpenMP activado. ¿Qué tan complicado es? – PierreE

+0

@pierotiste: No debería ser tan difícil en un sistema basado en * nix. Debería consistir en recompilar Numpy mientras se vincula con las nuevas bibliotecas y/o banderas. Debería consultar en línea los blogs o el manual de Numpy para más detalles. Dependiendo de las bibliotecas que elija, puede cambiar los pasos requeridos. – Soravux

Cuestiones relacionadas