🌐

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

2023/05/25に公開約3,500字

はじめに

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

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

設定の方針を以下に示す。

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

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

この記事を書いてる時点では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を用いた機械学習の開発環境を構築した。このやり方はgithubから落としてきたコードを動かすにはいいと思う。

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

Discussion

ログインするとコメントできます