Docker 19.03新機能 (root権限不要化、GPU対応強化、CLIプラグイン…) - nttlabs - Medium

Docker 19.03より実装された--gpusフラグを使って、GPUを用いたコンテナを作成してみたのでメモです

前提

  • Ubuntu 18.04 LTS *1
  • docker 19.03
  • Nvidia GeForce GTX 1050
  • docker-composeは、現時点ではまだ--gpusに対応出来ていないので使いません。nvidia-docker-composeというプロジェクトもありますが、現時点ではnvidia-docker2向けのラッパーという認識です

(*1) ホストマシンはVirtualBoxなどの仮想環境上ではなく、ハードウェア上に直接インストールして使用しています。VirtualBox上の仮想マシンにGeForceを認識させるためにはまず、VirtualBox Extension Packを導入し、PCIパススルーを利用してゲストOSにGPUを認識させるといった作業が別途必要になり、また、チップセットによってはうまくいかないといった事例もネット上で見られたため、あまり手戻りを増やしたくなかったので、メルカリで買った割安なGPUを積んだマシン(25000円)にUbuntuを入れて作業しました

Ubuntuがグラフィックボードを認識しているか確認する

1
2
3
$ lspci | grep -i nvidia
01:00.0 VGA compatible controller: NVIDIA Corporation GP107 [GeForce GTX 1050] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP107GL High Definition Audio Controller (rev a1)

nouveauがオンになっていないか確認する

nouveauは、NvidiaのLinux向けドライバをリバースエンジニアリングして開発された、フリーのNvidia向けドライバで、Ubuntuもインストール段階で入っている場合があります

もしnouveauが有効になっていれば、これをNvidia製のドライバに置き換えます

1
2
// 何か表示されたらnouveauが有効
$ lsmod | grep -i nouveau

上記のコマンドを実行して何か表示されれば、nouveauが有効になっています。何も表示されなかった場合は次の手順は不要です

1
2
3
4
5
// nouveauを無効にする(モジュールをロードしないようにする)
$ sudo vim /etc/modprobe.d/blacklist-nouveau.conf

blacklist nouveau
options nouveau modeset=0

変更内容を反映します

1
2
3
4
5
// initramfsの更新
$ sudo update-initramfs -u

// 再起動
$ sudo reboot

再起動後、lsmod | grep -i nouveauを実行して何も表示されなければ、nouveauが正しく無効になっています。GUIが実行されている環境では、解像度が下がったり、描画がカクついたりしていると思います

Nvidia製のドライバをインストールする

NvidiaのドライバはPPAにて配布されているため、PPAをapt-lineに追加します

1
2
$ sudo add-apt-repository ppa:graphics-drivers/ppa
$ sudo apt update

ubuntu-driversコマンドを実行すると、デバイスにあったドライバを知る事ができます

1
2
3
4
5
6
7
8
9
10
11
12
$ ubuntu-drivers devices
== /sys/devices/pci0000:00/0000:00:01.0/0000:01:00.0 ==
modalias : pci:v000010DEd00001C81sv00001462sd00008C97bc03sc00i00
vendor : NVIDIA Corporation
model : GP107 [GeForce GTX 1050]
driver : nvidia-driver-415 - third-party free
driver : nvidia-driver-440 - third-party free recommended
driver : nvidia-driver-430 - third-party free
driver : nvidia-driver-435 - third-party free
driver : nvidia-driver-390 - third-party free
driver : nvidia-driver-410 - third-party free
driver : xserver-xorg-video-nouveau - distro free builtin

ここでは、nvidia-driver-440recommendedとなっているため、これをインストールします

1
$ sudo apt install nvidia-driver-440

なおここで、ubuntu-drivers autoinstallというコマンドを実行すれば、適切なドライバを勝手にインストールしてくれるみたいなのですが、仕組みを理解したかったので今回は使用しませんでした

インストールしたら再起動します

1
$ sudo reboot

再起動後、nvidia-smiコマンドを実行して、以下のような表示が出るか確認します

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ nvidia-smi
Thu Nov 7 02:54:15 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.26 Driver Version: 440.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 GTX 1050 Off | 00000000:01:00.0 On | N/A |
| 41% 35C P8 N/A / 75W | 194MiB / 1992MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes: GPU Memory |
| GPU PID Type Process name Usage |
|=============================================================================|
| 0 1044 G /usr/lib/xorg/Xorg 104MiB |
| 0 1219 G /usr/bin/gnome-shell 87MiB |
+-----------------------------------------------------------------------------+

docker 19.03のインストール

公式の手順に沿ってdocker-ceをインストールしました(公式の通りなので、ここでは詳しい手順は割愛します)

Nvidia Container Toolkitのインストール

nvidia-docker2に変わり、Docker 19.03からは、Nvidia Container Toolkitという名称になりました。(docker 19.03以降、nvidia-docker2の利用は非推奨

Nvidia Container Toolkitには、GPUをコンテナで利用するためのランタイムライブラリと、そのユーティリティが含まれています

1
2
3
4
5
6
7
8
9
// Nvidia Container Toolkitのインストール
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$(. /etc/os-release;echo $ID$VERSION_ID)/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt update
$ sudo apt install nvidia-container-toolkit

// いちおう再起動
$ sudo reboot

動作確認

--gpusフラグをつけて実行してみます。ホストとほぼ同じ表示になります(Processesは表示されませんが、コンテナ内で何か実行した際にホスト側のnvidia-smiに表示されます)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ docker run --rm --gpus all nvidia/cuda:10.1-base-ubuntu18.04 nvidia-smi
Fri Nov 8 12:57:44 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.26 Driver Version: 440.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 GTX 1050 Off | 00000000:01:00.0 On | N/A |
| 40% 27C P8 N/A / 75W | 99MiB / 1999MiB | 0% Default |
+-------------------------------+----------------------+----------------------+

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

この手順のあと、ベンチマークとか実行したいなと思って作ったDockerfileを こちらに置いています(glmark2使用)

その後

コンテナ上でGUIを使う手順は以下

ディスプレイの無い環境でもNvidia GPUでXサーバを作るメモ | 7me