tensorflowのインストール方法 pip(Python)

tensorflowの最新版インストールの覚書。

WindowsにWSLで仮想的なubuntuの環境を作って、tensorflow2.xの最新版をインストールしてみます。

※最終的にこのページの方法ではtensorflow2でGPU利用ができません。GPU連携するためには、WSL2という実験的な機能を使う必要があるようです。

関連)待ってました CUDA on WSL 2 – Qiita

Windows10(Hyper-V仮想化)のUbuntu20.04LTSにtensorflow インストール

マシンはWindows10ですが、Windowsの仮想化機能で内部でUbuntu20.04LTSを動かします。

なんで20.04かというとLTS(ロング・タームサポート 長期サポート版)の中で一番新し気だから。

参考)WSLをインストールする – Qiita

tensorflow用のpython環境のバージョン

ubuntuのターミナルを使えるようになったら、次はpythonをインストール。あとのことを考えてpythonのバージョンを変えられるpyenvを使用。

関連)pyenv 複数バージョンのpython環境切り替えユーティリティ

試行錯誤の結果、実はコレが必要だったというモジュールをインストールしていきます。

sudo apt install libffi-devel

tensorflow時に以下のエラーを回避するために必要だったモジュール。

 from _ctypes import Union, Structure, Array
ModuleNotFoundError: No module named '_ctypes'

ケースによっては、pythonのインストール前に実行しないといけないこともあるみたいです。何も状況が変わらなかったらいったんpythonをアンインストールしてから、上記モジュールを入れ、再度pythonをアンインストール。

pythonをアンインストールする場合にもpyenvを使っていると割と簡単。以下の要領で消せます。

pyenv uninstall 3.7.10

tensorflow用のGPUモジュール(cuda関連)をインストール

GPUサポート用のモジュールをインストールしておかないと、実行時にこんなエラーが表示されます。cuda関連のライブラリがないとかそんな感じです。

2021-06-19 11:58:46.743240: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcudart.so.11.0'; dlerror: libcudart.so.11.0: cannot open shared object file: No such file or directory
2021-06-19 11:58:46.743806: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2021-06-19 11:58:48.306980: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2021-06-19 11:58:48.309282: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory
2021-06-19 11:58:48.309404: W tensorflow/stream_executor/cuda/cuda_driver.cc:326] failed call to cuInit: UNKNOWN ERROR (303)
2021-06-19 11:58:48.309504: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (DESKTOP-OJ06LK8): /proc/driver/nvidia/version does not exist
2021-06-19 11:58:52.087874: I tensorflow/core/platform/profile_utils/cpu_utils.cc:114] CPU Frequency: 3600000000 Hz

tensorflowの公式ページのGPUサポートを見ながら、そのまんま実行。今回はページの下のほうのUBUNTU 18.04LTSの部分を実行しました。(使ってる環境は20.04です)

参考)GPU サポート  |  TensorFlow

途中で一度、再起動が入ります。

再起動はubuntuのコマンドラインからは実行できない(仮想化環境だから?)ので、powershellから実行します。

$ sudo reboot

System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
Failed to talk to init daemon.

参考)WSL:WSL2でディストリビューションを再起動する方法 | もためも

コマンドプロンプトでpowershellを実行。以下の手順でubuntuが停止します。

PS C:Usersuser1> wsl -l -v
NAME STATE VERSION
bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk Ubuntu-20.04 Running 1
PS C:Usersuser1> wsl -t Ubuntu-20.04
PS C:Usersuser1> wsl -l -v
NAME STATE VERSION
bk copyimages.sh createexport.sh exportfile_from_input.sh font getimagefromblogdir.sh imagemojiire.py imagemojiire.sh imagemojiire.sh.org images importtxt maketitlefromh3.sh memo mizumashi_image.sh oldexport oldimages oldimport outputimages shuffle_image.sh title.txt title.txt.org wk Ubuntu-20.04 Stopped 1

ターミナル側ではこんなメッセージが出てきます。適当なキーを押すとターミナルは終了。

$ Linux 用 Windows サブシステム インスタンスが強制終了されました。
Press any key to continue...

停止後は、スタートメニューからubuntu20.04のターミナルを起動すればサーバが立ち上がったことになるみたいです。変な感覚。

tensorflowインストール時にモジュールがないとエラーになったものをインストールしておきます。

公式サイトによるとインストール方法をいくつかあるが、python用のインストールユーティリティpipを使ってインストールします。

まずは、tqdmというモジュール。

$ pip install tqdm
Collecting tqdm
Using cached tqdm-4.61.1-py2.py3-none-any.whl (75 kB)
Installing collected packages: tqdm
Successfully installed tqdm-4.61.1

 

pip install tensorflow

メッセージログが流れていきます。どうやら最新版は2.5のようです。

Collecting tensorflow
Using cached tensorflow-2.5.0-cp37-cp37m-manylinux2010_x86_64.whl (454.3 MB)
Collecting keras-nightly~=2.5.0.dev
Using cached keras_nightly-2.5.0.dev2021032900-py2.py3-none-any.whl (1.2 MB)
Collecting astunparse~=1.6.3
Using cached astunparse-1.6.3-py2.py3-none-any.whl (12 kB)  
 :
 :

tensorflowがインストールできない

tensorflowで、DataLossError Checksumがマッチしない?

tensorflowを使って実験していたら、以下のエラーが出力されて動かなくなってしまいました。

WSL2上でubuntu20.04を動かしている環境です。tensorflowのバージョンは2.5。

tensorflow.python.framework.errors_impl.DataLossError: TensorBundle at gpt2ja-medium/model-10410000 shard 0 (16777216 bytes): Checksum does not match: stored 3264626808 vs. calculated on the restored bytes 42285885
[[node save/RestoreV2 (defined at gpt2-generate.py:135) ]]

gpt-2という文章生成モデルを試していたのですが、何が引き金でこうなってしまったのかは謎。

エラーが出ているコード周辺では以下のような記述があり、チェックポイントから何らかのデータを復旧させようとして失敗しているようです。

 saver = tf.train.Saver()
ckpt = tf.train.latest_checkpoint(args.model)
saver.restore(sess, ckpt)

ネットで調べてみると、「CHECKPOINTファイルが壊れている。最新のCHECKPOINTファイルを削除して再試行せよ」という情報が。

たしかに、モデルのディレクトリにCHECKPOINTというファイルがありますが、タイムスタンプは更新されていません。

上のコードだけだと、保存されたCHECKPOINTから変数データを復旧しているだけでCHECKPOINTの新規書き込み等は行っていないはず。

どこのCHECKPOINTを参照しているのか…

WSL再起動で解決しました。

wslからubuntuをシャットダウン後、起動しなおしたらエラーが出なくなりました。具体的には、コマンドラインから以下を実行。

wsl --shutdown
wsl

一時的な情報がどこかに保存されていて、再起動でクリアされたという感じでしょうか。

関連記事)Pythonで機械学習