概要
あるニューラルネットワークの学習をしようとしたところ、以下のような流れでエラーが発生。
- 学習しようとしたら使用GPUメモリが大きすぎてできなかった。
- 別のサーバ(もっとGPU積んであるやつ)で学習しようとDockerコンテナを立てて環境構築。
- 学習開始直後、print出力されていたログが全く表示されない(表示されても物凄く時間がかかる)。
- 長時間待ってようやく表示されたと思ったら以下のようなエラーが発生。
terminate called after throwing an instance of 'std::runtime_error'
what(): NCCL Error 1: unhandled cuda error
Aborted (core dumped)
解決方法
NVIDIAのDocker imageをDockerfileに記述していたものの、そのCUDAバージョンが適切でなかった。
元々のDOckerfileの記述
ARG CUDA="10"
ARG CUDNN="7"
FROM nvidia/cuda:${CUDA}-cudnn${CUDNN}-devel
解決後
ARG CUDA="11.3.0"
ARG CUDNN="8"
FROM nvidia/cuda:${CUDA}-cudnn${CUDNN}-devel-ubuntu20.04
nvidia-smiの出力できたCUDAバージョン
NVIDIA-SMI 470.103.01 Driver Version: 470.103.01 CUDA Version: 11.4
また学習にはpytorchを使用していたが、pytorchのバージョンも変更した。
元々のDockerfile
RUN conda install pytorch torchvision torchaudio cudatoolkit=10.2 -c pytorch-lts
解決後
RUN conda install pytorch==1.11.0 torchvision==0.12.0 torchaudio==0.11.0 cudatoolkit=11.3 -c pytorch
まとめ
元々GPUメモリが足りず処理が終了していたサーバもCUDAバージョンが11だったので、「CUDA11のやつで一応動いているのだから、CUDAバージョンは関係ないよね」と勝手に思っていたのですが、どうやらそういうわけではなかったみたいです。きちんとバージョン確認・変更する、大事。