こんにちは。のっくん(@yamagablog)です。
最近はAIブームですので、ディープラーニングをやってみたい!って人が増えています。
ディープラーニングは普通にパソコンでも動きますが、めちゃくちゃ時間がかかります。
そこでNVIDIA社などが出しているGPUという部品を使うことで処理を高速化します。
GPUを使うことで処理時間が10倍ほど速くなりますので、例えばCPUで240分かかっていたディープラーニングを24分で終わらせることができます。
ディープラーニングを動かすにはPythonのKerasやTensorFlowなどのライブラリを使います。ライブラリは、ディープラーニングを動かすために必要な機能が全部入ったソフトウェアのことです。
ライブラリを使うことでディープラーニングの細かな仕組みを全く知らなくても誰でもディープラーニングを動かすことができます。
この記事では、GPUを使ってディープラーニングするための方法を説明していきたいと思います!
私の実行環境は以下の通りです。
- Ubuntu18.04 Server
- GeForce GTX1060
ちなみに私が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に直接入れるよりも断然楽です。
以下のサイトからダウンロードします。
私は、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:
おわり。