Lavieleaf

おもったことをなんでも書くことろ

UbuntuでGPU環境をセットアップ


はじめに

先日 RTX 2080 Ti を購入したのだけど、MNISTくらいのタスクは実行できるのだけど大きいタスクをやらせると画面にノイズが入って勝手に再起動してしまう現象が起きて苦労した。 結局、初期不良ということで交換対応してもらえた。 そのときにNVIDIAドライバを入れ直したり環境を作ったり壊したりしていて、良さそうなGPU環境のセットアップを決めた。 もう、CUDAのインストールも面倒なのでDockerベースでやることにした。

  • https://github.com/NVIDIA/nvidia-docker

上記のリポジトリにnvidiaのコンテナイメージが提供されている。 今後学習もコンテナでやることにしたので、準備をつらつら書いてみる

準備

  • Ubuntu 18.04

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

NVIDIA/nvidia-dockerにもあるが、NVIDIAドライバのインストールは最低限必要になっている。

Ubuntu環境で ubuntu-drivers devices を実行すると推奨ドライバがわかる。

$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001E07sv000010DEsd00001E07bc03sc00i00
vendor   : NVIDIA Corporation
driver   : nvidia-driver-430 - distro non-free recommended
driver   : xserver-xorg-video-nouveau - distro free builtin

とりあえず、自動でインストールして再起動する

$ sudo ubuntu-drivers autoinstall
$ sudo reboot now

再起動後にデバイスが認識しているか nvidia-smi を実行する。一応大丈夫そう。

$ nvidia-smi
Sat Oct 13 00:24:59 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 RTX 208...  Off  | 00000000:01:00.0  On |                  N/A |
| 35%   40C    P8    24W / 260W |     99MiB / 11016MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+


+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1078      G   /usr/lib/xorg/Xorg                            39MiB |
|    0      1124      G   /usr/bin/gnome-shell                          58MiB |
+——————————————————————————————————————+

Docker インストール

ほとんど、公式のインストール方法のまま。現時点の最新は19.03。

  • https://docs.docker.com/install/linux/docker-ce/ubuntu/
$ sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
    $(lsb_release -cs) \
    stable"
$ sudo apt-get update && sudo apt-get install -y docker-ce docker-ce-cli containerd.io
$ sudo usermod -aG docker <user>
$ sudo reboot now
$ docker version
Client: Docker Engine - Community
 Version:           19.03.3
 API version:       1.40
 Go version:        go1.12.10
 ...

Server: Docker Engine - Community
 Engine:
  Version:          19.03.3
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
 ...

NVIDIA のコンテナツールのインストール

これは NVIDIA/nvidia-docker のまま。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
$ sudo systemctl restart docker
$ sudo reboot now
$ docker run --gpus all --rm nvidia/cuda nvidia-smi
Unable to find image 'nvidia/cuda:latest' locally
latest: Pulling from nvidia/cuda
35c102085707: Pull complete
...
Status: Downloaded newer image for nvidia/cuda:latest
Fri Oct 14 15:42:40 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| 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 RTX 208...  Off  | 00000000:01:00.0 Off |                  N/A |
| 35%   33C    P8    22W / 260W |     26MiB / 11016MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+


+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

Dockerfile

最終的な学習用のコンテナイメージはこんな感じで、これからはTF2.0を使っていこうと思う。 jupyterlab を使えるようにしている。また jupyterlab から Tensorboard が開けるように nodejs 12.xをインストールするようにしてる。

FROM tensorflow/tensorflow:2.0.0-gpu-py3

RUN apt-get update && apt-get install -y --no-install-recommends \
libsm6 \
libxext6 \
libxrender-dev

RUN apt-get clean && rm -rf /var/lib/apt/lists/*

RUN /usr/local/bin/pip install -U pip
RUN /usr/local/bin/pip --no-cache-dir install \
wheel \
Pillow \
matplotlib \
numpy \
pandas \
scipy \
sklearn \
tqdm \
argparse \
boto3 \
mtcnn \
Cython \
contextlib2 \
lxml \
jupyter \
jupyterlab \
easydict

RUN /usr/local/bin/pip --no-cache-dir install \
kaggle \
opencv-python

RUN curl -sL https://deb.nodesource.com/setup_12.x | bash
RUN apt-get install -y nodejs
RUN jupyter labextension install jupyterlab_tensorboard

使い方

// イメージを作る
$ docker build -t tf2 -f Dockerfile .

// jupyterlab を起動させる
$ docker run -p 8888:8888 -v `pwd`:/docker --gpus all -it --rm tf2 jupyter lab --ip=0.0.0.0 --allow-root