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:
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 utilizandopip
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 demultiarray.so
lugar:$ ldd /<path_to_site-packages>/numpy/core/multiarray.so
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).
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.