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-440
が recommendedとなっているため、これをインストールします
1
| $ sudo apt install nvidia-driver-440
|
なおここで、ubuntu-drivers autoinstall
というコマンドを実行すれば、適切なドライバを勝手にインストールしてくれるみたいなのですが、仕組みを理解したかったので今回は使用しませんでした
インストールしたら再起動します
再起動後、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-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