【2023年版】Ubuntu Server 23.04でdockerとGPUを用いた機械学習環境を構築する方法
はじめに
Nvidia GPU を搭載した Ubuntu Server 23.04 で docker を用いた機械学習環境を構築する。ドライバーのインストール方法や Anaconda を用いた TensorFlow 環境の構築方法は以下の記事で説明した。その続きとして docker を用いた環境構築の方法を説明する。
この記事における設定の方針を以下に示す。
- 基本的に docker や Nvidia が推奨している方法を用いる。
- ドライバー以外は docker コンテナ内に閉じ込め、インストールするものを減らす。
- 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 のインストールは公式ドキュメントを参考にする。
上から順番にコピペしていけば OK。以下インストールスクリプトを実行するだけでも良い。
$ curl https://get.docker.com | sh \
&& sudo systemctl --now enable docker
インストールが終わると以下コマンドで hello-world ができる。
sudo docker run hello-world
docker インストール後の設定
以下を参考に docker インストール後の設定を行う。
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 は全て過去のものです。)この辺の混沌は以下に整理されている。
混沌を理解したら以下のインストールドキュメントに従ってインストールする。
以下コードだけそのままでは 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 にインストールする。
サーバーに SSH して以下拡張機能をインストールする。
コンテナ内の開発環境
以下手順でコンテナの開発環境を構築する。
- VSCode から U サーバーに ssh する。
- コンテナに渡したいコードのディレクトリを開く。
- 左下の緑の SSH を押して、開発コンテナー構成ファイルを追加を押す。すると.devcontainer フォルダが作成される。
- .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"
]
- 左下の緑の SSH を押して、コンテナーで再度開くを押す。
- あとは pip で好きなパッケージをインストールして開発
おわりに
docker を用いた機械学習の開発環境を構築した。
ただ、普段の勉強環境してはイマイチだと思う。VSCode の拡張機能もコンテナ内に入ってるので Python 環境を切り替えるたびにそれをインストールしないといけないのがイけてないと思う。jupyter のコンテナだけ立ち上げてそれをカーネルとして用いる使い方はいいかもね。
関連記事
Discussion