[PYTHON] Tipps zum Importieren von macOS-optimiertem TensorFlow in eine Apple M1-Chipumgebung

Überblick

-Test und Fehler beim Ausführen von "Mac-optimierten TensorFlow- und TensorFlow-Addons" (https://github.com/apple/tensorflow_macos) mit MacBook Air mit M1

Hintergrund

Apples neuer Chip "M1", dessen Details auf dem Apple Event veröffentlicht wurden, das am 11. November 2020 um 03:00 Uhr japanischer Zeit stattfand. In der Ankündigung war ich neugierig, weil der Name der spezifischen Software "TensorFlow" war, aber danach "Mac-optimierte TensorFlow- und TensorFlow-Addons" (https: :) von Apples GitHub-Organisation. //github.com/apple/tensorflow_macos) wurde veröffentlicht. Es handelt sich um einen Pre-Release-Treiber, der [Apples "ML Compute" -Framework] verwendet (https://developer.apple.com/documentation/mlcompute).

Ich habe gerade darüber nachgedacht, es von MacBook Pro (Anfang 2015) zu ersetzen, also habe ich beschlossen, ein MacBook Air mit einem M1-Chip zu kaufen und damit zu experimentieren. [^ 1]

[^ 1]: Es war beeindruckend, dass die Ankündigung und Reservierung am 11.11.2020 (JST) begann, und ich habe mich auch für den Kauf entschieden. Wenn Sie nicht gut in Spielen, Animationen usw. sind und etwas Zeit haben, suchen Sie bitte nach "Idol Master Hobby Programming Birthday". Ich habe diesmal nicht viel über "Entwicklung" getan, aber ich wurde in dieser Hinsicht von "Imus-getriebener Entwicklung" (Referenz: https://www.slideshare.net/treby/imas-driven-developemnt) beeinflusst. Man kann das sagen

Es gab einige Dinge, die beim Verschieben von "tensorflow_macos" von einem Mac mit einer Intel-Architektur auf einen Mac mit einer ARM-basierten Architektur hängen blieben, daher möchte ich dies aufzeichnen. [^ 2]

Ich bin spät dran, aber mein Name ist @ Forest1988. Dies ist das erste Mal, dass ich auf Qiita poste. Ich denke, dass es viele Teile gibt, die nicht erreicht werden können, aber ich wäre Ihnen dankbar, wenn Sie einen Blick darauf werfen und einige nützliche Teile finden könnten.

Es kann ein verschwenderischer Umweg aufgrund des Versuchs und Irrtums sein, oder es kann Fehler aufgrund meines Missverständnisses enthalten. Wenn Sie Fragen haben, wäre ich Ihnen sehr dankbar, wenn Sie darauf hinweisen könnten.

[^ 2]: In Bezug auf den Betrieb der Intel-Architektur auf einem Mac, Qiita-Artikel "Apple scheint Tensorflow für Mac ausgegeben zu haben, daher werde ich ihn auf Intel MacBook Air installieren" (https://qiita.com/notfolder/items) / b27cc00bd77eb1587832), die ich als Referenz verwendet habe. Vielen Dank.

Umgebung

Aufgrund der Migration der Umgebung gibt es einige Änderungen gegenüber dem Ausgangszustand von macOS 11 (Big Sur) (zum Beispiel ist die Shell des Terminals nicht zsh, sondern die vor macOS Catalina verwendete Bash). ..

Daher unterscheiden sich diejenigen, die Big Sur mit M1 in einem sauberen Zustand ohne Datenmigration verwenden, diejenigen, die von einem Windows-Computer migrieren usw. und diejenigen, die überhaupt eine völlig andere Umgebung erstellt haben. Bitte beachten Sie, dass es eine gute Chance gibt, dass unterschiedliche Ergebnisse erzielt werden, wenn Sie dasselbe tun.

Versuchen Sie zuerst und scheitern Sie

Ich konnte die Python-Umgebung, die ich mit MacBook Pro erstellt habe, so kopieren, wie sie ist, und habe zuerst versucht, sie auszuführen. Insbesondere befindet es sich in dem Zustand, in dem anaconda3-2020.07 in pyenv installiert wurde. Die Python-Version war 3.8.3.

Folgen Sie dem Link und laden Sie tensorflow_macos-0.1alpha0.tar.gz unter https://github.com/apple/tensorflow_macos/releases herunter.

Das GitHub-Repository enthält Skripte zum Herunterladen und Installieren, aber diese komprimierte Datei vor der Veröffentlichung enthält optimierten TensorFlow usw. (der per Skript heruntergeladen werden kann), sodass sie ungefähr 331,6 MB groß ist. Es ist geworden.

Erstellen Sie zunächst eine virtuelle Umgebung für "tensorflow_macos" mit venv in Python 3.8.

Ich hatte Angst, dass das Hinzufügen von mehr Venv zu Pyenvs Anakonda es seltsam machen würde ... aber ich beschloss, es zu versuchen (wie ich später erklären werde, war es vorher ein Problem).

$ /bin/bash install_venv.sh --prompt --python /path/to/anaconda3-2020.7/bin/python

Ich lief und fuhr mit den Standardeinstellungen für die Eingabeaufforderungen auf dem Weg fort. [^ 3] Ein tensorflow_macos_venv-Verzeichnis wird an dem an der Eingabeaufforderung angegebenen Speicherort erstellt, und Sie können die erstellte virtuelle Umgebung mit / bin / enable hier aufrufen. [^ 4]

[^ 3]: zsh sollte die Standardeinstellung von macOS Catalina sein, daher bin ich gespannt, ob es einen Grund gibt, es zu wagen, bash zu verwenden.

[^ 4]: Der Hostname und der Benutzername, die in der Einstellung von "$ PS1" angezeigt werden können, werden durch "primary_prompt_string" ersetzt, und die Stelle, an der tensorflow_macos_venv platziert wird, wird durch "/ path / to /" ersetzt. Wir hoffen, dass Sie es entsprechend Ihrer eigenen Umgebung lesen. Speziell für die ersteren habe ich auf den folgenden Artikel verwiesen. Vielen Dank: "Passen Sie die Ausgabe vor $ im [Mac] -Terminal an" (https://www.yoheim.net/blog.php?q=20140309), "Überprüfen Sie die Eingabeaufforderungen --Pocketstudio.jp Linux und legen Sie sie fest Wiki "(http://pocketstudio.jp/linux/?%A5%D7%A5%ED%A5%F3%A5%D7%A5%C8%A4%CE%B3%CE%C7%A7%A4%E4" % C0% DF% C4% EA)

$ . /path/to/tensorflow_macos_venv/bin/activate
(tensorflow_macos_venv) (base) primary_prompt_string$ python
Python 3.8.3 (default, Jul  2 2020, 11:26:31)
[Clang 10.0.0 ] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.

Die README.md im tensorflow_macos-Repository enthält ein Code-Snippet zur Auswahl der CPU und der GPU. Daher habe ich beschlossen, es zuerst auszuprobieren. Hat.

# Import mlcompute module to use the optional set_mlc_device API for device selection with ML Compute.
from tensorflow.python.compiler.mlcompute import mlcompute

Versuchen wir dies mit Python, das zuvor im interaktiven Modus gestartet wurde.

>>> # Import mlcompute module to use the optional set_mlc_device API for device selection with ML Compute.
>>> from tensorflow.python.compiler.mlcompute import mlcompute
Traceback (most recent call last):
  File "/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/pywrap_tensorflow.py", line 64, in <module>
    from tensorflow.python._pywrap_tensorflow_internal import *
ImportError: dlopen(/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so, 6): no suitable image found.  Did find:
	/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so: mach-o, but wrong architecture
	/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so: mach-o, but wrong architecture

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/__init__.py", line 41, in <module>
    from tensorflow.python.tools import module_util as _module_util
  File "/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/__init__.py", line 39, in <module>
    from tensorflow.python import pywrap_tensorflow as _pywrap_tensorflow
  File "/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/pywrap_tensorflow.py", line 83, in <module>
    raise ImportError(msg)
ImportError: Traceback (most recent call last):
  File "/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/pywrap_tensorflow.py", line 64, in <module>
    from tensorflow.python._pywrap_tensorflow_internal import *
ImportError: dlopen(/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so, 6): no suitable image found.  Did find:
	/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so: mach-o, but wrong architecture
	/path/to/tensorflow_macos_venv/lib/python3.8/site-packages/tensorflow/python/_pywrap_tensorflow_internal.so: mach-o, but wrong architecture


Failed to load the native TensorFlow runtime.

See https://www.tensorflow.org/install/errors

for some common reasons and solutions.  Include the entire stack trace
above this error message when asking for help.

Vor diesem Hintergrund habe ich mich für die andere Installationsmethode entschieden. Siehe INSTALLATION-Element in README.md des Repositorys Ich habe das folgende Skript ausgeführt.

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/apple/tensorflow_macos/master/scripts/download_and_install.sh)"

Der gleiche Fehler trat erneut auf, und ich überprüfte die Fehlermeldung erneut und bemerkte den Ort mit der Bezeichnung "falsche Architektur".

Ich vermutete, dass die Ursache darin bestand, dass die von mir verwendete Anakonda mit der Intel-Architektur x86-64 kompatibel war, und entschied mich daher, die Python-Umgebung neu zu organisieren.

Python mit Homebrew installieren (was zu einem Umweg führt)

Zuerst habe ich die PATH-Einstellungen für pyenv und anaconda aus ~ / .bash_profile entfernt und das Terminal neu gestartet. Sie sollten sich nicht mehr auf pyenv beziehen, eine Anakonda, die Sie vom Quellcomputer kopiert haben.

Als ich danach versuchte, Python mit Homebrew, das bereits enthalten war, neu zu installieren, trat der folgende Fehler auf.

Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)!
Please create a new installation in /opt/homebrew using one of the
"Alternative Installs" from:
  https://docs.brew.sh/Installation
You can migrate your previously installed formula list with:
  brew bundle dump

Lesen Sie "Alternative javax" und installieren Sie Homebrew wie folgt neu:

$ mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew
$ mv homebrew/ /opt/

Fügen Sie Folgendes zu ~ / .bashrc und hinzu

export PATH=/opt/homebrew/bin/:$PATH

Reflektiere mit source.

$ source ~/.bashrc

Verwenden Sie als Nächstes "Brew Bundle Dump", um eine Liste der installierten Pakete zu erstellen. [^ 5]

[^ 5]: Da dies mit bereits installiertem Homebrew erforderlich ist, wäre es meiner Meinung nach besser gewesen, es vor der Installation eines neuen Homebrew auszuführen, ohne den vollständigen Pfad angeben zu müssen.

$ /usr/local/Homebrew/bin/brew bundle dump

Als Ergebnis wurde die folgende Datei als "Brewfile" generiert.

tap "cartr/qt4"
tap "homebrew/bundle"
...
<Abkürzung>
...
tap "sanemat/font"
brew "automake"
brew "[email protected]"
brew "[email protected]"
...
<Abkürzung>
...
brew "sanemat/font/ricty"

Dies spiegelt sich wie folgt wider.

$ brew tap Homebrew/bundle
$ touch Brewfile
$ brew bundle --file Brewfile

Ich erhielt jedoch die folgende Warnung und konnte einige Pakete nicht installieren.

Warning: You are running macOS on a arm64 CPU architecture.
We do not provide support for this (yet).
Reinstall Homebrew under Rosetta 2 until we support it.
You will encounter build failures with some formulae.
Please create pull requests instead of asking for help on Homebrew's GitHub,
Twitter or any other official channels. You are responsible for resolving
any issues you experience while you are running this
unsupported configuration.

Ich konnte Python einfügen, aber es hat wahrscheinlich das gleiche Problem wie zuvor verursacht, also werde ich es deinstallieren und weitermachen.

Versuchen Sie System Python

ANFORDERUNGEN beschreibt die Verwendung der Xcode-Befehlszeilentools.

$ xcode-select --install

Ich habe die Xcode Command Line Tools in eingegeben. [^ 6] Ich habe mich gefragt, ob dies das Python-Problem lösen würde ... aber möglicherweise funktioniert Python 3.9 aufgrund der Umgebungsmigration aus irgendeinem Grund. Damit war ich ungeduldig, dass tensorflow_macos, für das Python 3.8 erforderlich ist, nicht funktionieren würde ... aber es gab zwei Ursachen.

Anscheinend war eine der Ursachen, dass der von Homebrew installierte Python nicht erfolgreich deinstalliert werden konnte. Als ich mit which python nachgesehen habe, wurde auf / opt / homebrew / bin // python3 verwiesen. [^ 7] Selbst ab dem Datum, an dem es ausgeführt wird, scheint es das zum Zeitpunkt der obigen Installation zu sein.

Wenn Sie versuchen, es erneut zu deinstallieren,

$ brew uninstall python3
Error: Refusing to uninstall /opt/homebrew/Cellar/[email protected]/3.9.0_2
because it is required by itstool, libxml2 and sphinx-doc, which are currently installed.
You can override this and force removal with:
  brew uninstall --ignore-dependencies python3

Der Fehler wird angezeigt. Befolgen Sie diese Anweisungen, um das Programm zu deinstallieren.

$ brew uninstall --ignore-dependencies python3
Uninstalling /opt/homebrew/Cellar/[email protected]/3.9.0_2... (9,224 files, 137.5MB)

Nun, "welcher Python3" zeigt auf "/ usr / local / bin / python3".

Dies ist jedoch auch Python 3.9.0.

$ /usr/local/bin/python3
Python 3.9.0 (default, Nov  4 2020, 22:18:28)
[Clang 12.0.0 (clang-1200.0.32.21)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

Rückblickend auf die Homebrew-Warnung:

Error: Cannot install in Homebrew on ARM processor in Intel default prefix (/usr/local)!

Wurde geschrieben. Früher habe ich es verwendet, ohne im Detail nachzudenken, aber die Tatsache, dass / usr / local Intels Standardpräfix ist und keinen ARM-Prozessor unterstützt, bedeutet dies Woher kommt die Python in diesem / usr / local / bin?

Möglicherweise bleibt der Python erhalten, der vor der Umgebungsmigration in Homebrew installiert wurde. Versuchen Sie daher, mit Homebrew zu deinstallieren, das vor der Migration installiert wurde.

$ /usr/local/Homebrew/bin/brew uninstall python3

Ich erhalte den gleichen Abhängigkeitsfehler wie zuvor. Fügen Sie also "--ignore-dependencies" hinzu und versuchen Sie es erneut.

$ /usr/local/Homebrew/bin/brew uninstall --ignore-dependencies python3

Diesmal war die Deinstallation erfolgreich und "welches python3" zeigt jetzt auf "/ usr / bin / python3".

$ which python3
/usr/bin/python3
$ python3
Python 3.8.2 (default, Oct  2 2020, 10:45:41)
[Clang 12.0.0 (clang-1200.0.32.27)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>

Jetzt sind Sie endlich bereit für Ihre Python-Umgebung!

[^ 6]: Informationen zur Installation der Xcode-Befehlszeilentools finden Sie im Qiita-Artikel: "Installieren von Python3 mit Xcode auf einem Mac" (https://qiita.com/todotani/items/73877deea8773c316694). Es war. Vielen Dank.

[^ 7]: Das "//" ist kein Tippfehler, es wurde tatsächlich als solches angezeigt. Es scheint, dass es nicht gut war, / nach bin in export PATH = / opt / homebrew / bin /: $ PATH hinzuzufügen.

Führen Sie erneut gemäß README aus

$ /bin/bash install_venv.sh --prompt --python=/usr/bin/python3

Ich konnte es ohne Probleme ordentlich installieren.

$ . "/path/to/tensorflow_macos_venv/bin/activate"
(tensorflow_macos_venv) primary_prompt_string$ which python
/path/to/tensorflow_macos_venv/bin/python
(tensorflow_macos_venv) primary_prompt_string$ python
Python 3.8.2 (default, Oct  2 2020, 10:45:41)
[Clang 12.0.0 (clang-1200.0.32.27)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> # Import mlcompute module to use the optional set_mlc_device API for device selection with ML Compute.
>>> from tensorflow.python.compiler.mlcompute import mlcompute
>>>

Diesmal konnte ich fehlerfrei importieren! Aber was ist mit der CPU- und GPU-Auslastung?

>>> # Select CPU device.
>>> mlcompute.set_mlc_device(device_name='cpu')
>>> # Select GPU device.
>>> mlcompute.set_mlc_device(device_name='gpu')
WARNING:tensorflow:Eager mode on GPU is extremely slow. Consider to use CPU instead

Es gibt eine Warnung bezüglich der GPU, aber es scheint gut zu denken, dass es möglich ist, vorerst CPU und GPU anzugeben.

Da der "Eager-Modus auf der GPU extrem langsam ist", wird davon ausgegangen, dass er im Define-and-Run-Modus der TensorFlow 1-Serie anstelle des Eager-Modus (Define-by-Run) ausgeführt wird, der in TensorFlow 2.0 der Standard ist. Ist es?

Wenn Sie sich README.md im Repository noch einmal ansehen, heißt es: "Bitte beachten Sie, dass ML Compute im Eifrig-Modus die CPU verwendet."

Um den wahren Wert von "Mac-optimierten TensorFlow- und TensorFlow-Addons" zu testen, muss Code vorhanden sein, der sich nicht im Eager-Modus befindet.

Zusammenfassung

Mit dem Ziel, "Mac-optimierte TensorFlow- und TensorFlow-Addons" (https://github.com/apple/tensorflow_macos) auf MacBook Air mit M1 auszuführen Hier finden Sie eine Zusammenfassung der Teile, die beim Erstellen der Python-Umgebung beim Migrieren von Daten von einem Mac mit einem Intel-Prozessor auf einen Mac mit einem M1 erfasst wurden.

Unter dem Strich müssen Sie die Python-Umgebung, die Sie in der Quellumgebung erstellt haben, löschen oder neu konfigurieren, damit nicht auf sie verwiesen wird. Da die Architektur anders ist, ist es natürlich, darüber nachzudenken, aber ich habe mich gefragt, ob ich die Umgebung, die ich an der Migrationsquelle erstellt habe, so weit wie möglich nutzen kann, sodass ich es unerwartet schwer hatte.

Homebrew unterstützt derzeit möglicherweise keine ARM-basierten Architekturen, aber angesichts der Notation "Wir bieten (noch) keine Unterstützung dafür." Ist dies eine Zukunft. Ich denke, dass es gelöst wird. Es wird erwartet, dass die M1-Unterstützung auch für andere Software gefördert wird. Daher wird erwartet, dass der Übergang von Macs mit Intel-Prozessoren zu Macs mit M1 immer einfacher wird. Dieser Artikel ist nur eine Aufzeichnung der Versuche in der Situation zum 24. November 2020, und die Situation könnte sich in naher Zukunft (möglicherweise sogar heute) ändern.

Erstens ist tensorflow_macos auch eine Vorabversion, und ich würde mich darauf freuen, wie die offizielle Release-Version aussehen wird.

(das ist alles)

Recommended Posts

Tipps zum Importieren von macOS-optimiertem TensorFlow in eine Apple M1-Chipumgebung
Verwenden Sie Tensorflow in einer wurzellosen Umgebung
Erstellen Sie mit Python eine interaktive Umgebung für maschinelles Lernen
Erstellen Sie mit AirtestIDE eine Umgebung für die Testautomatisierung (Tipps)
Tipps zur Verwendung von Selen und Headless Chrome in einer CUI-Umgebung
Installieren Sie Tensorflow in einer anaconda + python3.5-Umgebung
Python3 TensorFlow für Mac-Umgebungskonstruktion
Errichtete eine Umgebung für Anaconda & Jupyter