[PYTHON] Je veux utiliser mkl avec numpy et scipy sous l'environnement pyenv + poetry

what's this? Comme le titre l'indique, l'histoire d'essayer d'utiliser mkl avec numpy et scipy dans l'environnement de poésie pyenv +. Ce serait facile si je connaissais la solution, mais il a fallu beaucoup de temps pour y arriver ... L'environnement est mac OS 10.14.6 Mojave La version de pyenv est 1.2.16-5-g7097f820 La version poésie est 1.0.3 est.

Conclusion (solution)

Peut-être que beaucoup de personnes qui consultent cet article rencontreront des problèmes similaires et voudront les résoudre rapidement, alors j'écrirai d'abord la conclusion (solution).

Le nom du projet est «mon-projet» et la version de python utilisée est la 3.7.4. On suppose que mkl est installé dans / opt / intel / ʻen standard. On suppose que le répertoire du projet est défini pour créer .venv (poetry config virtualenvs.in-project true`).

Créer un répertoire de projet et spécifier la version de python (normal ici)

Créez un répertoire de projet et spécifiez la version de python. Jusqu'à ce point, c'est normal.

$ mkdir my-project && cd $_
$ pyenv local 3.7.4

Paramètres d'environnement virtuel (inhabituel)

Normalement, la poésie crée «.venv» seule, vous n'avez donc pas à créer vous-même «.venv», mais cette fois

--Edit .venv / bin / activate pour définir les variables d'environnement pour mkl --Edit .venv / pip.conf pour construire numpy, scipy

Alors faites votre propre .venv.

$ python -m venv .venv

Définir les variables d'environnement pour mkl

$ echo -e "source /opt/intel/bin/compilervars.sh intel64\nsource /opt/intel/mkl/bin/mklvars.sh\nsource /opt/intel/tbb/bin/tbbvars.sh" >> .venv/bin/activate

Créez .venv / pip.conf et définissez no-binary = numpy, scipy, no-use-pep517.

$ touch .venv/pip.conf && echo -e "[install]\nuse-pep517=false\nno-binary=numpy,scipy" >> .venv/pip.conf

Créez un fichier de configuration $ HOME / .numpy-site.cfg pour numpy build avec le contenu suivant.

[mkl]
library_dirs = $MKLROOT/lib
include_dirs = $MKLROOT/include
mkl_libs = mkl_rt
lapack_libs =

Préparation de pyproject.toml (normal ici)

Maintenant que je suis prêt, 'poésie dedans'

$ poetry init

This command will guide you through creating your pyproject.toml config.

Package name [my-project]:  
Version [0.1.0]:  
Description []: 
Author [hogehoge, n to skip]:  
License []:  
Compatible Python versions [^3.7]:  

Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your dev dependencies (require-dev) interactively (yes/no) [yes] no
Generated file

[tool.poetry]
name = "my-project"
version = "0.1.0"
description = ""
authors = ["hogehoge"]

[tool.poetry.dependencies]
python = "^3.7"

[tool.poetry.dev-dependencies]

[build-system]
requires = ["poetry>=0.12"]
build-backend = "poetry.masonry.api"


Do you confirm generation? (yes/no) [yes]

Installation de cython

Tout d'abord, insérez «cython».

$ poetry add cython

Installez numpy

Puis numpy.

$ poetry add numpy

Ici, si vous faites poetry run python -c" import numpy; numpy.show_config () ",

Traceback (most recent call last):
(Omission)
Original error was: dlopen(/path/to/my-project/.venv/lib/python3.7/site-packages/numpy/core/_multiarray_umath.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmkl_rt.dylib
  Referenced from: /path/to/my-project/.venv/lib/python3.7/site-packages/numpy/core/_multiarray_umath.cpython-37m-darwin.so
  Reason: image not found

[^ 1] [^ 1]: Lorsque j'entre dans l'environnement virtuel avec poetry shell et que je démarre python et ʻimport numpy, cette erreur n'apparaît pas ... mais dans cet état, poetry add scipy` échoue. Il n'y a donc pas d'autre choix que d'ajouter rpath. Si ça arrive,

$ install_name_tool -add_rpath $MKLROOT/lib .venv/lib/python3.7/site-packages/numpy/core/_multiarray_umath.cpython-37m-darwin.so

Éxécuter. Puis,

$ poetry run python -c "import numpy; numpy.show_config()"
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']

Prémonition du bonheur ...

Installation de scipy

Mettez scipy à la fin. Si tout va bien jusqu'ici, le reste devrait se passer sans problème. (La construction de Scipy prend du temps. Veuillez patienter)

$ poetry add scipy

Vérification

poetry run python -c "import scipy; scipy.show_config()"
lapack_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
lapack_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
blas_mkl_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
blas_opt_info:
    libraries = ['mkl_rt', 'pthread']
    library_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']
    define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
    include_dirs = ['/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/include', '/opt/intel/compilers_and_libraries_2020.0.166/mac/mkl/lib']

Je vous remercie pour votre travail acharné.

Jusqu'à la solution ...

Le chemin vers la solution ci-dessus a été assez long. Je vous enverrai un résumé du voyage (presque mon propre mémo). Il n'y a aucun problème à le sauter.

Je l'ai essayé normalement

$ mkdir my-project
$ pyenv local 3.7.4
$ python -m venv .venv
$ poetry init

.venv / pip.conf

[install]
no-binary = numpy,scipy

Créez avec et modifiez les autres ~ / .numpy-site.cfg et .venv / bin / activate de la même manière que la solution ci-dessus.

poetry add numpy réussit (bien que je ne puisse pas ajouter rpath), mais quand je lancepoetry add scipy ...

[EnvCommandError]
Command ['/path/to/my-project/.venv/bin/pip', 'install', '--no-deps', 'scipy==1.4.1'] errored with the following return code 1, and output: 
Collecting scipy==1.4.1
  Using cached https://files.pythonhosted.org/packages/04/ab/e2eb3e3f90b9363040a3d885ccc5c79fe20c5b8a3caa8fe3bf47ff653260/scipy-1.4.1.tar.gz
  Installing build dependencies: started
  Installing build dependencies: still running...
  Installing build dependencies: finished with status 'done'
  Getting requirements to build wheel: started
  Getting requirements to build wheel: finished with status 'done'
    Preparing wheel metadata: started
    Preparing wheel metadata: finished with status 'error'
...(Omission)...
Original error was: dlopen(/private/var/folders/9x/94rd8dwd1vg49h9bt7_0kd0w0000gn/T/pip-build-env-mb4t9me7/overlay/lib/python3.7/site-packages/numpy/core/multiarray.cpython-37m-darwin.so, 2): Library not loaded: @rpath/libmkl_rt.dylib
      Referenced from: /private/var/folders/9x/94rd8dwd1vg49h9bt7_0kd0w0000gn/T/pip-build-env-mb4t9me7/overlay/lib/python3.7/site-packages/numpy/core/multiarray.cpython-37m-darwin.so
      Reason: image not found

Le terminal devient rouge vif.

Pourquoi ne pas supprimer numpy de no-binary après avoir construit numpy?

.venv / pip.conf

[install]
no-binary = numpy

Après avoir installé numpy avec poetry add numpy (encore une fois, vous devez ajouter rpath), puis .venv / pip.conf

[install]
no-binary = scipy

Si vous le réécrivez comme "poésie ajoutez scipy" ... cela fonctionne.

Mais c'est un problème ... Explorons un peu plus.

Rechercher la cause uniquement avec pyenv

Je le plie, mais pyenv seul donne le même symptôme ... N'est-ce pas inutile car il est construit avec / private / var / ...? Essayez d'installer scipy avec pip avec --no-build-isolation dans un environnement pyenv uniquement et cela fonctionne.

Essayez d'ajouter «no-build-isolation» dans l'environnement de poésie.

Même en poésie, je pensais que je pourrais le faire si je désactivais build-isolation, alors j'ai changé.venv / pip.conf

[install]
build-isolation = false
no-binary = numpy,scipy

Quand je l'essaye comme ...

C'était impossible. Le terminal est rouge vif. Je suis sur le point de pleurer.

N'est-il pas possible d'utiliser no-use-pep517?

Après avoir recherché diverses choses,

Use PEP 517 for building source distributions (use --no-use-pep517 to force legacy behaviour).

Dans le guide de référence pip. ... N'est-ce pas --no-use-pep517 possible? .venv / pip.conf

[install]
use-pep517=false
no-binary=numpy,scipy

Essayez comme. J'ai bien fait. Cela conduit à la solution ci-dessus.

Résumé

C'est un problème, donc je pense qu'il vaut mieux le faire à moins que ce ne soit trop.

référence

Recommended Posts

Je veux utiliser mkl avec numpy et scipy sous l'environnement pyenv + poetry
Je souhaite utiliser un environnement virtuel avec jupyter notebook!
Utilisez smbus avec python3 sous environnement pyenv
Je veux utiliser MATLAB feval avec python
Je souhaite utiliser le répertoire temporaire avec Python2
Je ne veux pas utiliser -inf avec np.log
Je souhaite utiliser Python dans l'environnement de pyenv + pipenv sous Windows 10
Je veux écrire un élément dans un fichier avec numpy et le vérifier.
Je veux gérer l'optimisation avec python et cplex
Utilisez OpenBLAS avec numpy, scipy
Je souhaite utiliser facilement les fonctions R avec le notebook ipython
Je veux changer le drapeau japonais en drapeau des Palaos avec Numpy
[Python] Je souhaite utiliser l'option -h avec argparse
Je veux installer le package de requirements.txt avec poésie
Je veux utiliser VS Code et Spyder sans anaconda! !! !!
Je connais? Analyse de données à l'aide de Python ou de choses que vous souhaitez utiliser quand vous le souhaitez avec numpy
Je veux faire ○○ avec les Pandas
Je veux déboguer avec Python
Créer un environnement avec pyenv et pyenv-virtualenv
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Je veux résoudre APG4b avec Python (seulement 4.01 et 4.04 au chapitre 4)
Je veux utiliser des rails avec des rails même dans un environnement vagabond
Je souhaite utiliser une bibliothèque externe avec IBM Cloud Functions
Je souhaite utiliser à la fois la clé et la valeur de l'itérateur Python
Préparer un environnement pour utiliser OpenCV et Pillow avec AWS Lambda
Je veux vraiment utiliser GitHub Flavored Markdown (GFM) avec Pelican!
Je veux détecter des objets avec OpenCV
Après avoir acheté un nouveau Mac, utilisez pyenv + poetry pour créer un environnement Python.
Je voulais utiliser le notebook jupyter avec docker dans l'environnement pip (opticspy)
Je souhaite séparer le traitement entre le temps de test et l'environnement de production
Je veux écrire un blog avec Jupyter Notebook
Si vous souhaitez utiliser NumPy, Pandas, Matplotlib, IPython, SciPy sous Windows
Je veux créer un environnement Python
Je veux utiliser Linux sur mac
Je veux installer Python avec PythonAnywhere
Je veux analyser les journaux avec Python
Je veux jouer avec aws avec python
Je souhaite utiliser la console IPython Qt
Comment utiliser Tensorflow dans un environnement Docker
Je veux utiliser uniquement la commande SMTP MAIL FROM et la commande RCPT TO sans envoyer de courrier avec le smtplib de Python
Utilisez BLAS / LAPACK multi-thread avec numpy / scipy
Je veux moquer datetime.datetime.now () même avec pytest!
Je souhaite afficher plusieurs images avec matplotlib.
Je veux frapper 100 sciences des données avec Colaboratory
Je veux faire un jeu avec Python
Utiliser plusieurs versions de l'environnement python avec pyenv
Je veux être OREMO avec setParam!
Utilisation d'Intel MKL avec NumPy / SciPy (version de novembre 2019)
Je veux utiliser le solveur ceres de python
#Unresolved Je veux compiler gobject-introspection avec Python3
Comment utiliser tkinter avec python dans pyenv
Comment utiliser pip3 sous un environnement proxy Remarque
Je veux résoudre APG4b avec Python (chapitre 2)
Je veux faire pyenv + pipenv même sous Windows
Je veux recommencer avec Migrate de Django
Je veux écrire dans un fichier avec Python
Je souhaite utiliser la fonction d'activation Mish
[Python] Je veux ajouter un répertoire statique avec Flask [Je veux utiliser autre chose que statique]
[Python] Je souhaite utiliser uniquement l'index lors de la mise en boucle d'une liste avec une instruction for
Je veux convertir une image en WebP avec sucette