はじめに
機械学習系の環境を定期的に一から作りなおすことにしている
そこで得たノウハウを記録に残しておきたい
クリーンインストールした Linux でやっていく
ローカルマシンとして利用する想定
Linux Mint 18.3 Cinnamon 64-bit
Ubuntu 16.04 でもたぶん同じ方法でいけるはず
ただしデスクトップ環境としては、 Mint のほうがより安定していると感じた
MacでUbuntu 16.04ブータブルUSBの作成
http://blog-sk.com/mac/ubuntu_bootusb/
- i5-2500K
- GTX980
CUDA 関係
NVIDIA CUDA Installation Guide for Linux
http://docs.nvidia.com/cuda/cuda-installation-guide-linux/index.html
インストールには
- deb (apt-get)
- run
の2種類あるが、いろいろと楽な deb を使う
準備
TensorFlow はビルド済みのを導入するので、CUDA 系のバージョンをあらかじめ確認しておかなければいけない
トラブルの大半はバージョン関係の問題なので、ここが地味に大事
https://www.tensorflow.org/install/install_sources#tested_source_configurations
tensorflow-1.6/1.5 の両方に対応している CUDA 9, cuDNN 7 にする
CUDA Toolkit のページから Legacy Releases
https://developer.nvidia.com/cuda-toolkit-archive
ダウンロードして3行目までを実行
$ sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb
$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
$ sudo apt-get update
Driver (nvidia-390) をインストール
このタイミングでインストールしておかないと依存関係が解決されなかった(なぜだかよくわからないが)
再起動が必要
CUDA 9.0 をインストール
ちゃんとバージョンを指定する
指定しておかないと、最新版 9.1 が入ってややこしいことになる(とは言っても PATH の指定でどうとでもなるが)
$ sudo apt-get install cuda-9-0
CUDA インストール後
PATH 追加のとき、直接ファイルを編集せずに echo を使うなら、 $ をエスケープしないといけない
PATH 追加先は .profile(私の場合)
- ubuntu 系
- ローカルで使用
- .bash_login, .bash_profile がないことを確認
$ echo "export PATH=/usr/local/cuda-9.0/bin\${PATH:+:\${PATH}}" >> ~/.profile
$ source ~/.profile
$ sudo /usr/bin/nvidia-persistenced --verbose
$ sudo apt-get install g++ freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libglu1-mesa libglu1-mesa-dev
cuDNN 7.0 をインストール
アカウント作成とログインが必要
https://developer.nvidia.com/rdp/cudnn-download
- cuDNN v7.0.5 Runtime Library for Ubuntu16.04 (Deb)
- cuDNN v7.0.5 Developer Library for Ubuntu16.04 (Deb)
- cuDNN v7.0.5 Code Samples and User Guide for Ubuntu16.04 (Deb)
$ sudo dpkg -i *.deb
Python 一式 (Anaconda) インストール
- NumPy や Jupyter などをいちいちインストールするのが面倒
- 必要なら新たに仮想環境をつくれる
- トラブったらインストールフォルダごと消し去ればOK
Anaconda3 ダウンロード
https://www.anaconda.com/download/#linux
最近だと PATH は追加しないで、 conda activate/deactivate
を使うのが標準的
下の設定だと、 zsh を立ち上げたら自動的にデフォルトの仮想環境 (base) に入る
$ sh ./Anaconda3-5.1.0-Linux-x86_64.sh
$ echo ". /home/<username>/anaconda3/etc/profile.d/conda.sh" >> ~/.bashrc
$ echo ". /home/<username>/anaconda3/etc/profile.d/conda.sh" >> ~/.zshrc
$ echo "conda activate" >> ~/.zshrc
TensorFlow 1.6 インストール
Installing Tensorflow on Ubuntu
https://www.tensorflow.org/install/install_linux
面倒なのでデフォルトの仮想環境にインストールする
$ sudo apt-get install cuda-command-line-tools
$ echo "export LD_LIBRARY_PATH=\${LD_LIBRARY_PATH}\${LD_LIBRARY_PATH:+:}/usr/local/cuda/extras/CUPTI/lib64" >> ~/.profile
$ conda activate
(base)$ pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.6.0-cp36-cp36m-linux_x86_64.whl
動作チェック
Using GPUs | TensorFlow Programmer's Guide
https://www.tensorflow.org/programmers_guide/using_gpu
$ conda activate
(base)$ jupyter notebook
- Jupyter notebook を起動
- New → Python 3 から新しくノートブックを作成
- 下の内容をセルに入力し、 Shift+Enter で実行
import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
print(sess.run(hello))
import 時の Warning は気にしなくてよさそう
Jupyter を起動したターミナルを確認し、 GPU が認識されていて、エラーが出ていなければ OK
2018-03-04 11:16:58.334216: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:898] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-03-04 11:16:58.334554: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1212] Found device 0 with properties:
name: GeForce GTX 980 major: 5 minor: 2 memoryClockRate(GHz): 1.291
pciBusID: 0000:01:00.0
totalMemory: 3.95GiB freeMemory: 3.45GiB
2018-03-04 11:16:58.334583: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1312] Adding visible gpu devices: 0
2018-03-04 11:16:58.557392: I tensorflow/core/common_runtime/gpu/gpu_device.cc:993] Creating TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 3178 MB memory) -> physical GPU (device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0, compute capability: 5.2)
Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0, compute capability: 5.2
2018-03-04 11:16:58.585013: I tensorflow/core/common_runtime/direct_session.cc:297] Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: GeForce GTX 980, pci bus id: 0000:01:00.0, compute capability: 5.2
Const: (Const): /job:localhost/replica:0/task:0/device:CPU:0
2018-03-04 11:16:58.595781: I tensorflow/core/common_runtime/placer.cc:875] Const: (Const)/job:localhost/replica:0/task:0/device:CPU:0