問題の概要:CUDA 12.xとcuDNN 9の互換性エラー
CUDA 12.x環境でcuDNN 9を利用しようとすると、様々なエラーが発生し、深層学習フレームワーク(PyTorch, TensorFlowなど)の起動やGPU演算に失敗することがあります。具体的には、以下のようなエラーメッセージが表示されます。
# よくあるエラーメッセージ例
CUDNN_STATUS_NOT_INITIALIZED
Could not load dynamic library 'libcudnn.so.9'
cudnnGetVersion() was unable to find the cuDNN library
RuntimeError: cuDNN error: CUDNN_STATUS_VERSION_MISMATCH
これらのエラーは、CUDA ToolkitのバージョンとcuDNNライブラリのバージョン間に互換性がないことが主な原因です。CUDA 12.xは比較的新しいメジャーバージョンであり、対応するcuDNNのバージョンを正しく選択・設定する必要があります。
原因の解説:バージョン管理の複雑さ
CUDA(Compute Unified Device Architecture)はNVIDIAが提供するGPU向け並列コンピューティングプラットフォームであり、cuDNN(CUDA Deep Neural Network library)はその上で深層学習演算を高速化するライブラリです。両者は密接に連携するため、厳格なバージョン互換性が要求されます。
問題の根本原因は主に以下の3点です。
1. 公式互換性マトリクスの見落とし
CUDA 12.x(特に12.0, 12.1, 12.2, 12.3, 12.4)は、cuDNN 9の一部のマイナーバージョン(サブバージョン)とのみ互換性があります。cuDNN 9.0.0とCUDA 12.3のような組み合わせでは動作しないケースが多発しています。
2. システムパスとシンボリックリンクの不整合
複数のCUDA/cuDNNバージョンをインストールしている場合、環境変数LD_LIBRARY_PATHやPATH、および/usr/local/cudaのシンボリックリンクが、意図しないバージョンを指している可能性があります。
3. フレームワーク側の依存関係
PyTorchやTensorFlowなどのフレームワークは、特定のCUDA/cuDNNバージョンを前提としてビルドされたパッケージを提供しています。例えば「PyTorch with CUDA 12.1」用のパッケージは、cuDNN 8.9.x以降を必要とする場合が多く、cuDNN 9.0.0以前を使うとエラーが発生します。
解決方法:ステップバイステップ設定ガイド
以下に、CUDA 12.x環境で正しくcuDNNを動作させるための具体的な手順を説明します。
ステップ1:公式互換性マトリクスの確認
まず、NVIDIAの公式ドキュメントで互換性を確認します。現時点での主要な互換性は以下の通りです(詳細は変更される可能性があるため、常に最新情報を確認してください)。
# CUDA 12.x と cuDNN の主要互換性マトリクス(一部抜粋)
- CUDA 12.4: cuDNN 9.2.x, 9.3.x, 9.4.x
- CUDA 12.3: cuDNN 9.1.x, 9.2.x, 9.3.x
- CUDA 12.2: cuDNN 9.0.x, 9.1.x
- CUDA 12.1: cuDNN 8.9.x, 9.0.x
- CUDA 12.0: cuDNN 8.9.x
# 注意: 「x」はマイナーバージョン(例: 9.1.0, 9.1.1)を示します。
自身のCUDAバージョンは以下のコマンドで確認できます。
nvcc --version
# または
nvidia-smi # 上部に表示されるCUDA Versionはドライバの最大対応バージョンなので注意
ステップ2:適切なcuDNNバージョンのダウンロードとインストール
NVIDIA Developerサイトから、自身のCUDAバージョンに対応するcuDNNパッケージをダウンロードします。アカウント作成が必要です。
例:CUDA 12.3環境にcuDNN 9.3.0をインストールする場合
# 1. ダウンロードしたtarファイルを解凍
tar -xvf cudnn-linux-x86_64-9.3.0.xx_cuda12-archive.tar.xz
# 2. ファイルをCUDA Toolkitディレクトリにコピー
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.3/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.3/lib64/
sudo chmod a+r /usr/local/cuda-12.3/include/cudnn*.h /usr/local/cuda-12.3/lib64/libcudnn*
# 3. シンボリックリンクの更新(/usr/local/cuda が 12.3 を指すように)
sudo rm /usr/local/cuda # 既存のリンクを削除(存在する場合)
sudo ln -s /usr/local/cuda-12.3 /usr/local/cuda
ステップ3:環境変数の設定
.bashrcまたは.zshrcに以下の環境変数を追加します。
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export CUDNN_PATH=/usr/local/cuda
設定を反映させます。
source ~/.bashrc # または source ~/.zshrc
ステップ4:インストール確認
以下のコマンドでCUDAとcuDNNのバージョンを確認し、互換性があることを確認します。
# CUDAバージョン確認
nvcc --version | grep "release"
# cuDNNバージョン確認
cat /usr/local/cuda/include/cudnn_version.h | grep -E "CUDNN_MAJOR|CUDNN_MINOR|CUDNN_PATCHLEVEL"
# または(ファイル名が異なる場合)
cat /usr/local/cuda/include/cudnn.h | grep -E "CUDNN_MAJOR|CUDNN_MINOR|CUDNN_PATCHLEVEL"
Pythonから確認する場合は、以下のスクリプトを実行します。
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA version: {torch.version.cuda}")
# cuDNNバージョンは以下のように確認可能
print(f"cuDNN version: {torch.backends.cudnn.version()}")
コード例・コマンド例:トラブルシューティング実践
エラーが発生した場合の具体的な調査コマンド例です。
# エラー: libcudnn.so.9 が見つからない場合
# 1. ファイルが実際に存在するか確認
find /usr/local -name "libcudnn.so.9*" 2>/dev/null
# 2. シンボリックリンクが正しいか確認
ls -la /usr/local/cuda/lib64/libcudnn*
# 3. LD_LIBRARY_PATHを確認
echo $LD_LIBRARY_PATH
# 4. 一時的にパスを追加してテスト
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
python -c "import torch; print(torch.cuda.is_available())"
# エラー: バージョンミスマッチの場合
# インストールされているcuDNNの詳細バージョンを表示
cat /usr/local/cuda/include/cudnn_version.h | grep "define CUDNN" | head -5
まとめ・補足情報
CUDA 12.xとcuDNN 9の組み合わせで作業する際は、公式の互換性マトリクスを第一に参照し、マイナーバージョンまで含めて一致させることが最も重要です。特にCUDA 12.0や12.1などの初期バージョンでは、cuDNN 9の最新版ではなく、指定された特定のバージョンを使用する必要があります。
また、Dockerコンテナを利用する場合は、NVIDIAが提供する公式コンテナ(nvcr.io/nvidia/pytorch:23.xx-py3など)を使用することで、これらの互換性問題を大幅に軽減できます。これらのコンテナはあらかじめ整合性の取れたバージョンで構築されています。
最後に、CUDA/cuDNNの環境構築は複雑ですが、一度正しく設定できれば強力なGPU計算環境が手に入ります。エラーに遭遇した場合は、表示されるエラーメッセージを仔細に読み、バージョン番号に注目して調査を進めてください。