[PYTHON] Utilisez BLAS / LAPACK multi-thread avec numpy / scipy

Dans article que j'ai écrit plus tôt, j'ai décrit comment installer python, numpy et scipy à partir des sources sans prendre racine.

Cependant, la méthode ci-dessus présente les problèmes suivants.

La raison en est que BLAS et LAPACK ne sont pas multi-threadés. Je n'ai pas assez d'argent pour acheter Intel MKL, j'ai donc décidé d'utiliser OpenBLAS.

Les deux articles de référence suivants.

OpenBLAS

Utilisez SurviveGotoBLAS. Commencez par créer la bibliothèque statique.

# wget http://prs.ism.ac.jp/~nakama/SurviveGotoBLAS2/SurviveGotoBLAS2_3.14.tar.gz
# tar xzf SurviveGotoBLAS2_3.14.tar.gz
# cd survivegotoblas2_3.14
# vim Makefile.rule
TARGET=X86_64
BINARY=64
USE_THREAD=1
USE_OPENMP=1
NUM_THREADS=12    #Ajuster en fonction du nombre de processeurs
NO_CBLAS=1    #CBLAS sera construit plus tard
NO_LAPACK=1    #LAPACK sera construit plus tard
# make all -j 4
# cp libgoto2.a ~/lib    #Un endroit pour partir définitivement (ici~/copier dans la bibliothèque)

Certains packages, tels que Theano, nécessitent une bibliothèque de liens dynamiques, alors créez également .so.

# mkdir tmp
# cd tmp
# cp ../libgoto2.a .
# ar -x libgoto2.a    # .une.Démonté en o
# gfortran -shared -lpthread -lgomp  -o libgoto2.so *.o
# cp libgoto2.so ~/lib    #Copier dans un endroit pour quitter définitivement
# export BLAS=~/lib/libgoto2.so    #Peut ne pas être nécessaire

CBLAS

Vous pouvez utiliser celui inclus dans SurviveGotoBLAS, mais ici vous le construisez vous-même. N'oubliez pas de spécifier le BLAS que vous avez construit précédemment lors de la construction de CBLAS. Attention, il est facile de l'oublier lors de la création .so (deuxième ligne à partir du bas).

# wget http://www.netlib.org/blas/blast-forum/cblas.tgz
# tar xzf cblas.tgz
# cd CBLAS
# cp Makefile.LINUX Makefile.in
# vim Makefile.in
BLLIB = ~/lib/libgoto2.a    #Voir BLAS ici
CBLIB = ../lib/libcblas.a    #Destination de sortie de CBLAS
LOADER = $(FC) -lpthread
CFLAGS = -O3 -m64 -fPIC -DADD_
FFLAGS = -O3 -m64 -fPIC
# make all -j 4
# cp lib/libcblas.a ~/lib    #Copier dans un endroit pour quitter définitivement
# gfortran -L${HOME}/lib -lgoto2 -shared -o libcblas.so *.o
# cp libcblas.so ~/lib    #Copier dans un endroit pour quitter définitivement

LAPACK

Construisez-le vous-même également. Spécifiez les bibliothèques créées jusqu'à présent lors de la construction de LAPACK.

# wget http://www.netlib.org/lapack/lapack.tgz
# tar xzf lapack.tgz
# cd lapack
# cp INSTALL/make.inc.gfortran make.inc
# vi make.inc
OPTS =  -O3 -m64 -fPIC
NOOPT = -O0 -m64 -fPIC
LOADOPTS = -L${HOME}/lib -lgoto2 -lcblas
# make lapacklib -j 4
# cp liblapack.a ~/lib    #Copier dans un endroit pour quitter définitivement
# mkdir tmp
# cd tmp
# cp ../liblapack.a .
# ar -x liblapack.a    # .une.Démonté en o
# gfortran -L${HOME}/lib -lgoto2 -lcblas -shared -o liblapack.so *.o
# cp liblapack.so ~/lib
# export LAPACK=~/lib/liblapack.so    #Peut ne pas être nécessaire

Numpy

Le but est d'éditer site.cfg avant de construire et de faire référence à BLAS et LAPACK.

# wget http://sourceforge.net/projects/numpy/files/NumPy/1.9.0/numpy-1.9.0.tar.gz/download --no-check-certificate
# tar xzf numpy-1.9.0.tar.gz
# cd numpy-1.9.0
# cp site.cfg.example site.cfg
# vim site.cfg
[DEFAULT]
library_dirs = ${HOME}/lib
[atlas]
atlas_libs = goto2,cblas
# python setup.py build
# python setup.py install

Testé pour voir si cela fonctionne. Peut-être qu'il ne devrait y avoir aucune erreur ici.

# python -c "import numpy; numpy.test(verbose=2)"

Vous pouvez exécuter le script de test à ici pour vérifier la vitesse.

# python test_numpy.py

Scipy

# wget http://sourceforge.net/projects/scipy/files/scipy/0.14.0/scipy-0.14.0.tar.gz/download
# tar xzvf scipy-0.14.0.tar.gz
# cd scipy-0.14.0
# vim site.cfg
[DEFAULT]
library_dirs = ${HOME}/lib
[atlas]
atlas_libs = lapack,goto2,cblas

Ici, réécrivez scipy / lib / lapack / \ _ \ _ init \ _ \ _. Py comme suit.

(Vieux)

__init_old__.py


from scipy.linalg import flapack
from scipy.linalg import clapack
_use_force_clapack = 1
if hasattr(clapack,'empty_module'):
    clapack = flapack
    _use_force_clapack = 0
elif hasattr(flapack,'empty_module'):
    flapack = clapack''

(Nouveau)

__init__.py


from scipy.linalg import flapack
clapack = flapack
_use_force_clapack = 0

Enfin, construisez et installez et terminez.

# python setup.py build
# python setup.py install

Testons cela également. Bien qu'il puisse échouer occasionnellement,

# python -c "import numpy; numpy.test(verbose=2)"

Recommended Posts

Utilisez BLAS / LAPACK multi-thread avec numpy / scipy
Utilisez OpenBLAS avec numpy, scipy
Utilisez Numpy
Utilisez Numpy, Scipy, scikit-learn sur Amazon Linux
LPC avec Scipy
Utilisation d'Intel MKL avec NumPy / SciPy (version de novembre 2019)
ICA avec Scipy
Je veux utiliser mkl avec numpy et scipy sous l'environnement pyenv + poetry
CORDIC avec Scipy
numpy, scipy Si vous vous sentez un peu lent, vérifiez si blas, lapack, atlas sont inclus.
Traitement FFT avec filtre numpy et scipy vers passe-bas
Utilisez mecab-ipadic-neologd avec igo-python
Utilisez RTX 3090 avec PyTorch
Utiliser ansible avec cygwin
Utiliser pipdeptree avec virtualenv
[Python] Utiliser JSON avec Python
Utilisez Mock avec pytest
Utiliser l'indicateur avec pd.merge
Utiliser Gentelella avec Django
Moyenne mobile avec numpy
Utiliser mecab avec Python 3
Utiliser DynamoDB avec Python
Utiliser pip avec MSYS2
Utiliser les droits d'auteur avec Spacemacs
Utiliser python avec docker
Utiliser TypeScript avec django-compresseur
Créer un filtre avec scipy
Comment utiliser numpy
Utilisez LESS avec Django
Utiliser MySQL avec Django
Apprenez avec Chemo Informatics NumPy
Concaténation de matrices avec Numpy
Code de bourdonnement avec numpy
Normariser les données avec Scipy
Effectuer une analyse de régression avec NumPy
Utiliser Enum avec SQLAlchemy
Utiliser tensorboard avec NNabla
Utiliser le GPS avec Edison
Étendre NumPy avec Rust
Utilisez nim avec Jupyter
Découvrez la puissance de l'accélération avec NumPy / SciPy
[python] Remarques lors de la tentative d'utilisation de numpy avec Cython