身近な環境で tf.Session() を実行するのがやたら時間がかかる事象があり、それに対応したメモです。
おそい
例えば ipython で以下のように Session を作ろうとすると
In [1]: import tensorflow as tf
In [2]: session = tf.Session()
2017-12-12 15:41:48.870629: I tensorflow/core/platform/cpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: SSE4.1 SSE4.2 AVX AVX2 FMA
ここで異常に待たされます。1分くらい。
環境
GeForce GTX 1080 が刺さった Linux マシンです。
OS は Ubuntu 16 です。
以前適当に CUDA 等入れてしまい、 CUDA9, cuDNN7 がインストールされた状態で、更に tensorflow1.4 用に CUDA8, cuDNN6 を追加で入れた環境です。
(2017/12 現在最新の pip で入る tensorflow1.4 は CUDA9, cuDNN7 には対応していない)
% nvidia-smi
Tue Dec 12 17:51:05 2017
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 387.26 Driver Version: 387.26 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
|===============================+======================+======================|
| 0 GeForce GTX 1080 Off | 00000000:01:00.0 On | N/A |
| 27% 27C P8 6W / 180W | 61MiB / 8112MiB | 0% Default |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 992 G /usr/lib/xorg/Xorg 59MiB |
+-----------------------------------------------------------------------------+
対応
上の環境にある通り、 CUDA/cuDNN のバージョンが複数(しかも必要なバージョンより新しいものが入っている)状態なのが悪いんじゃないの?とあたりを付けて CUDA/cuDNN をそれぞれ CUDA8, cuDNN6 のみを入れ直したら治った次第です。
既存の CUDA/cuDNN の削除
CUDA の削除
# パッケージ一覧から cuda 系を取得
dpkg -l | grep cuda
# cuda-***-8 と cuda-***-9 が混在しているのを確認
# cuda を削除・再インストール
sudo apt-get remove cuda
# cuda 等を入れるために自動的に入った依存ライブラリ(もう使われてない)を削除
sudo apt-get autoremove
# 消えたか確認
dpkg -l
cuDNN の削除
ls /usr/local/ | grep cuda
# cuda-*** を削除
sudo rm -fr /usr/local/cuda-9.0/
再インストール
# cuda 関係のライブラリ一覧を探す
# 多分 cuda-8-0 とか cuda-9-0 とかがあるはず。
apt-cache search cuda
# お好みのバージョンを入れる
sudo apt-get install cuda-8-0
# cuDNN を入れなおす
# https://developer.nvidia.com/rdp/cudnn-download からダウンロードして cudnn.tgz で保存しておく
tar xvzf cudnn.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*
何が原因かというのははっきりわかりませんが、私の環境ではこれで tf.Session() が普通の速度で動くようになりました。