20201124のTensorFlowに関する記事は2件です。

Ubuntu18.04にCUDA10.1+cuDNN7.6.5+tensorflow-2.3.0をインストール

はじめに

本投稿ではubuntu18.04環境でNVIDIAのGPUドライバ、CUDA10.1、cuDNN7.6.5、tensorflow2.3.0をインストールします。
環境は以下の通りです。
GPU : GTX1060
OS : Ubuntu18.04
Python : 3.6.9

以下の参考手順は一例でありますの参考程度かつ自己責任でお願いいたします。
またエンジニアではありませんので一部読みにくい表記などがございますが、ご容赦ください。

機械学習のフレームワークについて

これまではtensorflow1.xx + kerasで学習を行っていましたが、tensorflow2についても興味があり、将来的なことも考えてtensorflow2に移行することにしました。
なお余談ですが使用中のGPUは将来的にはAmpere世代に交換予定です。Ampere世代ではCUDA11、cuDNN8が要求され、2020年11月時点ではtensorflow-nightly(2.4.0rc)で動作が確認されているとのことですが、正式版ではサポートはされていないようです。

TensorflowのバージョンとCUDA, cuDNNの依存関係

GPUを利用して学習を高速化する場合には、tensorflow、CUDA、cuDNNのバージョンに気を付けなければなりません。Tensorflowの公式サイトを参照します。下図のようにtensorflow2.3.0をインストールする場合、cuDNNは7.6、CUDAは10.1である必要があります。とくにCUDAは10.1以上ではなく、10.1である必要があることに注意します。
tensorflow_cuda_cudnn.PNG

NVIDIAのドライバインストール

参考文献

この項目は以下を参考にさせていただきました。
UbuntuにNVIDIA driverをインストール/再インストールする方法

・NVIDIAのドライバ、CUDAがインストールされている場合には下記のコマンドで削除します。

sudo apt --purge remove nvidia-*
sudo apt --purge remove cuda-*

・NVIDIAのGPUドライバは下記コマンドでaptを使ってインストールできます。
なお私の環境ではnouveauというubuntuデフォルトのドライバを無効化せずにインストール成功しました。
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
ubuntu-drivers devices
ここでコンソール上にインストール可能なバージョンのリストが出てきます。
2020年11月時点の私の環境ではnvidia-driver-455がrecommendでした。
sudo apt install nvidia-driver-<version>
(注:<version> の部分はコンソール上に表示されるバージョンを入力)

ドライバのインストールを確認

nvidia-smiと入力し下記のように指定したバージョンが表示されれば成功。

NVIDIA-SMI.PNG

CUDA10.1のインストール

NVIDIAのサイトよりCUDAのdebファイルをダウンロードします。
ダウンロードしたディレクトリに移動後下記のコマンドでインストールします。
最後のコマンドがポイントです!(理由は後述)

sudo dpkg -i cuda-repo-ubuntu1804-10-1-local-10.1.105-418.39_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-<version>/7fa2af80.pub
sudo apt-get update
sudo apt-get install cuda-toolkit-<version>

NVIDIA公式サイトでは sudo apt-get install cuda と記載されていますが、これをしてしまうとGPUドライバのバージョンが変わってしまいまい、意図しない環境になることがあります。

CUDAのPATHを通す

export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"

CUDAのインストールを確認

コンソール上で nvcc -V と入力し下記のように表示されればOKです。

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2019 NVIDIA Corporation
Built on Fri_Feb__8_19:08:17_PST_2019
Cuda compilation tools, release 10.1, V10.1.105

nvidia-smiとnvcc -Vで表示されるCUDAが違うが問題なし

CUDAにはランタイムとドライバAPIの二つのAPIがあるらしく、nvidia-sminvcc -Vで表示されるCUDAバージョンが違っても問題ないらしい。実際にこれらのバージョンを合わせようと思ってインストールを繰り返した経験もあるが、結局バージョンが違ってもtensorflowの使用などには問題ないとわかった。
(もし認識が違っていればご教示ください。)

cuDNNのインストール

ここまでうまくいっていれば、ほぼ終わったも同然です。
cuDNNはフリーでダウンロードできますが、NVIDIAのサイトにメンバー登録してからダウンロードします。
以前のcuDNNは Archived cuDNN Releases をクリックして探します。
今回はUbuntu18.04に対応したcuDNN7.6.5のRuntime Library、Developer Library、Code SamplesのDebファイルをダウンロードします。
CuDNN.png
ダウンロードしたディレクトリで下記を実行します。
sudo dpkg -i libcudnn7_7.6.5.32-1+cuda10.1_amd64.deb
sudo dpkg -i libcudnn7-dev_7.6.5.32-1+cuda10.1_amd64.deb
sudo dpkg -i libcudnn7-doc_7.6.5.32-1+cuda10.1_amd64.deb

cuDNNのテスト

コードサンプルの一つを実行し、エラーが出なければOKです。
cp -r /usr/src/cudnn_samples_v7/ $HOME
cd $HOME/cudnn_samples_v7/mnistCUDNN
make clean && make
./mnistCUDNN

Tensorflowのインストール

もう一息です。Tensorflow2ではpip3のupgradeが必要が必要です。
python3 -m pip install --upgrade pip
Tensorflowをインストールします。バージョンを指定しないと意図しないバージョンがインストールされてしまいます。部分を2.3.0などのバージョンに置き換えて入力してください。
python3 -m pip install tensorflow==<version>

python環境でtensorflowをimportできるか確認

import tensorflow as tf
tf.__version__
意図しているバージョンが表示されれば成功です。

おわりに

Ubuntu18.04でGtensorflowによるGPUを使用した学習ができる環境を構築しました。Ampere世代のRTX30シリーズに入れ替え後に本記事を再度アップデートしたいと思います。エンジニアが本業ではないので、至らない点が多い投稿ですが参考になれば幸いです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

macOS に最適化された TensorFlow を Apple M1 チップ 環境で import するまでの Tips

更新履歴

  • 2020/11/26 見出しの階層が誤っていたのを修正し、また、見出しの一部を変更しました。

概要

  • "Mac-optimized TensorFlow and TensorFlow Addons" (https://github.com/apple/tensorflow_macos) を MacBook Air with M1 で動かすための試行錯誤
  • Intel アーキテクチャの MacBook Pro (Early 2015) から環境を移行した上で、 ARM ベース アーキテクチャに合わせるための方法の模索
  • (Mac-optimized) TensorFlow の実行結果は含まず、ひとまず import するところまで

背景

日本時間の 2020/11/11 03:00 から行われた Apple Event で詳細が公開された、Apple の新型チップ「M1」。
発表の中で、具体的なソフトウェアの名称として「TensorFlow」の名前が挙がっていたので気になっていたのですが、その後、Apple の GitHub Organization から "Mac-optimized TensorFlow and TensorFlow Addons" (https://github.com/apple/tensorflow_macos) が公開されました。プレリリースのドライバーで、Apple の ML Compute framework を使っている、とのことです。

ちょうど MacBook Pro (Early 2015) からのリプレースを考えていたため、M1 チップの載った MacBook Air を購入し、いろいろと動作を試してみることにしました。1

tensorflow_macos を動かす上で、Intel アーキテクチャの Mac から ARM ベースのアーキテクチャの Mac への移行で引っかかるところがいくつかありましたので、記録として残せればと思います。2

申し遅れましたが、私は @forest1988 と申します。
Qiita への投稿は今回が初めてとなります。至らない部分が多々あるかと思いますが、ご笑覧いただき、その上で少しでもお役に立つ部分があれば嬉しく思います。

試行錯誤の過程を書いているために無駄に遠回りになっている部分や、私の勘違いから誤謬が含まれている可能性があります。
お気付きの点がありましたら、ご指摘をいただけますと大変幸いです。

環境

  • MacBook Air
    • Apple M1 チップ (8コアCPU, 8コアGPU)
    • macOS 11.0.1 (Big Sur)
  • MacBook Pro (Early 2015) から「移行アシスタント」によりデータ移行済み

環境を移行したことで、初期状態の macOS 11 (Big Sur) とは変わっているところがあります(たとえば、terminal の shell が zsh ではなく、macOS Catalina 以前から使っている bash のままになっているなど)。

そのため、データの移行などをせずにまっさらな状態で Big Sur with M1 を使われる方や、Windows マシンなどから移行される方、そもそも作っていた環境がまるで違う方とは、
同様に実行しても異なる結果になる可能性が十分にあることを予めお断りしておきます。

まず試して失敗したこと

MacBook Pro で作っていた python の環境がそのままコピーできていたため、まずはそれで動かすことを試みました。
具体的には、pyenv で anaconda3-2020.07 を入れていた状態です。 Python の version は 3.8.3 でした。

リンクを辿り、 https://github.com/apple/tensorflow_macos/releases にある tensorflow_macos-0.1alpha0.tar.gz をダウンロードしてきます。

GitHub のリポジトリにあるのはダウンロードとインストール用のスクリプトですが、このプレリリースの圧縮ファイルの中には(スクリプトでダウンロードできる)最適化された TensorFlow などが含まれているため、331.6MBほどのサイズになっています。

まずは、Python 3.8 の venv を使って tensorflow_macos 用の仮想環境を作ります。

pyenv の anaconda にさらに venv を重ねるとおかしくならないだろうか……という不安はあったのですが、とりあえず試してみることに(後述するように、それ以前の問題だったわけですが)。

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

を実行し、途中のプロンプトはデフォルト設定で進めました。3
プロンプトで指定した場所に tensorflow_macos_venv ディレクトリが作成され、ここにある /bin/activate を使うことで作られた仮想環境に入ることができます。4

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

tensorflow_macos のリポジトリ の README.md には、CPU と GPU を選択するためのコードスニペットが書かれているので、まずはこれを試してみることにしました。

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

これを、先ほど対話モードで立ち上げた python で試してみます。

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

それならばと思い、もう一方のインストール方法を試してみることにしました。
リポジトリの README.md の INSTALLATION の項目 を見て、
次のスクリプトを動かしました。

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

やはり同様のエラーが起き、ここで改めてエラーメッセージをしっかり確認して、 wrong architecture というところに目が留まりました。

使っていた anaconda が Intel のアーキテクチャである x86-64 対応のものであったのが原因なのではないか、と考え、 Python の環境を整え直すことにしました。

Homebrew での Python のインストール(今回はうまくいっていません)

まずは、 pyenvanaconda に関する PATH の設定を ~/.bash_profile から削除し、 terminal を再起動しました。これで、移行元のマシンからコピーした pyenv, anaconda を参照しなくなるはずです。

その上で、既に入っていた Homebrew で Python の入れ直しを試したところ、以下のエラーに遭遇しました。

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

"Alternative Installs" を読み、以下のように Homebrew を入れ直します。

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

~/.bashrc に以下を追記して、

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

source を使って反映します。

$ source ~/.bashrc

次に、brew bundle dump で install 済みの package の list を作ります。5

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

この結果、Brewfile として以下のようなファイルが生成されました。

tap "cartr/qt4"
tap "homebrew/bundle"
...
<略>
...
tap "sanemat/font"
brew "automake"
brew "python@3.9"
brew "python@3.8"
...
<略>
...
brew "sanemat/font/ricty"

これを以下のように反映します。

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

しかし、ここで以下のような warning が発生し、いくつかの package の install に失敗しました。

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.

Python を入れることはできていましたが、先と同様の問題を生じそうだったため、これはアンインストールして、次に進みます。

System の Python を試す

REQUIREMENTS に Xcode Command Line Tools の使用について書かれていたので、

$ xcode-select --install

で Xcode Command Line Tools を入れました。 6
これで Python の問題が解決する……かと思いきや、環境を移行した関係か、なぜか Python 3.9 が動いてしまいます。
これでは、Python 3.8 を要件とする tensorflow_macos は動かない……と焦ったのですが、これには二つの原因がありました。

  • Homebrew でのアンインストールに失敗していた。
  • 環境移行のためか、Python 3.9 が /usr/local/bin/python3 に残っていた。

どうやら、原因の一つは、Homebrew で install した Python がうまくアンインストールできなかったことのようです。
which python で確認したところ、 /opt/homebrew/bin//python3 が参照されていました。 7
実行した際に表示される日付などから見ても、上述のインストール時のものと思われます。

再度アンインストールを試みると、

$ brew uninstall python3
Error: Refusing to uninstall /opt/homebrew/Cellar/python@3.9/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

と Error が出るので、この指示に従ってアンインストールを行います。

$ brew uninstall --ignore-dependencies python3
Uninstalling /opt/homebrew/Cellar/python@3.9/3.9.0_2... (9,224 files, 137.5MB)

これで、 which python3/usr/local/bin/python3 を指してくれるようになりました。

しかし、これも 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.
>>> 

ここで、 Homebrew の warning を思い返してみると、

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

と書いてありました。
これまでは特に詳しく考えずに使っていたのですが、/usr/local が Intel の default prefix であり、 ARM processor に対応していないということは、
この /usr/local/bin にある python はどこから来たものなのでしょうか?

おそらく、環境移行をする前に Homebrew で入れていた Python が残っているのではないか、と思われます。
そこで、移行前に入れてあった Homebrew を使ってアンインストールを試みます。

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

先と同様の依存関係のエラーが出るので、 --ignore-dependencies を付けて再度実行します。

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

今回はアンインストールに成功し、which python3/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.
>>>

これで、ようやく Python 環境の準備が整ったはずです!

再度、README に従って実行

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

何の問題もなく、すっきりとインストールできました。

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

今回はエラーなく import ができました!
では、 CPU と 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

GPU については Warning が出ていますが、ひとまず CPU と GPU の指定は可能だと考えて良さそうです。

Eager mode on GPU is extremely slow とのことで、 TensorFlow 2.0 で default になっている Eager mode (Define-by-Run) ではなく、TensorFlow 1系の Define-and-Run での実行が前提になっているのでしょうか。

改めてリポジトリの README.md を見ると Please note that in eager mode, ML Compute will use the CPU. と書かれていますので、上記では Warning と共に強制的に CPU に切り替わっている可能性があります。

"Mac-optimized TensorFlow and TensorFlow Addons" の真価を試すには、 Eager mode ではないコードを用意する必要がありそうです。

まとめ

"Mac-optimized TensorFlow and TensorFlow Addons" (https://github.com/apple/tensorflow_macos) を MacBook Air with M1 で動かすことを目標として、
Intel プロセッサ の Mac から M1 搭載の Mac にデータ移行をした場合の Python 環境構築で引っ掛かった部分についてまとめてみました。

詰まりどころとしては、移行元の環境で作っていた Python の環境を消去、ないしは参照しないように設定し直す必要があるところでしょうか。
アーキテクチャが違うので、考えてみれば当たり前のことなのですが、移行元でせっかく作っていた環境をなるべく利用できないか……と考えてしまったこともあり、思いのほか手こずってしまいました。

Homebrew が現時点で ARM ベース のアーキテクチャに対応していないということもありましたが、 We do not provide support for this (yet). という書き方をしていることからしても、これについては将来的に解消されるものではないかと思います。
その他のソフトウェアについても M1 対応が進んでいくものと思われますので、Intel プロセッサ搭載 Mac から M1 搭載 Mac への移行はどんどん楽になっていくものと期待されます。
この記事については、あくまで2020年11月24日現在の状況での試みを記録したものであり、近いうちに(もしかしたら今日のうちにでも)、状況の変化する可能性があります。

そもそも tensorflow_macos もプレリリースのものですし、正式リリース版がどのようなものになるのかを楽しみにしたいと思います。

(以上)


  1. 2020/11/11 (JST) に発表・予約開始された、というのが印象的で、購入に踏み切ったというのもあります。ゲーム・アニメ等が苦手ではない方で、お手すきのお時間がありましたら「アイドルマスター 趣味 プログラミング 誕生日」でご検索ください。今回は「開発」というほどのことはしておりませんが、こうした点で「アイマス駆動開発」(参考: https://www.slideshare.net/treby/imas-driven-developemnt ) の影響を受けたものと言えるかもしれません。 

  2. なお、 Intel アーキテクチャの Mac での動作については Qiita 記事「appleがmac用tensorflowを出したようなのでintelのMacBookairにインストールしてみる」(https://qiita.com/notfolder/items/b27cc00bd77eb1587832) があり、参考にさせていただきました。お礼申し上げます。 

  3. macOS Catalina からは zsh がデフォルトになっているはずなので、敢えて bash を使っているのに何か理由があるのかは興味があるところです。 

  4. $PS1 の設定で表示できるホスト名やユーザー名などは primary_prompt_string に、 tensorflow_macos_venv を置いた場所は /path/to/ で置き換えています。ご自身の環境に合わせて読み替えていただければと存じます。特に前者について、以下の記事を参考にさせていただきました。お礼申し上げます:「[Mac] ターミナルの$前の出力内容をカスタマイズする」(https://www.yoheim.net/blog.php?q=20140309) , 「プロンプトの確認や設定 - 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)  

  5. 既に入っていた Homebrew で行う必要があるので、新しい Homebrew を入れる前に実行したほうが、フルパス指定をする面倒がなくて良かったかと思います。 

  6. Xcode Command Line Tools のインストールについては Qiita 記事:「MacでXcodeと一緒にpython3をインストールする」(https://qiita.com/todotani/items/73877deea8773c316694) を参考にさせていただきました。お礼申し上げます。 

  7. "//" になっているのは誤記ではなく、実際にそのように表示されていました。 export PATH=/opt/homebrew/bin/:$PATH の際に、 bin の後に / を付けたのが良くなかったのだと思われます。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む