目的は「TensorFlow最新(0.12.1)をGPUで動かしたい!」
初学者がPython3でTensorFlowをGPU(Ubuntu)使って
開発環境を整えるには少しハードルが高いように思いますが、なんとか動かせるまでには
なったので備忘録としたいと思います。
(すぐにふるくなるかもしれないけど。)
手元の環境
・BTOパソコン(mouce)Windows10proをデュアルブートでUbuntu16.04導入
・core i7
・メモリ16G
・HDD500(ubuntuへ200G程度)
・NVIDIA GForce1080(パソコン工房にて購入したものを後付)
以上のような環境からスタートしました。
※ビデオカードが8万程度かけたのでどうしても使える環境にしたかった。
Windows10をデュアルブートでUbuntu16.04
こちらについては自分の理解力のなさとから20回くらいは再インストールを繰り返してしまったが、
それほど、難しい内容ではないかと思います。
俺とプログラミング
このサイトがとてもわかり易くて完全にそのままやって導入できました。
※BIOSメニューへの入り方がわからず、僕の環境だとF2ではなくDeleteボタンで入れました。
方法が、いろいろあるみたい。
-
後で分かったことなんだけど、BIOSメニューで”SecureBoot”を無効にしておかないと死ぬほど
NVIDIAドライバがインストールしてくれないので、ここを参考に設定する
Windows8.1とSecureBootとBIOSと私
一応、残しておくと 僕のBIOSメニューでは”拡張機能”なる名目の中にWindows8/8.1メニューがあり
その中にSecure boot なんたらがありましたので無効にしておきました。
なお、Ubuntuインスール時に サードパーティーをセキュリティする?だったかな、そんな設定を促される
場面がありましたが、その部分でもチェックしないでおいたらNVIDIAドライバがすんなり入りました。
(ここが一番たどり着くまでに時間がかかった場所)
このサイトにヒントがあった
Ubuntu日本語フォーラム
BIOSメニューが終わるといよいよインスールするんだけど、installボタン押しても真っ暗?!になる
nVidiaのGPU搭載PCにUbuntuを入れようとしてハマった
インストールオプションが出たら、Try install Ubuntuにカーソルをあわせ、eキーを押す
以下のように変更
quiet splash を nomodeset に書き換える
以上でとりあえず入れる
だけどその後の事を考えてインストールが完了したあとに、UbuntuのGUI画面でターミナルを起動して以下(事前に sudo apt-get install vim や sudo chmod 777 /etc/default/grub)
/etc/default/grubを書き換える
変更の適用には、 sudo update-grub
さらに、ディスプレイの解像度がおかしな挙動をしていたので続きに紹介されていた以下も
Ubuntu起動画面(splash画面)が崩れてしまうときは
/etc/default/grubへ
GRUB_GFXPAYLOAD_LINUX=1920×1080-64 (僕の場合64bitにしてみたら綺麗だった)
次に、/etc/initramfs-tools/conf.d/splashというファイルを編集する。ここにはただ1行、
FRAMEBUFFER=y
とだけ書く。
以下のコマンドを実行して、initramfsへの変更を有効にする。
sudo update-initramfs -u -k all
以下のコマンドを実行して、grubへの変更を有効にする。
sudo update-grub
これでとりあえずUbuntuだけなら使える環境になった。
あとでこまりそうだったのでターミナルの日本語フォルダを変更しておいた
Ubuntuでホームディレクトリの中身を英語にする
NVIDIAドライバ CUDA cuDNNのインストール
この部分は何度も何度も繰り返して嫌になったけど、できたので結果うれしいよーーーこちらのサイト様様。
GTX-1080でTensorFlow
順番として
- gccのバージョンが古かったので sudo apt-get upgrade
- 最初から入っている nvidia ドライバを無効に(これ重要かも)
- NVIDIAドライバのインストール
- CUDAのインストール
- 再度、NVIDIAドライバのインストール
- cuDNNのインストール
- CUDAとcuDNNのパスを通す
6. sudo apt install nvidia-cuda-toolkit(cudaツールキットをインストール)
※cuda-toolkitコマンドは7.5を入れてしまい余計な作業だった(._.)
7. もう一度 CUDAのインストール(再度新しいものに) - 確認
1. gccのバージョンが古かったので sudo apt-get upgrade
$ sudo apt-get upgrade
$ gcc --version (5.4を確認)
そのままだけど、初期状態だとgccが少し古かったのでとりあえず、upgrade
2. 最初から入っている nvidia ドライバを無効に(これ重要かも)
こちらのサイトに助けてもらった
Ubuntu16.04 + GTX965m + CUDA8.0
Nouveau というオープンソースの nvidia ドライバを無効に
sudo gedit /etc/modprobe.d/blacklist-nouveau.conf
以下を記載
blacklist nouveau
options nouveau modeset=0
次回起動時に反映するよう設定
sudo update-initramfs -u
3. NVIDIAドライバのインストール
GTX-1080 など GeForce を Ubuntu 16.04 LTS で CUDA-8.0RC と共に使うGTX-1080より
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt-get update
$ sudo apt-get install nvidia-367 (最新が375だったけどとりあえず367に)
$ sudo apt-get install mesa-common-dev
$ sudo apt-get install freeglut3-dev
4. CUDAのインストール
5. 再度、NVIDIAドライバのインストール
最初に紹介したGTX-1080でTensorFlowより
CUDAをインストールしたらGUIでログインできなくなった(どうやらドライバのせいらしい)ので再インストールする
$ sudo apt-get install nvidia-367 --reinstall
$ sudo reboot
6. cuDNNのインストール
最初に紹介したGTX-1080でTensorFlowより
https://developer.nvidia.com/cudnn
ここのDownloadをクリック
cuDNN Download Survey はスルーしてページ下部の Proceed To Downloads をクリック
I Agree To.. にチェックして
Download cuDNN v5.1 (August 10, 2016), for CUDA 8.0 の中の
cuDNN v5.1 Library for Linux をクリックしてダウンロードする
※ダウンロードしたフォルダへ移動して
$ tar xvzf cudnn-8.0-linux-x64-v5.0-ga.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*
5. CUDAとcuDNNのパスを通す
最初に紹介したGTX-1080でTensorFlowより
$ echo 'export CUDA_ROOT=/usr/local/cuda' >> ~/.bash_profile
$ echo 'export PATH=/usr/local/cuda/bin:$PATH' >> ~/.bash_profile
$ echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:/usr/local/cuda/lib:$LD_LIBRARY_PATH' >> ~/.bash_profile
$ echo 'export CPATH=/usr/local/cuda/include:$CPATH' >> ~/.bash_profile
パスを通すあたりいつもわかりにくいけど、こちらではすべて記載いただけて助かった。
## 6. sudo apt install nvidia-cuda-toolkit(cudaツールキットをインストール)
これはなにかというと
$ nvcc -V
とコマンドいれて、確認しようとしたら上記インストールをしろ!と言われたのでとりあえず
## 7. もう一度 CUDAのインストール(再度新しいものに)
先ほどの確認をしてみると
$ nvcc -V
7.5と表示されてcudaは8を最初インストールしたのにおかしいなと思いとりあえず再度インストールする
8. 確認
$ cat /proc/driver/nvidia/version
$ nvidia-smi
すべてエラーがひょうじされなければOK!最後の nvidia-smiでは表のようなものが表示されるよ
これで、とりあえずは完成。次にTensorFlow環境の構築
単純にしたかったので、Bazelのインストールはなしで公式サイト参照
そもそも、Bazelが必要な理由がわからなかったのと、とりあえず動かしたかったのと、こちらでも
ご紹介されている流れがシンプルでよかったので
[TensorFlow] TensorBoardを動作させたいときはpipでインストールする
順番
- Python3環境構築
- TensorFlow環境構築
1. Python3環境構築
こちらではpython3を紹介していたので良かった。
なお、virtualenvは
$ sudo pip install virtualenv で入れておいた。
pipなのでパス通すなどなくてよかった。
virtualenvはとても好き
2. TensorFlow環境構築
公式サイトDownload and Setup
以下必要な部分のみ抜粋
# Ubuntu/Linux 64-bit
$ sudo apt-get install python-pip python-dev
$ pip install tensorflow-gpu (2017/01/06現在だと0.12.1が入る)
# Ubuntu/Linux 64-bit, GPU enabled, Python 3.5
# Requires CUDA toolkit 8.0 and CuDNN v5. For other versions, see "Install from sources" below.
$ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.12.0-cp35-cp35m-linux_x86_64.whl
※上記exportは、 .bash_profile に記載した
# Python 3
$ sudo pip3 install --upgrade $TF_BINARY_URL
BINARY_URLと書いてあったので以下の通り
$ sudo pip3 install --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow-0.12.0-cp35-cp35m-linux_x86_64.whl
これでエラーもでなかったので行ける!と思い試したらtensorflowがpipにないのでおかしいなと思い
再起動
そうしたら、ちゃんとはいってた。
サンプルテストしてみる
~$ python3
Python 3.5.2 (default, Nov 17 2016, 17:05:23)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcublas.so locally
I tensorflow/stream_executor/dso_loader.cc:105] Couldn't open CUDA library libcudnn.so. LD_LIBRARY_PATH:
I tensorflow/stream_executor/cuda/cuda_dnn.cc:3448] Unable to load cuDNN DSO
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcufft.so locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:111] successfully opened CUDA library libcurand.so locally
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:925] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
I tensorflow/core/common_runtime/gpu/gpu_device.cc:951] Found device 0 with properties:
name: GeForce GTX 1080
major: 6 minor: 1 memoryClockRate (GHz) 1.7335
pciBusID 0000:01:00.0
Total memory: 7.92GiB
Free memory: 7.62GiB
I tensorflow/core/common_runtime/gpu/gpu_device.cc:972] DMA: 0
I tensorflow/core/common_runtime/gpu/gpu_device.cc:982] 0: Y
I tensorflow/core/common_runtime/gpu/gpu_device.cc:1041] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:01:00.0)
>>> print(sess.run(hello))
b'Hello, TensorFlow!'
>>> a = tf.constant(10)
>>> b = tf.constant(32)
>>> print(sess.run(a + b)
... )
42
>>>
サンプルで結果みたいだけだったのに、途中途中gpuがなんちゃらとか、I tensorflowだとかよくわからない
呪文がでてきたけど、気にしてはいない。多分うまく行っているはず!!