🌐

【2023年版】Ubuntu Server 23.04でdockerとGPUを用いた機械学習環境を構築する方法

2023/05/25に公開

はじめに

Nvidia GPU を搭載した Ubuntu Server 23.04 で docker を用いた機械学習環境を構築する。ドライバーのインストール方法や Anaconda を用いた TensorFlow 環境の構築方法は以下の記事で説明した。その続きとして docker を用いた環境構築の方法を説明する。

https://zenn.dev/derbuihan/articles/cb6b7a84dd6dc0

この記事における設定の方針を以下に示す。

  1. 基本的に docker や Nvidia が推奨している方法を用いる。
  2. ドライバー以外は docker コンテナ内に閉じ込め、インストールするものを減らす。
  3. docker は VSCode から使う。

私の PC のスペック[1]

  • i7 13700K
  • 3090 24GB
  • DDR5 128GB

docker の設定

snap でインストールした docker を消す。

snap でインストールした docker では GPU を使えない。アンインストールする。

$ sudo systemctl disable snap.docker.dockerd.service
$ sudo snap remove docker

docker のインストール

docker のインストールは公式ドキュメントを参考にする。

https://docs.docker.com/engine/install/ubuntu/

上から順番にコピペしていけば OK。以下インストールスクリプトを実行するだけでも良い。

$ curl https://get.docker.com | sh \
  && sudo systemctl --now enable docker

インストールが終わると以下コマンドで hello-world ができる。

sudo docker run hello-world

docker インストール後の設定

以下を参考に docker インストール後の設定を行う。

https://docs.docker.com/engine/install/linux-postinstall/

docker を sudo 無しで実行できるようにする。

sudo groupadd docker
sudo usermod -aG docker $USER

再起動時に docker を自動で起動

sudo systemctl enable docker.service
sudo systemctl enable containerd.service

NVIDIA container toolkit

docker から Nvidia GPU を使うには別途設定する必要がある。

ネットを調べると色々な方法が出てくるが、これは歴史的な経緯によるものである。この記事を書いてる時点では、nvidia-container-toolkit をインストールするのが最新の方法である。(nivida-docker や nivida-docker2 は全て過去のものです。)この辺の混沌は以下に整理されている。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/arch-overview.html

混沌を理解したら以下のインストールドキュメントに従ってインストールする。

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html

以下コードだけそのままでは Ubuntu 23.04 では動かない。

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

ただ、最初の部分をdistribution=ubuntu22.04に書き換えることで動作させた。(18.04 でも 20.04 でも 22.04 でも同じリポジトリを参照しているようなので、23.04 と指定しても全く問題ないと思う。)

残りのコマンドを打つ。

$ sudo apt-get update
$ sudo apt-get install -y nvidia-container-toolkit
$ sudo nvidia-ctk runtime configure --runtime=docker
$ sudo systemctl restart docker

nvidia-container-toolkit をインストールし、docker を設定してプロセスを再起動する。

動作確認

sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

GPU が認識していると成功。

VSCode の設定

拡張機能をインストール

以下拡張機能をローカル PC にインストールする。

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-containers

サーバーに SSH して以下拡張機能をインストールする。

https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker

コンテナ内の開発環境

以下手順でコンテナの開発環境を構築する。

  1. VSCode から U サーバーに ssh する。
  2. コンテナに渡したいコードのディレクトリを開く。
  3. 左下の緑の SSH を押して、開発コンテナー構成ファイルを追加を押す。すると.devcontainer フォルダが作成される。
  4. .devcontainer 内のファイルを以下のように編集する。

Dockerfile ベースコンテナを以下のように編集

FROM tensorflow/tensorflow:latest-gpu-jupyter

devcontainer.json を以下のように編集(runArgs は GPU を有効化するオプション、mounts はメモリ空間を共有するオプション。)

"runArgs": ["--gpus", "all"],
"mounts": [
	"source=/dev/shm,target=/dev/shm,type=bind"
]
  1. 左下の緑の SSH を押して、コンテナーで再度開くを押す。
  2. あとは pip で好きなパッケージをインストールして開発

おわりに

docker を用いた機械学習の開発環境を構築した。

ただ、普段の勉強環境してはイマイチだと思う。VSCode の拡張機能もコンテナ内に入ってるので Python 環境を切り替えるたびにそれをインストールしないといけないのがイけてないと思う。jupyter のコンテナだけ立ち上げてそれをカーネルとして用いる使い方はいいかもね。

関連記事

https://zenn.dev/derbuihan/articles/928ae5f279afbc

https://zenn.dev/derbuihan/articles/cb6b7a84dd6dc0

https://zenn.dev/derbuihan/articles/c1d6379dfe198d

脚注
  1. https://zenn.dev/derbuihan/articles/928ae5f279afbc ↩︎

Discussion