[PYTHON] Conseils pour l'importation de TensorFlow optimisé pour macOS dans un environnement de puce Apple M1

Aperçu

-Essai et erreur pour exécuter les "Addons TensorFlow et TensorFlow optimisés pour Mac" (https://github.com/apple/tensorflow_macos) avec MacBook Air avec M1 --Migrer votre environnement depuis MacBook Pro (début 2015) avec l'architecture Intel et rechercher des moyens de s'adapter à l'architecture ARM

Contexte

La nouvelle puce d'Apple "M1" dont les détails ont été publiés lors de l'événement Apple qui s'est tenu à partir de 03h00 le 11 novembre 2020, heure du Japon. Dans l'annonce, j'étais curieux car le nom du logiciel spécifique était "TensorFlow", mais après cela, "Mac-optimisé TensorFlow et TensorFlow Addons" (https: :) de l'organisation GitHub d'Apple. //github.com/apple/tensorflow_macos) a été publié. Il s'agit d'un pilote de pré-version qui utilise le framework ML Compute d'Apple.

Je pensais juste à le remplacer par MacBook Pro (début 2015), j'ai donc décidé d'acheter un MacBook Air avec une puce M1 et de l'expérimenter. [^ 1]

[^ 1]: C'était impressionnant que l'annonce et la réservation aient commencé le 11/11/2020 (JST), et j'ai également décidé de l'acheter. Si vous n'êtes pas doué pour les jeux, l'animation, etc. et que vous avez du temps libre, veuillez rechercher "Idol Master Hobby Programming Birthday". Je n'ai pas fait beaucoup de "développement" cette fois, mais j'ai été influencé par le "développement piloté par Imus" (référence: https://www.slideshare.net/treby/imas-driven-developemnt) à cet égard. On peut dire que

Il y avait des choses qui sont restées bloquées dans le déplacement de tensorflow_macos d'un Mac avec une architecture Intel vers un Mac avec une architecture basée sur ARM, donc j'aimerais en garder une trace. [^ 2]

Je suis en retard, mais je m'appelle @ forest1988. C'est la première fois que je poste sur Qiita. Je pense qu'il y a de nombreuses parties qui ne peuvent pas être atteintes, mais je vous serais reconnaissant de bien vouloir jeter un coup d'œil et de trouver des parties utiles en plus.

Il peut y avoir une partie qui est inutilement détournée parce que j'ai écrit le processus d'essais et d'erreurs, ou une erreur due à mon malentendu. Si vous avez des questions, je vous serais très reconnaissant de bien vouloir les signaler.

[^ 2]: Concernant le fonctionnement de l'architecture Intel sur Mac, l'article de Qiita "Apple semble avoir publié tensorflow pour mac, je vais donc l'installer sur le MacBook air d'Intel" (https://qiita.com/notfolder/items) / b27cc00bd77eb1587832), que j'ai utilisé comme référence. Merci.

environnement

En raison de la migration de l'environnement, il y a quelques changements par rapport à l'état initial de macOS 11 (Big Sur) (par exemple, le shell du terminal n'est pas zsh mais le bash utilisé avant macOS Catalina). ..

Par conséquent, ceux qui utilisent Big Sur avec M1 dans un état propre sans migrer de données, ceux qui migrent depuis une machine Windows, etc., et ceux qui ont créé un environnement complètement différent en premier lieu sont différents. Veuillez noter qu'il y a de fortes chances que des résultats différents soient obtenus si vous faites de même.

Essayez d'abord et échouez

J'ai pu copier l'environnement python que j'ai créé avec MacBook Pro tel quel, alors j'ai d'abord essayé de l'exécuter. Plus précisément, il se trouve dans l'état où anaconda3-2020.07 a été installé dans pyenv. La version Python était la 3.8.3.

Suivez le lien et téléchargez tensorflow_macos-0.1alpha0.tar.gz sur https://github.com/apple/tensorflow_macos/releases.

Le référentiel GitHub contient des scripts pour le téléchargement et l'installation, mais ce fichier compressé de pré-version contient TensorFlow optimisé, etc. (qui peut être téléchargé par script), donc sa taille est d'environ 331,6 Mo. Il est devenu.

Tout d'abord, créez un environnement virtuel pour tensorflow_macos en utilisant venv dans Python 3.8.

J'avais peur que l'ajout de plus de venv à l'anaconda de pyenv le rende étrange ... mais j'ai décidé de l'essayer (comme je l'expliquerai plus tard, c'était un problème avant cela).

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

J'ai couru et j'ai continué avec les paramètres par défaut pour les invites sur le chemin. [^ 3] Un répertoire tensorflow_macos_venv sera créé à l'emplacement spécifié à l'invite, et vous pouvez entrer dans l'environnement virtuel créé en utilisant / bin / activate ici. [^ 4]

[^ 3]: zsh devrait être la valeur par défaut de macOS Catalina, donc je suis curieux de savoir s'il y a une raison d'oser utiliser bash.

[^ 4]: Le nom d'hôte et le nom d'utilisateur qui peuvent être affichés dans la configuration de $ PS1 sont remplacés par primary_prompt_string, et l'endroit où tensorflow_macos_venv est placé est remplacé par/ path / to /. Nous espérons que vous le lirez en fonction de votre propre environnement. Surtout pour le premier, je me suis référé à l'article suivant. Merci: "Personnalisez la sortie avant $ dans le terminal [Mac]" (https://www.yoheim.net/blog.php?q=20140309), "Vérifiez et définissez les invites --Pocketstudio.jp Linux 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.

Le README.md dans le référentiel tensorflow_macos contient un extrait de code pour choisir le CPU et le GPU, j'ai donc décidé de l'essayer en premier. Fait.

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

Essayons cela avec python, qui a été lancé plus tôt en mode interactif.

>>> # 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.

Dans cet esprit, j'ai décidé d'essayer l'autre méthode d'installation. Voir Élément INSTALLATION dans README.md du référentiel J'ai exécuté le script suivant.

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

La même erreur s'est reproduite, j'ai vérifié à nouveau le message d'erreur et j'ai remarqué l'endroit appelé «mauvaise architecture».

Je soupçonnais que la cause était que l'anaconda que j'utilisais était compatible avec l'architecture Intel x86-64, j'ai donc décidé de réorganiser l'environnement Python.

Installation de Python avec Homebrew (entraînant un détour)

Tout d'abord, j'ai supprimé les paramètres PATH pour pyenv et anaconda de ~ / .bash_profile et redémarré le terminal. Vous ne devriez plus vous référer à pyenv, anaconda que vous avez copié depuis la machine source.

Après cela, lorsque j'ai essayé de réinstaller Python avec Homebrew qui était déjà inclus, j'ai rencontré l'erreur suivante.

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

Lisez "Alternative javax" et réinstallez Homebrew comme suit:

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

Ajoutez ce qui suit à ~ / .bashrc et

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

Réfléchissez en utilisant source.

$ source ~/.bashrc

Ensuite, utilisez brew bundle dump pour créer une liste des packages installés. [^ 5]

[^ 5]: Puisqu'il faut le faire avec Homebrew qui a déjà été installé, je pense qu'il aurait été préférable de l'exécuter avant d'installer un nouveau Homebrew sans avoir à spécifier le chemin complet.

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

En conséquence, le fichier suivant a été généré en tant que «Brewfile».

tap "cartr/qt4"
tap "homebrew/bundle"
...
<Abréviation>
...
tap "sanemat/font"
brew "automake"
brew "[email protected]"
brew "[email protected]"
...
<Abréviation>
...
brew "sanemat/font/ricty"

Cela se reflète comme suit.

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

Cependant, j'ai reçu l'avertissement suivant et j'ai échoué à installer certains packages.

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.

J'ai pu mettre en Python, mais il était susceptible de causer le même problème qu'avant, donc je vais le désinstaller et continuer.

Essayez System Python

EXIGENCES décrit l'utilisation des outils de ligne de commande Xcode.

$ xcode-select --install

J'ai mis dans les outils de ligne de commande Xcode. [^ 6] Je me suis demandé si cela résoudrait le problème de Python ... mais peut-être à cause de la migration de l'environnement, Python 3.9 fonctionne pour une raison quelconque. Avec cela, j'étais impatient que tensorflow_macos, qui nécessite Python 3.8, ne fonctionne pas ... mais il y avait deux causes.

Apparemment, l'une des causes était que le Python installé par Homebrew ne pouvait pas être désinstallé avec succès. Quand j'ai vérifié avec quel python, / opt / homebrew / bin // python3 était référencé. [^ 7] Même à partir de la date affichée lors de son exécution, il semble que ce soit celui au moment de l'installation ci-dessus.

Si vous essayez de le désinstaller à nouveau,

$ 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

Une erreur s'affichera. Suivez ces instructions pour désinstaller.

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

Maintenant, vers lequel python3 pointe / usr / local / bin / python3.

Cependant, c'est aussi 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.
>>> 

Maintenant, en regardant l'avertissement Homebrew,

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

Était écrit. J'avais l'habitude de l'utiliser sans réfléchir en détail, mais le fait que / usr / local soit le préfixe par défaut d'Intel et ne prend pas en charge le processeur ARM signifie que D'où vient le python dans ce / usr / local / bin?

Peut-être que le Python qui a été installé dans Homebrew avant la migration de l'environnement reste. Par conséquent, essayez de désinstaller à l'aide de Homebrew qui a été installé avant la migration.

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

J'obtiens la même erreur de dépendance qu'avant, alors ajoutez --ignore-dependencies et réessayez.

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

Cette fois, la désinstallation a réussi et quel python3 pointe maintenant / 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.
>>>

Maintenant, vous êtes enfin prêt pour votre environnement Python!

[^ 6]: Pour l'installation des outils de ligne de commande Xcode, veuillez vous référer à l'article Qiita: "Installer python3 avec Xcode sur Mac" (https://qiita.com/todotani/items/73877deea8773c316694). C'était. Merci.

[^ 7]: "//" n'est pas une faute de frappe, il était en fait affiché comme tel. Il semble qu'il n'était pas bon d'ajouter / après bin dans export PATH = / opt / homebrew / bin /: $ PATH.

Exécutez à nouveau selon README

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

J'ai pu l'installer proprement sans aucun problème.

$ . "/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
>>>

Cette fois, j'ai pu importer sans aucune erreur! Mais qu'en est-il de l'utilisation du processeur et du GPU?

>>> # 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

Il y a un avertissement concernant le GPU, mais il semble bon de penser qu'il est possible de spécifier le CPU et le GPU pour le moment.

Comme le mode Eager sur GPU est extrêmement lent, il est supposé qu'il sera exécuté dans TensorFlow série 1 Define-and-Run au lieu du mode Eager (Define-by-Run) qui est la valeur par défaut dans TensorFlow 2.0. C'est ça?

Si vous regardez à nouveau README.md dans le référentiel, il est dit «Veuillez noter qu'en mode impatient, ML Compute utilisera le CPU.» Donc, dans ce qui précède, il peut être basculé de force sur CPU avec Avertissement.

Pour tester la vraie valeur des "Addons TensorFlow et TensorFlow optimisés pour Mac", il semble nécessaire d'avoir du code qui n'est pas en mode Eager.

Sommaire

Dans le but d'exécuter des "Addons TensorFlow et TensorFlow optimisés pour Mac" (https://github.com/apple/tensorflow_macos) sur MacBook Air avec M1 Voici un résumé des parties qui ont été prises lors de la création de l'environnement Python lors de la migration de données d'un Mac avec un processeur Intel vers un Mac avec un M1.

L'essentiel est que vous devez effacer ou reconfigurer l'environnement Python que vous avez créé dans l'environnement source afin qu'il ne soit pas référencé. L'architecture étant différente, il est naturel d'y penser, mais je me demandais si je pouvais utiliser au maximum l'environnement que j'avais créé à la source de la migration, alors j'ai eu du mal de manière inattendue.

Homebrew peut ne pas prendre en charge actuellement les architectures basées sur ARM, mais c'est un futur, étant donné la notation «Nous ne fournissons pas (encore) de support pour cela.». Je pense que cela sera résolu. On s'attend à ce que le support M1 soit également promu pour d'autres logiciels, il est donc prévu que la transition d'un Mac avec un processeur Intel vers un Mac avec un M1 devienne de plus en plus facile. Cet article n'est qu'un récit des tentatives dans la situation au 24 novembre 2020, et la situation pourrait changer dans un proche avenir (peut-être même aujourd'hui).

En premier lieu, tensorflow_macos est également une pré-version, et j'aimerais avoir hâte de voir à quoi ressemblera la version officielle.

(c'est tout)

Recommended Posts

Conseils pour l'importation de TensorFlow optimisé pour macOS dans un environnement de puce Apple M1
Utilisez tensorflow dans un environnement sans racine
Créez un environnement interactif pour l'apprentissage automatique avec Python
Créez un environnement pour l'automatisation des tests avec AirtestIDE (Astuces)
Conseils d'utilisation de Selenium et Headless Chrome dans un environnement CUI
installer tensorflow dans un environnement anaconda + python3.5
Construction de l'environnement Python3 TensorFlow pour Mac
Création d'un environnement pour Anaconda et Jupyter