Help us understand the problem. What is going on with this article?

Deep Learning 環境の構築 (Ubuntu 18.04)

Deep Learning 環境の構築

新しく調達したパソコンでDeep Learning環境を構築する際に
NVIDIA GPUと標準のUbuntuのグラフィックドライバーの相性が悪いために
毎回フリーズを起こすなど、手間取ることが多いため備忘録を兼ねて投稿。

環境

OS Ubuntu 18.04
GPU GeForce GTX 1080Ti

普通にUSBメモリからOSをインストールすると以下のような画面となりフリーズしてしまう。

▼USBメモリから起動した際の画面
ios__________.jpg
原因は nouveau (デフォルトのグラフィックドライバー)とNVIDIA製のGPUと相性が悪いため。

nouveauの無効化

この画面で Install Ubuntu にカーソルを合わせて e を押すと起動オプションの設定が可能。

nouveau を無効化する
ios__________ (1).jpg

quiet splash ---
となっているところを
quiet splash nomodeset ---
と書き換えるとnouveauを無効化できる。
ios__________ (2).jpg

書き換えたら、Ctrl-xで起動。
表示は崩れるものの、起動が可能となる。

指示に従いインストール

image.png

再起動

インストール後も同様に nouveauの設定を行わないとフリーズするため注意。
GRUBはBIOSメニューが消えたあとに、SHIFTを連打or長押しすることで表示が可能

GRUBに行けたら、
e を押して、quiet splash となっているところを
quiet splash nomodesetに書き換える。
書き換えたら、Ctrl-xで起動。

Graphic Driverのインストール

packageのアップグレードを行う

sudo apt-get update
sudo apt-get upgrade

主要なライブラリをインストール

sudo apt-get install -y vim csh flex gfortran libgfortran3 g++ \
                 cmake xorg-dev patch zlib1g-dev libbz2-dev \
                 libboost-all-dev openssh-server libcairo2 \
                 libcairo2-dev libeigen3-dev lsb-core \
                 lsb-base net-tools network-manager \
                 git-core git-gui git-doc xclip gdebi-core libffi-dev \
                 make build-essential libssl-dev zlib1g-dev libbz2-dev \
                 libreadline-dev libsqlite3-dev wget curl llvm \
                 libncurses5-dev libncursesw5-dev \
                 xz-utils tk-dev libffi-dev liblzma-dev python-openssl

G++-7 と BoostLibが動作しているか検証

C++のコンパイラとBoostLibが動作しているかを、
以下のテストプログラムをコンパイル、実行して確認する。

test_boost.cpp
    #include <boost/lambda/lambda.hpp>
    #include <iostream>
    #include <iterator>
    #include <algorithm>

    int main()
    {
        using namespace boost::lambda;
        typedef std::istream_iterator<int> in;

        std::for_each(
            in(std::cin), in(), std::cout << (_1 * 3) << " " );
    }

コンパイルと実行確認

g++-7 test_boost.cpp -o test_boost
echo 3 6 9 | ./test_boost

9 18 27と出力されればOK

nvidia-driver のインストール

コマンドラインからインストールが可能
xxxxxxxxxxxxx にはドライバーのバージョン指定が入る。
https://www.nvidia.com/Download/index.aspx
公式ページにて、使用したいドライバーが対応している最新バージョンを調べる。

sudo apt-get purge nvidia-*
sudo add-apt-repository ppa:graphics-drivers/ppa
[enterキーを押す]
sudo apt-get update
sudo apt-get install nvidia-xxxxxxxxxxxxx

以下のコマンドで、ドライバーのリストを確認が可能。
インストールしたいものを指定する

sudo apt-cache search nvidia-*

2018/11/30 現在では、 1080Ti 向けでは 410.78 が最新だったため、以下のコマンドを使用
した。

sudo apt-get install nvidia-driver-410

再起動

フリーズしないことを祈りつつ、再起動を行う。
ディスプレイの設定が直っており、以下のコマンドで、GPUの稼働状況が確認できればインストールに成功している。

nvidia-smi

image.png

CUDAのインストール

2019/03 追記

この章は変更が激しいので、各DNNライブラリ(TensorFlow, PyTorchなど)の公式のインストール方法を参照してください。

インストールしたドライバーによっては、すでにCUDAが入っている場合もある。
※最新のものをインストールしても良いが、使用しているライブラリによっては指定通りでないと動かないものも多いので注意。
※ライブラリのバージョンによってCUDA8.0を使うなどのケースもある。
※OSとの依存性があり、Ubuntu 18.04とCUDA9.0は公式にはサポートされていない。
複数CUDAバージョンの同居は推奨されていないため、ここでは説明しないがnvidia-docker2 などを使うなどの方法が有効。
2018/11/30時点でのTensorFlow 1.12.0での Software requirements は以下の通り

ライブラリ version
NVIDIA® GPU drivers CUDA 9.0 requires 384.x or higher.
CUDA® Toolkit TensorFlow supports CUDA 9.0.
CUPTI ships with the CUDA Toolkit.
cuDNN SDK (>= 7.2)
(Optional) NCCL 2.2 for multiple GPU support.
(Optional) TensorRT 4.0 to improve latency and throughput for inference on some models.

最新Driverのインストール時に導入されるCUDA10.0は、利用しても動かないライブラリがあるため注意。(TensorFlowなど)

sudo apt-get install cudaをしてしまうと、nvidia-driverが削除され、nvidia-smiが通らなくなるため、以下のコマンドでCUDA9.0をインストールします。

sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub
wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
sudo apt install ./cuda-repo-ubuntu1604_9.1.85-1_amd64.deb
wget http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1604/x86_64/nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt install ./nvidia-machine-learning-repo-ubuntu1604_1.0.0-1_amd64.deb
sudo apt update

# CUDAとツールと、NCCL 2.xのインストール
sudo apt install cuda9.0 cuda-cublas-9-0 cuda-cufft-9-0 cuda-curand-9-0 \
    cuda-cusolver-9-0 cuda-cusparse-9-0 libcudnn7=7.2.1.38-1+cuda9.0 \
    libnccl2=2.4.2-1+cuda9.0 cuda-command-line-tools-9-0

※バージョンは頻繁に変わるため、存在しない場合は
apt-cache madison [パッケージ名] などで検索を行う

cuDNNのインストール

公式サイトからダウンロードする。
ダウンロードにはメンバーシップにサインインし、規約に同意する必要があることに注意。
※CUDAのバージョンと紐付きがあるので、確認してダウンロードする。
▼公式サイト
https://developer.nvidia.com/rdp/form/cudnn-download-survey

image.png

以下のコマンドを実行して、libcuptiをインストールする。

sudo apt-get install libcupti-dev

ランタイムのライブラリはcuDNN7.4.1ではインストーラー形式になっている。
バージョンによっては以下のようなコマンドを実行する。

cd ~/ダウンロード
tar -zxvf cudnn-9.2-linux-x64-v7.2.1.38.tgz
sudo cp -P cuda/lib64/libcudnn* /usr/local/cuda-9.2/lib64/
sudo cp cuda/include/cudnn.h /usr/local/cuda-9.2/include/
sudo chmod a+r /usr/local/cuda-9.2/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

Pythonのインストール

Ubuntu18.04では、デフォルトで以下のpythonが入っています。
複数バージョンを使い分ける必要がある場合、ここでpyenvを入れておくと良いでしょう。

$ python -V
Python 2.7.15rc1
$ python3 -V
Python 3.6.7

pyenvのインストール

git clone https://github.com/yyuu/pyenv.git ~/.pyenv

パスを通します。

$ vim ~/.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
$ source ~/.bashrc

好きなPythonをインストールして、利用できるようにしましょう。

pyenv install 3.6.8
pyenv install 3.7.2
pyenv global 3.6.8
pyenv rehash
python -V # 3.6.8

※3.7.2 は 2019/01/10現在、TensorFlowの公式サポート対象外です。

pyenvのトラブルシューティングページ
うまくインストール出来ない場合、ここを見れば解決できることが多いです。
https://github.com/pyenv/pyenv/wiki/common-build-problems

テスト

そのままDeep Learningライブラリを入れてしまうと環境が汚れてしまうので、
venvを利用して仮想環境を作成します。

$ cd
$ mkdir workspace
$ cd workspace
$ mkdir test
$ sudo apt-get install python3-venv
$ python3 -m venv venv36testTF
$ source venv36testTF/bin/activate

仮想環境に入ったらTensorFlowをテストしてみましょう。

$ pip install tensorflow-gpu==1.12.0 

mnistが動作するか、確認してみましょう。
test_mnist.pyという名前で、以下のファイルを作成します。

test_mnist.py
import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

記述できたら実行してみましょう。

$ python3 test_mnist.py

60秒程度で学習が進んだら、GPUでの学習成功です。

python test_mnist.py
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 0s 0us/step
Epoch 1/5
60000/60000 [==============================] - 7s 121us/step - loss: 0.2010 - acc: 0.9397
Epoch 2/5
60000/60000 [==============================] - 7s 118us/step - loss: 0.0806 - acc: 0.9748
Epoch 3/5
60000/60000 [==============================] - 7s 118us/step - loss: 0.0528 - acc: 0.9836
Epoch 4/5
60000/60000 [==============================] - 7s 119us/step - loss: 0.0373 - acc: 0.9882
Epoch 5/5
60000/60000 [==============================] - 7s 118us/step - loss: 0.0290 - acc: 0.9904
10000/10000 [==============================] - 0s 43us/step

以下のコマンドでGPUの稼働状況を確認してみましょう。
GPU稼働率などが学習時に上がっていれば、GPUを使っていることが確認できます。
バージョン関連エラーが起きる場合、再起動すると治ります。

nvidia-smi -l
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away