GPUを利用する機械学習系の環境を構築する際に 、CUDAとフレームワーク等のバージョンの整合性で困ることがある。必ずしも最新版にしておけばいいというわけではないことが結構ある(気がする)
dockerコンテナ内でgpuが利用できるようになるNvidia Container TookitをNvidiaが提供してくれているので、これを利用すると任意のCUDAバージョンの環境が構築できるようになりますという作業メモ。
1.Nvidia Container Toolkitをインストール
ホストOS側に、Nvidia Linux DriverとNvidia Container Toolkitをインストールして、docker runtimeにnvidiaランタイムを認識してもらうまで下記のマニュアルに沿って設定。
ホスト側にはNvidia Linux DriverおよびNVidia Container Toolkit だけで良いので、CUDAで気を病む必要がない(たぶん)
https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html
2.gpuが認識されているかの確認方法
これも書いてある通りだが、
$ sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
のようにして、ホストOSと同様にgpuの情報が表示されればOK。
3.dockerイメージはどこにあるの
https://hub.docker.com/r/nvidia/cuda
ここに任意のベースOSとCUDAのバージョンの組み合わせのtagがあるので、必要なものを使えば良い。
4.必要なコマンドとかが見当たらないんだけど...?
上記のDocker Imageは、NVidia関係のツールが準備されている一方、curl gitなどもインストールされてないし、python もインストールされていないっぽい。なので実際には、上記イメージをベースにして下記みたいに共通で使うパッケージをインストールしたイメージを作っておくのが良いと思う。
---------------------------------
$ cat Dockerfile
FROM nvidia/cuda:11.6.2-base-ubuntu20.04
# Install needed packages
RUN apt-get update && \
apt-get install -y --no-install-recommends curl git python3 python3-pip && \
rm -rf /var/lib/apt/lists/*
# Make python3 default
RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 1
---------------------------------
上記のうち最後の行は、Ubuntuの標準パッケージではpythonコマンドではpython2系が起動してしまうっぽいので、それを切り替える方法(詳しくはupdate-alternativesで検索せよ)。本当はpyenvとかでcuda同様に必要なpythonランタイムを選択したほうが良さそうな気もするが、とりあえずこのようにする
5.作業はどんなふうにすれば?
docker image内に入って作業するには以下のようにすれば良い。 (image名)のところは作成した任意のimage名にする。あとの注意点は--gpus allとかのオプションをつけないとだめなのと、一時的に作業とか確認したいだけのときには--rmオプションもつけないとゴミのコンテナがたくさんであとで困る(rmオプションは実行終了後に当該コンテナが自動で削除される)。
$ docker run --rm -it --gpus all (image名)