[PYTHON] Ich möchte mkl mit numpy und scipy unter pyenv + Poesie verwenden

what's this? Wie der Titel schon sagt, die Geschichte des Versuchs, mkl mit Numpy und Scipy in der Pyenv + -Poesie-Umgebung zu verwenden. Es wäre einfach, wenn ich die Lösung wüsste, aber es hat lange gedauert, bis ich dort ankam ... Die Umgebung ist Mac OS 10.14.6 Mojave Die Version von pyenv ist 1.2.16-5-g7097f820 Die Gedichtversion ist 1.0.3 ist.

Schlussfolgerung (Lösung)

Vielleicht werden viele Leute, die sich diesen Artikel ansehen, auf ähnliche Probleme stoßen und diese schnell lösen wollen, also werde ich zuerst die Schlussfolgerung (Lösung) schreiben.

Der Projektname lautet "my-project" und die verwendete Python-Version ist 3.7.4. Es wird davon ausgegangen, dass mkl standardmäßig in / opt / intel / installiert ist. Es wird angenommen, dass das Projektverzeichnis so eingestellt ist, dass .venv erstellt wird (poet config virtualenvs.in-project true).

Projektverzeichnis erstellen und Python-Version angeben (hier normal)

Erstellen Sie ein Projektverzeichnis und geben Sie die Python-Version an. Bis zu diesem Punkt ist normal.

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

Einstellungen für die virtuelle Umgebung (ungewöhnlich)

Normalerweise erstellt die Poesie ".venv" von selbst, so dass Sie ".venv" nicht selbst erstellen müssen, sondern diesmal

Also mach dein eigenes .venv.

$ python -m venv .venv

Legen Sie Umgebungsvariablen für mkl fest

$ 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

Erstellen Sie ".venv / pip.conf" und setzen Sie "no-binary = numpy, scipy", "no-use-pep517".

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

Erstellen Sie eine Konfigurationsdatei $ HOME / .numpy-site.cfg für numpy build mit dem folgenden Inhalt.

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

Vorbereitung von pyproject.toml (hier normal)

Jetzt, wo ich bereit bin, "Poesie drin"

$ 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 von Cython

Fügen Sie zuerst "Cython" ein.

$ poetry add cython

Installieren Sie numpy

Dann numpy.

$ poetry add numpy

Hier, wenn Sie Poesie ausführen python -c" import numpy; numpy.show_config () ",

Traceback (most recent call last):
(Unterlassung)
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]: Wenn Sie die virtuelle Umgebung mit "Poetry Shell" betreten und dann "Python" und "Import Numpy" starten, wird dieser Fehler nicht angezeigt. In diesem Zustand schlägt "Poetry Add Scipy" jedoch fehl. Es bleibt also nichts anderes übrig, als rpath hinzuzufügen. Wenn das passiert,

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

Ausführen. Dann,

$ 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']

Vorahnung des Glücks ...

Installation von scipy

Setzen Sie scipy am Ende. Wenn alles soweit gut geht, sollte der Rest reibungslos verlaufen. (Scipy Build braucht Zeit. Bitte warten Sie geduldig)

$ poetry add scipy

Bestätigung

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']

Danke für deine harte Arbeit.

Bis zur Lösung ...

Der Weg zur obigen Lösung war ziemlich lang. Ich werde Ihnen eine Zusammenfassung der Reise schicken (fast mein eigenes Memo). Es ist kein Problem, es zu überspringen.

Ich habe es normal versucht

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

.venv / pip.conf

[install]
no-binary = numpy,scipy

Erstellen Sie mit und bearbeiten Sie die anderen ~ / .numpy-site.cfg und .venv / bin / enabled auf die gleiche Weise wie in der obigen Lösung.

poetry add numpy ist erfolgreich (obwohl ich rpath nicht hinzufügen kann), aber wenn ichpoetry führe, füge scipy hinzu ...

[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'
...(Unterlassung)...
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

Das Terminal wird hellrot.

Warum entfernen Sie numpy nicht aus no-binary, nachdem Sie numpy erstellt haben?

.venv / pip.conf

[install]
no-binary = numpy

Nach der Installation von numpy mit poet add numpy (wieder müssen Sie rpath hinzufügen), dann .venv / pip.conf

[install]
no-binary = scipy

Wenn Sie es als "Poesie hinzufügen scipy" umschreiben ... funktioniert es.

Aber es ist ein Ärger ... Lassen Sie uns etwas mehr erforschen.

Untersuchen Sie die Ursache nur mit Pyenv

Ich falte es, aber Pyenv allein gibt das gleiche Symptom ... Ist es nicht nutzlos, weil es mit / private / var / ... erstellt wurde? Versuchen Sie, scipy mit pip mit --no-build-isolation in einer Nur-Pyenv-Umgebung zu installieren, und es funktioniert.

Versuchen Sie, in der Poesieumgebung "No-Build-Isolation" hinzuzufügen.

Sogar in der Poesie dachte ich, dass ich es schaffen könnte, wenn ich "Build-Isolation" deaktiviere, also habe ich ".venv / pip.conf" geändert

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

Wenn ich es versuche als ...

Es war unmöglich. Das Terminal ist hellrot. Ich weine gleich.

Ist es nicht möglich, no-use-pep517 zu verwenden?

Nach der Erforschung verschiedener Dinge,

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

Im Pip-Referenzhandbuch. ... Ist das nicht möglich - --no-use-pep517? .venv / pip.conf`

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

Versuchen Sie es als. Ich hab es gut gemacht. Dies führt zu der obigen Lösung.

Zusammenfassung

Es ist ein Ärger, also denke ich, dass es besser ist, es zu tun, wenn es nicht zu viel ist.

Referenz

Recommended Posts

Ich möchte mkl mit numpy und scipy unter pyenv + Poesie verwenden
Ich möchte eine virtuelle Umgebung mit Jupyter Notebook verwenden!
Verwenden Sie smbus mit python3 in einer pyenv-Umgebung
Ich möchte MATLAB feval mit Python verwenden
Ich möchte Temporäres Verzeichnis mit Python2 verwenden
Ich möchte -inf nicht mit np.log verwenden
Ich möchte Python in der Umgebung von pyenv + pipenv unter Windows 10 verwenden
Ich möchte ein Element mit numpy in eine Datei schreiben und es überprüfen.
Ich möchte die Optimierung mit Python und CPlex behandeln
Verwenden Sie OpenBLAS mit numpy, scipy
Ich möchte R-Funktionen einfach mit ipython notebook verwenden
Ich möchte mit Numpy die japanische Flagge in die Palau-Flagge ändern
[Python] Ich möchte die Option -h mit argparse verwenden
Ich möchte das Paket aus den Anforderungen.txt mit Poesie installieren
Ich möchte VS Code und Spyder ohne Anakonda verwenden! !! !!
Ich kenne? Datenanalyse mit Python oder Dingen, die Sie mit numpy verwenden möchten, wenn Sie möchten
Ich möchte ○○ mit Pandas machen
Ich möchte mit Python debuggen
Erstellen einer Umgebung mit pyenv und pyenv-virtualenv
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Ich möchte APG4b mit Python lösen (nur 4.01 und 4.04 in Kapitel 4)
Ich möchte Rails mit Rails auch in einer vagabundierenden Umgebung betreiben
Ich möchte eine externe Bibliothek mit IBM Cloud-Funktionen verwenden
Ich möchte sowohl den Schlüssel als auch den Wert des Python-Iterators verwenden
Bereiten Sie eine Umgebung für die Verwendung von OpenCV und Pillow mit AWS Lambda vor
Ich möchte wirklich GitHub Flavored Markdown (GFM) mit Pelican verwenden!
Ich möchte Objekte mit OpenCV erkennen
Verwenden Sie nach dem Kauf eines neuen Mac Pyenv + Poetry, um eine Python-Umgebung zu erstellen.
Ich wollte ein Jupyter-Notebook mit Docker in einer Pip-Umgebung (Opticspy) verwenden.
Ich möchte die Verarbeitung zwischen Testzeit und Produktionsumgebung trennen
Ich möchte einen Blog mit Jupyter Notebook schreiben
Wenn Sie NumPy, Pandas, Matplotlib, IPython, SciPy unter Windows verwenden möchten
Ich möchte eine Python-Umgebung erstellen
Ich möchte Linux auf dem Mac verwenden
Ich möchte eine Pip-Installation mit PythonAnywhere durchführen
Ich möchte Protokolle mit Python analysieren
Ich möchte mit aws mit Python spielen
Ich möchte IPython Qt Console verwenden
Verwendung von Tensorflow unter Docker-Umgebung
Ich möchte nur den Befehl SMTP MAIL FROM und den Befehl RCPT TO verwenden, ohne E-Mails mit Pythons smtplib zu senden
Verwenden Sie BLAS / LAPACK mit mehreren Threads mit numpy / scipy
Ich möchte datetime.datetime.now () auch mit pytest verspotten!
Ich möchte mehrere Bilder mit matplotlib anzeigen.
Ich möchte 100 Datenwissenschaften mit Colaboratory schlagen
Ich möchte ein Spiel mit Python machen
Verwenden Sie mit pyenv mehrere Versionen der Python-Umgebung
Ich möchte OREMO mit setParam sein!
Verwenden von Intel MKL mit NumPy / SciPy (Version November 2019)
Ich möchte Ceres Solver aus Python verwenden
#Unresolved Ich möchte Gobject-Introspection mit Python3 kompilieren
Wie man tkinter mit Python in Pyenv benutzt
Verwendung von pip3 in einer Proxy-Umgebung Hinweis
Ich möchte APG4b mit Python lösen (Kapitel 2)
Ich möchte pyenv + pipenv auch unter Windows machen
Ich möchte mit Djangos Migrate von vorne beginnen
Ich möchte mit Python in eine Datei schreiben
Ich möchte die Aktivierungsfunktion Mish verwenden
[Python] Ich möchte mit Flask ein statisches Verzeichnis hinzufügen. [Ich möchte etwas anderes als statisch verwenden.]
[Python] Ich möchte nur den Index verwenden, wenn ich eine Liste mit einer for-Anweisung schleife
Ich möchte ein Bild mit Lollipop in WebP konvertieren