Dockerコンテナ内でGPUを使うための環境構築方法をご紹介します。

【Ubuntu】DockerでGPUを使うまでの環境構築

先日、プログラミング用にデスクトップPCを購入して、Ubuntuをインストールしました。

機械学習用にゲーミングPCを購入した(選び方、購入理由を紹介)
【安全にデュアルブート】増設SSDにUbuntuをインストール

ここから本格的にプログラミングを始めるために、Dockerをインストールしました。さらに、機械学習を行うために、DockerでGPUを使うための環境構築も実施しました。

この記事にその過程を記録します。

※コマンド内の「円マーク」は「バックスラッシュ」に置き換えてください。

概要

DockerでGPUを使うために、以下3つをインストールします。

  • Docker
  • Nvida driver
  • Nvidia Container Runtime

私のPC環境

  • Ubuntu 20.04
  • GeForce RTX 3060

補足

一昔前までは、Dockerコンテナ内でGPUを使うためには、NvidiaDockerまたはNvidiaDocker2を使う必要がありました。しかし、バージョン19.03以降のDockerでは、通常の「docker run」コマンドでGPUが使えるようになっています。

Dockerのインストール

公式ページ[Install Docker Engine on Ubuntu]の[Install using the repository]に従ってDockerをインストールします。

私が実際に実行したコマンドを以下に載せます。ただし、インストール方法が変わる可能性もあるため、常に公式ページの手順に従うことが無難です。公式ページを読むのが面倒くさい場合は、以下を参考にしてみてください。

  1. (過去にDockerをインストールしている場合は、それを削除します。)
    sudo apt-get remove docker docker-engine docker.io containerd runc
  2. インストールに必要なパッケージを準備をします。
    sudo apt-get update
    sudo apt-get install \
    	ca-certificates \
    	curl \
    	gnupg \
    	lsb-release
  3. Dockerのkeyを追加します。
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
  4. 「stable」リポジトリを指定します。
    echo \
    	"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
    	$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  5. 最新版のDockerをインストールします。
    sudo apt-get update
    sudo apt-get install docker-ce docker-ce-cli containerd.io
  6. 動作確認します。
    sudo docker run hello-world

sudoなしでDockerコマンドを実行するための設定

必須ではありませんが、sudoなしでDockerコマンドを実行するための設定をすると便利です。公式ページ[Post-installation steps for Linux]の[Manage Docker as a non-root user]に従って設定します。

実際に私が実行したコマンドは以下のとおりです。

sudo groupadd docker
sudo usermod -aG docker $USER
sudo reboot

DockerだけではGPUを使用できないことを確認

Dockerをインストールしただけでは、コンテナ内でGPUを使えません。以下のコマンドで確認してみましょう。

docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

この時点でGPUを使用しようとすると、以下のようなエラーが表示されます。

docker: Error response from daemon: could not select device driver "" with capabilities: [[gpu]].

これでは困るので、以下でNvida driverとNvidia Container Runtimeをインストールしていきます。

Nvida driverのインストール

私はaptを利用してNvidia driverをインストールしました。

ホームページからダウンロードすることもできますが、本記事では省略します。

  1. 自身のPCに合ったバージョンを調べます。

    sudo apt install -y ubuntu-drivers-common
    ubuntu-drivers devices
    == /sys/devices/pci0000:00/0000:00:03.1/0000:07:00.0 ==
    modalias : pci:v000010DEd00002487sv000019DAsd00004630bc03sc00i00
    vendor : NVIDIA Corporation
    driver : nvidia-driver-470-server - distro non-free
    driver : nvidia-driver-510 - distro non-free recommended
    driver : nvidia-driver-470 - distro non-free
    driver : xserver-xorg-video-nouveau - distro free builtin
  2. 上記で「recommended」と表示されたバージョンをインストールします。
    sudo apt install --no-install-recommends nvidia-driver-510
  3. 再起動します。
    sudo reboot
  4. 動作確認します。
    nvidia-smi
    Mon Mar 14 22:29:28 2022
    +-----------------------------------------------------------------------------+
    | NVIDIA-SMI 510.47.03 Driver Version: 510.47.03 CUDA Version: 11.6 |
    |-------------------------------+----------------------+----------------------+
    | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
    | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
    | | | MIG M. |
    |===============================+======================+======================|
    | 0 NVIDIA GeForce ... Off | 00000000:07:00.0 On | N/A |
    | 0% 46C P8 15W / 170W | 774MiB / 12288MiB | 0% Default |
    | | | N/A |
    +-------------------------------+----------------------+----------------------+

    +-----------------------------------------------------------------------------+
    | Processes: |
    | GPU GI CI PID Type Process name GPU Memory |
    | ID ID Usage |
    |=============================================================================|
    | 0 N/A N/A 979 G /usr/lib/xorg/Xorg 101MiB |
    | 0 N/A N/A 1650 G /usr/lib/xorg/Xorg 258MiB |
    | 0 N/A N/A 1778 G /usr/bin/gnome-shell 145MiB |
    | 0 N/A N/A 2763 G ...860182582202185772,131072 255MiB |
    +-----------------------------------------------------------------------------+

Nvidia Container Runtimeのインストール

NVIDIA/nvidia-container-runtime/README.mdの[Ubuntu distributions]に従ってNvidia Container Runtimeをインストールします。

実際に私が実行したコマンドは以下のとおりです。

  1. リポジトリの設定をします。
    curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey |
    sudo apt-key add -
    distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
    curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list |
    sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
    sudo apt-get update
  2. インストールします。
    sudo apt-get install nvidia-container-runtime
  3. 再起動します。
    sudo reboot

補足

[NVIDIA Container Toolkit (NVIDIA Docker) は何をしてくれるか]によると、Nvidia Container Runtimeをインストールすると、依存しているnvidia-container-toolkitとlibnvidia-containerもインストールされるそうです。

動作確認

上記のインストールを終えたら動作確認してみましょう。以下のコマンドで、Dockerコンテナ内でGPUを認識できていたらOKです。

docker run --gpus all nvidia/cuda:10.0-base nvidia-smi

GPUを使うためには上記コマンドのように「--gpus all」オプションをつけるだけです。

さいごに

Dockerコンテナ内でGPUを使うために、私が実行したコマンドを記録として残しました。このあたりの環境構築はややこしいので、この記事が皆さんの役に立てば幸いです。


以上です。

Ad.