【Ubuntu】TensorflowやKerasをGPUで動かす方法

 

こんにちは。のっくん(@yamagablog)です。

 

最近はAIブームですので、ディープラーニングをやってみたい!って人が増えています。

 

ディープラーニングは普通にパソコンでも動きますが、めちゃくちゃ時間がかかります

 

そこでNVIDIA社などが出しているGPUという部品を使うことで処理を高速化します。

 

GPUを使うことで処理時間が10倍ほど速くなりますので、例えばCPUで240分かかっていたディープラーニングを24分で終わらせることができます。

 

ディープラーニングを動かすにはPythonのKerasやTensorFlowなどのライブラリを使います。ライブラリは、ディープラーニングを動かすために必要な機能が全部入ったソフトウェアのことです。

 

ライブラリを使うことでディープラーニングの細かな仕組みを全く知らなくても誰でもディープラーニングを動かすことができます。

 

この記事では、GPUを使ってディープラーニングするための方法を説明していきたいと思います!

 

私の実行環境は以下の通りです。

  • Ubuntu18.04 Server
  • GeForce GTX1060

 

ちなみに私がGPUのPCを買ったお話は以下の記事にあります。

ドスパラでGPU搭載PCを買ってみた

 

[toc]

 

はじめに

 

初心者にとってはディープラーニングを動かすまでのUbuntuの設定(ドライバやcudaを入れる)が結構大変です。

 

というのも日本語でググっても適切な記事が出てこないからです。私は途中でもうGPU動かさずに諦めようかと思いました。

 

私が独学でGPU上でディープラーニングを動かすようになるまで2週間以上かかりました。

 

まぁ色々大変でしたが、ようやく動くようになったのでこの記事にまとめておきます。(要点さえ押さえておけば簡単です。)

 

とは言っても最初にトライする人にとっては何をして良いのかも分からないと思うので、これからやることを図にしてみました。

 

 

ディープラーニングをGPUで動かすためには以下の3つのソフトウェアが必要になります。

 

  • NVIDIAのドライバ
  • CUDA(CUDA Toolkit)
  • CuDNN

 

ネットではCUDAToolkitやCuDNNをUbuntuにインストールする方法がたくさん紹介されています。

しかしこの方法は初心者には結構難易度が高いので、この記事ではAnacondaを使ってインストールする方法をご紹介します。

Anacondaなら仮想環境なので失敗しても作り直せば良いので安心です。Ubuntuだと失敗した時にOSの再インストールが結構大変なので、あまりオススメしません。

 

以下の順番で作業を進めていきたいと思います。

NVIDIAのドライバ → Ubuntuにインストールする

CUDAとCuDNN → Anacondaの仮想環境上にインストールする

 

NVIDIAのドライバだけはUbuntuに直接インストールしないといけませんが、ぶっちゃけここが最難関です。

なぜかというとデフォルトのドライバが競合したり、セキュアブートと呼ばれるBIOSの機能が邪魔をするからです。

 

事前準備

 

GPUがPCに接続されていることが前提です。またOSはUbuntu 18.04 Serverがインストールされている状態で、話を進めていきます。

 

セキュアブートはOFFにしておく

 

最近のPCにはセキュアブートが設定されています。これはPCの起動時にソフトウェアの署名を検証して、起動させるかどうかチェックするものです。

この機能がオンになっていると、これからインストールしようとするドライバというソフトウェアが起動できません。

BIOSのセキュアブートはオフにしておいてください。これがオンになっているとOSからドライバが認識されないことがあります。PC起動時にF2かDelを押すと、BIOSメニューが起動しオフにできます。

 

 

ちなみに私はセキュアブートがオンになっていたせいでドライバが認識せず一週間以上悩みました。

 

デフォルトのドライバ(NOUVEAU)を無効化する

 

nouveauというデフォルトのドライバが入っていますのでこれをオフにします。

 

新しく以下のファイルを作成して以下の2行を追記します。

matsu@gpu-server:~$ vim /etc/modprobe.d/blacklist-nouveau.conf 
blacklist nouveau
options nouveau modeset=0

 

以下のコマンドで再読み込みします。

sudo update-initramfs -u

 

PCを再起動して以下のコマンド何も表示されなければOKです。

matsu@gpu-server:~$ lsmod | grep nouveau

 

NVIDIAのドライバのインストール

 

ubuntu-drivers-commonをインストールします。これはGPUの情報や適切なドライバのバージョンを表示してくれるツールです。

 

sudo apt install ubuntu-drivers-common

 

NVIDIAのドライバーはUbuntuの公式レポジトリからはダウンロードできませんので、PPAという非公式なマーケットからダウンロードします。以下のコマンドで、aptのレポジトリに”graphics-drivers”のPPAを追加します。

 

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

 

PPAとは?

PPAはUbuntuユーザーのチームや個人がそれぞれ管理している非公式のApp Storeのようなもので、Ubuntuの公式レポジトリからはダンロードできないソフトウェアや最新のバージョンのソフトウェアを手に入れることができます。より多くのソフトウェアを試すことができる反面、動作保証や安全性の保証はないので一定のリスクがあることを確認して下さい。

PPAの便利なところは、一度、信頼するソフトウェアの提供元として追加すると、公式のレポジトリからダウンロードしたソフトウェアと同様にアップデートがあるかどうか自動でチェックし、一括アップデートできることです。ソフトウェアのインストールや削除も公式のソフトと同じように、Ubuntuのソフトウェアセンターから一元管理できます。

https://allabout.co.jp/gm/gc/438675/

 

以下のコマンドでドライバのバージョンを確認してください。

 

matsu@gpu-server:~$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:03.1/0000:26:00.0 ==
modalias : pci:v000010DEd00001C02sv000010DEsd00001C02bc03sc00i00
vendor   : NVIDIA Corporation
model    : GP106 [GeForce GTX 1060 3GB]
driver   : nvidia-driver-396 - third-party free
driver   : nvidia-driver-410 - third-party free
driver   : nvidia-driver-390 - third-party free
driver   : nvidia-driver-415 - third-party free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

 

415がレコメンドされていますが、一応、NVIDIAのサイトでも確認します。自分が使っているGPUのバージョンを入力します。

https://www.nvidia.co.jp/Download/index.aspx?lang=jp

 

ドライバのバージョンが410と記載されていますので、410をインストールしましょう。

 

sudo apt -y install nvidia-driver-410

 

以下のように表示されればオッケーです。

 

matsu@gpu-server:~$ nvidia-smi
Sat Feb 16 10:04:59 2019       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 410.78       Driver Version: 410.78       CUDA Version: 10.0     |
|-------------------------------+----------------------+----------------------+
| 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 106...  Off  | 00000000:26:00.0 Off |                  N/A |
| 18%   31C    P0    24W / 120W |      0MiB /  3013MiB |      4%      Default |
+-------------------------------+----------------------+----------------------+
                                                                               
+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+

 

以下のエラーが出る場合は、BIOSのセキュアブートをオフにすると解決すると思います。

matsu@gpu-server:~$nvidia-smi
NVIDIA-SMI has failed because it couldn't communicate with the NVIDIA driver. Make sure that the latest NVIDIA driver is installed and running."

 

Anacondaのインストール

 

CUDAやCuDNNはAnacondaを使って入れます。

 

Anacondaは仮想環境なので、失敗すれば消せば良いだけですしやり直しがききます。Ubuntuに直接入れるよりも断然楽です。

 

以下のサイトからダウンロードします。

 

Anaconda Python/R Distribution

 

私は、wgetでダウンロードしてきました。

 

matsu@gpu-server:~$wget https://repo.anaconda.com/archive/Anaconda3-2018.12-Linux-x86_64.sh
matsu@gpu-server:~$sh Anaconda3-2018.12-Linux-x86_64.sh

 

ダウンロードしたらインストールスクリプトを実行します。

 

途中でanacondaのパスを通すかどうか聞かれるので「yes」を押してください。VSコードは必要ないので「no」を選択しました。

 

インストールが終わったら再起動します。

 

matsu@gpu-server:~$ python -V
Python 3.7.1

 

インストールされていることが確認できました。

 

cudatoolkit,cudnnのインストール

 

仮想環境を作成して必要なものをインストールしていきます。

 

matsu@gpu-server:~$conda create -n tf-gpu
matsu@gpu-server:~$conda activate tf-gpu
(tf-gpu) matsu@gpu-server:~$conda install -c aaronzs tensorflow-gpu

 

ここで、`conda list`を使って、インストールされたtensorflow-gpuのバージョンを確認してください。

 

私が確認した時点では1.10.0でした。このバージョンに対応するcuda,cudnnをインストールする必要があります。対応表は以下のサイトで確認してください。

 

https://www.tensorflow.org/install/source

 

cudatoolkitは9.0を指定します。指定しないと最新のcuda10が入ってしまいうまく動きませんでした。cudnnは最新で7だったので問題ありません。

 

(tf-gpu) matsu@gpu-server:~$conda install -c anaconda cudatoolkit==9.0
(tf-gpu) matsu@gpu-server:~$conda install -c anaconda cudnn

 

動作確認

 

pythonを実行し、以下のコードを順番に実行していきます。

>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))

 

(tf-gpu) matsu@gpu-server:~$ python
Python 3.6.8 |Anaconda, Inc.| (default, Dec 30 2018, 01:22:34) 
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow')
>>> sess = tf.Session()
2019-02-19 11:34:24.566256: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA
2019-02-19 11:34:24.990319: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:897] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2019-02-19 11:34:24.990833: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1405] Found device 0 with properties: 
name: GeForce GTX 1060 3GB major: 6 minor: 1 memoryClockRate(GHz): 1.7085
pciBusID: 0000:26:00.0
totalMemory: 2.94GiB freeMemory: 2.88GiB
2019-02-19 11:34:24.990855: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1484] Adding visible gpu devices: 0
2019-02-19 11:34:25.170916: I tensorflow/core/common_runtime/gpu/gpu_device.cc:965] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-02-19 11:34:25.170957: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971]      0 
2019-02-19 11:34:25.170963: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] 0:   N 
2019-02-19 11:34:25.171114: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1097] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 2582 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1060 3GB, pci bus id: 0000:26:00.0, compute capability: 6.1)
>>> print(sess.run(hello))
b'Hello, TensorFlow'
>>> exit()

 

上記のように表示されればGPUが動いています。やりましたね!

 

Jupyter notebookの設定

 

このままだとJupyterNotebookでGPUが動かせませんので、Jupyterのカーネルの設定をします。

 

(tf-gpu) matsu@gpu-server:~$conda install ipykernel
(tf-gpu) matsu@gpu-server:~$python -m ipykernel install --user --name tf-gpu --display-name "TensorFlow-GPU"
jupyter notebook

 

TensorFlow-GPUを選択して、新しいノートブックを開きます。

 

kerasでディープラーニング

 

事前にgpu用のkerasをインストールしておきます。

 

(tf-gpu) matsu@gpu-server:~$conda install keras-gpu

 

これで準備は整いました。

ここまで長かったですが、ようやくディープラーニングが動かせます!

 

Lenet-5というニューラルネットワークを使います。以下のコードをJupyterで実行しましょう。

 

import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.layers import Flatten,  MaxPooling2D, Conv2D
from keras.callbacks import TensorBoard

(X_train,y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(60000,28,28,1).astype('float32')
X_test = X_test.reshape(10000,28,28,1).astype('float32')

X_train /= 255
X_test /= 255

n_classes = 10
y_train = keras.utils.to_categorical(y_train, n_classes)
y_test = keras.utils.to_categorical(y_test, n_classes)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)) )
model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())          
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(n_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

tensor_board = TensorBoard('./logs/LeNet-MNIST-1')

model.fit(X_train, y_train, batch_size=128, epochs=15, verbose=1,
          validation_data=(X_test,y_test), callbacks=[tensor_board])

 

トレーニングで0.9935、バリデーションで0.9922の精度が出ました。

GPUを使っているのでとても早いです。

実行中にnvidia-smiコマンドを使うとどの程度GPUを使っているかみれます。

 

おまけ:tensorboardでの可視化

 

学習結果を可視化できます。

(tf-gpu) matsu@gpu-server:~$ conda install bleach
(tf-gpu) matsu@gpu-server:~$ tensorboard --logdir=./logs --port 6006

 

 

参考

 

Pugets Systems:

https://www.pugetsystems.com/labs/hpc/The-Best-Way-to-Install-TensorFlow-with-GPU-Support-on-Windows-10-Without-Installing-CUDA-1187/#the-results

 

おわり。

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog