【CUDA】CUDA 12.xとcuDNN 9の互換性マトリクス完全ガイド:エラー「cudnnGetVersion()」の解決法

問題の概要: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_PATHPATH、および/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計算環境が手に入ります。エラーに遭遇した場合は、表示されるエラーメッセージを仔細に読み、バージョン番号に注目して調査を進めてください。

この記事は役に立ちましたか?