【環境構築】Ubuntu 20.04にDocker + GPU環境(nvidia-container-toolkit)を構築してみた

はじめに

こんにちは、がんがんです。
昨年の冬に、オプティムさんのイベントにてLTを行いました。
gangannikki.hatenadiary.jp


その際に、GPUインフラを構築するインフラおじさんに就任してしまったお話をさせていただきました。
就活やウイルスの影響で延期されていたインフラおじさん化計画が先日実行フェーズへと移行されました(せざるをえなかった)。


今回はUbuntu 20.04 + Docker + nvidia-container-toolkitを用いてGPUインフラを構築するまでのことについて備忘録としてまとめておこうと思います。



追記:2020/09/29
docker-compose + GPUに関する記事を末尾に追加しました。

目的

  • Ubuntu 20.04上にDocker環境を構築
  • Dockerの中からGPUの実行を行える環境を構築

参考

情報が乱立しているみたいで、最終的に頼りにしたのは公式のドキュメントでした。
参考記事を見る感じだと、nvidia-container-toolkit = nvidia-docker2って認識で良さそうでした。

しかし、2020 年 9 月の更新により、とてもシンプルになりました。
今は単に nvidia-docker2 パッケージをインストールすれば OK です。

公式ドキュメント

docs.nvidia.com

参考記事

Nvidiaの方がnvidia-dockerに関するまとめをされていて非常に参考になりました。
medium.com

環境

  • Ubuntu:20.04
  • dokcer:19.03.12

nvidia-driverのバージョンについては対応するものを調べてください。
https://www.nvidia.com/Download/index.aspx?lang=en-us

Dockerのセットアップ

まずは公式の手順に沿ってDockerのセットアップを行います。

$  curl https://get.docker.com | sh
$  sudo systemctl start docker && sudo systemctl enable 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

nvidia-container-toolkitのセットアップ

次に、nvidia-docker2をインストールしていきます。Qiitaなどの記事ではnvidia-docker2は非推奨というような記事も見かけましたが、この数ヶ月でいろいろとアプデがあったみたいですね。

$  sudo apt-get update && sudo apt-get install -y nvidia-docker2
$  sudo systemctl restart docker

nvidia/cuda:10.2-baseイメージでの確認

試しに、nvidia-smiコマンドを使って実験を行ってみます。通常版との変化は--gpusオプションが追加されたことです。

下記コマンドを実行してGPUの状況がきちんと表示されればOKです(自身の所有マシンではないため一部省略しています)。

$  sudo docker run --rm --gpus all nvidia/cuda:10.2-base nvidia-smi
Sat Sep 26 10:10:03 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.100      Driver Version: 440.100      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. |
|===============================+======================+======================|
...(略)

ubuntu:20.04イメージでの確認

nvidia/cudaのイメージでしか使えないのかな?と思い、ubunt:20.04のイメージでも同様の実験を行いました。

$  sudo docker run --rm --gpus all ubuntu:20.04 nvidia-smi
Sat Sep 26 10:13:00 2020       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.100      Driver Version: 440.100      CUDA Version: N/A      |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
...(略)

さっきとは違って、CUDA VersionがN/Aになっていますが、Ubuntuコンテナからもきちんと認識できているようです。

おわりに

今回はUbuntu:20.04上にDocekr + GPU環境を構築してきました。
Qiitaなどの記事では、情報が混在していたので公式ドキュメント一発で出来るようになって非常にありがたいです。


次回は、上記に環境にdocker-composeをインストールして、docker-compose + GPU環境を構築した話をまとめておこうと思います。
また、Ubuntuでの構築を行う前に、実はWindows上での構築をトライしていました。Windows上では非常に苦戦して断念しましたので、失敗供養としてそちらも後ほどまとめようと思います。
gangannikki.hatenadiary.jp