【2023年版】Ubuntu Server 23.04でdockerとGPUを用いた機械学習環境を構築する方法
はじめに
Nvidia GPUを搭載したUbuntu Server 23.04でdockerを用いた機械学習環境を構築する。ドライバーのインストール方法やAnacondaを用いたTensorFlow環境の構築方法は以下の記事で説明した。その続きとしてdockerを用いた環境構築の方法を説明する。
設定の方針を以下に示す。
- 基本的にdockerやNvidiaが推奨している方法を用いる。
- ドライバー以外はdockerコンテナ内に閉じ込め、インストールするものを減らす。
- dockerはVSCodeから使う。
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
この記事を書いてる時点では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を用いた機械学習の開発環境を構築した。このやり方はgithubから落としてきたコードを動かすにはいいと思う。
ただ、普段の勉強環境してはイマイチだと思う。VSCodeの拡張機能もコンテナ内に入ってるのでPython環境を切り替えるたびにそれをインストールしないといけないのがイけてないと思う。jupyterのコンテナだけ立ち上げてそれをカーネルとして用いる使い方はいいかもね。
Discussion