python3 instalar como python performance numpy linear-algebra blas

python - instalar - pip install numpy linux



Enlace ATLAS/MKL a un Numpy instalado (2)

La respuesta depende de cómo se construyó NumPy inicialmente. Si se construyó contra BLAS y LAPACK, al menos no hay forma de obligar a numpy.dot a usar ATLAS / MKL más tarde sin reconstruir. Otras funciones no usan numpy.dot y puede usar update-alternatives para cambiar los objetivos de los enlaces simbólicos libblas.so.3 y liblapack.so.3 . Esto se debe a que numpy.dot requiere el estilo ATLAS CBLAS o OpenBLAS / MKL, pero no el BLAS / CBLAS y LAPACK de netlib.

Estoy usando openSUSE y he instalado el estándar cblas-devel desde netlib. Sin embargo, parece imposible forzar a NumPy a usar el cblas / cblas-devel enviado. Es decir, si creó NumPy contra netlib BLAS / LAPACK / CBLAS (como el paquete oficial), entonces _dotblas.so (que proporciona la versión BLAS de numpy.dot ) no se puede numpy.dot (antes de 1.10), o multiarray.so (1.10 y más tarde) no se enlaza a libblas.so.3 en absoluto. Consulte el tema en github: https://github.com/numpy/numpy/issues/1265 y el informe de error de Debian citado: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=464784 . Tal vez alguien pueda sumergirse en el código fuente para hacer un parche ... De todos modos, es solo una función la que está afectada ( numpy.dot ) y siempre puede reconstruir todo el NumPy fácilmente usando el OpenBLAS más rápido ahora, así que probablemente no sea gran cosa después todos.

Conclusión: puede vincularse a ATLAS / MKL / OpenBLAS más tarde sin reconstruir, pero numpy.dot seguirá siendo extremadamente lento si NumPy no se compiló contra ATLAS / MKL / OpenBLAS inicialmente (porque numpy.dot simplemente no usó ningún BLAS en el primer lugar y no puede hacer nada al respecto una vez que se realizó la compilación).

Actualización: En realidad, puedes forzar a numpy para construir _dotblas.so . He hecho un parche para numpy-1.9.2:

diff -Npru numpy-1.9.2.orig/numpy/core/setup.py numpy-1.9.2/numpy/core/setup.py --- numpy-1.9.2.orig/numpy/core/setup.py 2015-02-01 11:38:25.000000000 -0500 +++ numpy-1.9.2/numpy/core/setup.py 2016-03-28 01:31:12.948885383 -0400 @@ -953,8 +953,8 @@ def configuration(parent_package='''',top_ #blas_info = {} def get_dotblas_sources(ext, build_dir): if blas_info: - if (''NO_ATLAS_INFO'', 1) in blas_info.get(''define_macros'', []): - return None # dotblas needs ATLAS, Fortran compiled blas will not be sufficient. + #if (''NO_ATLAS_INFO'', 1) in blas_info.get(''define_macros'', []): + # return None # dotblas needs ATLAS, Fortran compiled blas will not be sufficient. return ext.depends[:3] return None # no extension module will be built

Ahora que _dotblas.so está vinculado a libblas.so.3 , puede usar update-alternatives para probar la diferencia.

TL; DR cómo vincular ATLAS / MKL a Numpy existente sin reconstruir.

Usé Numpy para calcular con la matriz grande y descubrí que es muy lento porque Numpy solo usa 1 núcleo para hacer el cálculo. Después de hacer una gran cantidad de búsquedas, me doy cuenta de que mi Numpy no se vincula a alguna biblioteca optimizada como ATLAS / MKL. Aquí está mi configuración de numpy:

>>>import numpy as np >>>np.__config__.show() blas_info: libraries = [''blas''] library_dirs = [''/usr/lib''] language = f77 lapack_info: libraries = [''lapack''] library_dirs = [''/usr/lib''] language = f77 atlas_threads_info: NOT AVAILABLE blas_opt_info: libraries = [''blas''] library_dirs = [''/usr/lib''] language = f77 define_macros = [(''NO_ATLAS_INFO'', 1)] atlas_blas_threads_info: NOT AVAILABLE openblas_info: NOT AVAILABLE lapack_opt_info: libraries = [''lapack'', ''blas''] library_dirs = [''/usr/lib''] language = f77 define_macros = [(''NO_ATLAS_INFO'', 1)] atlas_info: NOT AVAILABLE lapack_mkl_info: NOT AVAILABLE blas_mkl_info: NOT AVAILABLE atlas_blas_info: NOT AVAILABLE mkl_info: NOT AVAILABLE

Por esta razón, quiero vincular ATLAS / MKL a Numpy. Sin embargo, mi Numpy está instalado desde PIP, por lo que no quiero instalarlo manualmente porque quiero usar la última versión. He hecho algunas búsquedas pero son solo para construir desde cero. Por esta razón, mi pregunta es:

  • ¿Hay alguna forma de vincular ATLAS / MKL a Numpy sin reconstruir nuevamente?
  • Descubrí que la información de configuración se guarda en _ config _.py en la carpeta instalada de Numpy. ¿Así que modificarlo solucionará mi problema? Si es así, ¿podría por favor mostrarme cómo?

Suponiendo que estés usando un poco de Linux, aquí hay una forma en que puedes hacerlo:

  1. Averigüe con qué biblioteca de BLAS está actualmente vinculada el uso de ldd .

    • Para versiones de numpy anteriores a v1.10:

      $ ldd /<path_to_site-packages>/numpy/core/_dotblas.so

      Por ejemplo, si instalo numpy a través de apt-get , se enlaza a

      ... libblas.so.3 => /usr/lib/libblas.so.3 (0x00007fed81de8000) ...

      Si _dotblas.so no existe , es probable que esto signifique que Numpy no pudo detectar ninguna biblioteca BLAS cuando se instaló originalmente, en cuyo caso simplemente no genera ninguno de los componentes dependientes de BLAS. Esto sucede a menudo si instala numpy utilizando pip sin especificar manualmente una biblioteca BLAS (ver más abajo). Me temo que no tendrá más remedio que reconstruir numpy si desea enlazar con una biblioteca BLAS externa.

    • Para numpy v1.10 y más reciente:

      _dotblas.so se ha eliminado de las versiones recientes de numpy, pero debería poder verificar las dependencias de multiarray.so lugar:

      $ ldd /<path_to_site-packages>/numpy/core/multiarray.so

  2. Instale ATLAS / MKL / OpenBLAS si aún no lo ha hecho. Por cierto, definitivamente recomendaría OpenBLAS sobre ATLAS. Eche un vistazo a esta respuesta (aunque los datos de evaluación comparativa probablemente estén un poco desactualizados).

  3. Use update-alternatives para crear un enlace simbólico a la nueva biblioteca BLAS de su elección. Por ejemplo, si instaló libopenblas.so en /opt/OpenBLAS/lib , haría:

    $ sudo update-alternatives --install /usr/lib/libblas.so.3 / libblas.so.3 / /opt/OpenBLAS/lib/libopenblas.so / 50

    Puede tener varios enlaces simbólicos configurados para una única biblioteca de destino, lo que le permite cambiar manualmente entre varias bibliotecas BLAS instaladas.

    Por ejemplo, cuando llamo a $ sudo update-alternatives --config libblas.so.3 , puedo elegir entre una de las 3 bibliotecas:

    Selection Path Priority Status ------------------------------------------------------------ 0 /opt/OpenBLAS/lib/libopenblas.so 40 auto mode 1 /opt/OpenBLAS/lib/libopenblas.so 40 manual mode 2 /usr/lib/atlas-base/atlas/libblas.so.3 35 manual mode * 3 /usr/lib/libblas/libblas.so.3 10 manual mode

Si realmente desea la versión "más nueva" de numpy, también puede echar un vistazo a mi respuesta sobre cómo compilar numpy desde la fuente con la integración de OpenBLAS .

Instalar numpy con soporte BLAS usando pip

Como @tndoan mencionó en los comentarios, es posible hacer que pip respete una configuración particular para numpy colocando un archivo de configuración en ~/.numpy-site.cfg ; consulte esta respuesta para obtener más detalles.

Mi preferencia personal es configurar y construir numpy a mano. No es particularmente difícil, y le da un mejor control sobre la configuración de numpy.