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(ロング・タームサポート 長期サポート版)の中で一番新し気だから。
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です)
途中で一度、再起動が入ります。
再起動は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で機械学習