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

問題の概要:CUDA 12.xとcuDNN 9の互換性エラー

CUDA 12.x環境でcuDNN 9.xを利用しようとすると、頻繁に互換性エラーが発生します。具体的には、PyTorchやTensorFlowなどのディープラーニングフレームワークをインポート・実行する際に、以下のようなエラーメッセージが表示され、学習や推論が開始できない状況に陥ります。

RuntimeError: cuDNN version mismatch: PyTorch was compiled against cuDNN 8.x.x but you have cuDNN 9.x.x.
E tensorflow/stream_executor/cuda/cuda_dnn.cc:378] Loaded runtime cuDNN library: 9.x.x but source was compiled with: 8.x.x.
cudnnGetVersion() mismatch. Major version is incompatible.

これらのエラーは、インストールしたCUDAツールキットのバージョン、cuDNNライブラリのバージョン、そして事前コンパイルされたAIフレームワークのバイナリ(pipでインストールしたもの)の間で、想定されるcuDNNのメジャーバージョンが一致していないことが原因です。特に、CUDA 12.1以降とcuDNN 9の組み合わせで顕著に発生します。

原因の解説:なぜ互換性問題が起こるのか

この問題の根本原因は、以下の3点に集約されます。

1. フレームワークの事前コンパイルバイナリとローカル環境の不一致

PyTorchやTensorFlowは、配布の利便性とインストールの簡便さから、公式のpipパッケージとして「特定のCUDAバージョンとcuDNNバージョンに対して事前にコンパイルされたバイナリ」を提供しています。例えば、torch==2.1.0+cu121 はCUDA 12.1用にビルドされていますが、この時点でリンクされるcuDNNは(多くの場合)バージョン8系です。ユーザーがローカル環境にcuDNN 9をインストールしていると、実行時にバージョン不一致エラーが発生します。

2. CUDA 12.xとcuDNN 9の公式互換性マトリクス

NVIDIAの公式ドキュメントを確認すると、CUDAツールキットのバージョンとcuDNNのバージョンには厳密な対応関係があります。CUDA 12.xは、そのマイナーバージョンによって対応するcuDNNのバージョンが異なります。

  • CUDA 12.0, 12.1: 公式にはcuDNN 8.x.xが推奨・サポートされています。cuDNN 9.x.xは非対応です。
  • CUDA 12.2以降 (12.2, 12.3, 12.4): cuDNN 8.x.x および 9.x.x の両方をサポートしています。

つまり、CUDA 12.0や12.1をインストールしている環境でcuDNN 9を無理やり使おうとすると、ライブラリレベルで未定義のシンボルエラーなど、より深刻な問題が発生する可能性があります。

3. 環境変数とライブラリパスの競合

LD_LIBRARY_PATHPATHに複数のCUDA/cuDNNバージョンのパスが含まれている場合、意図しないバージョンのライブラリが読み込まれてしまうことがあります。これが「環境はCUDA 12.1なのに、なぜかcuDNN 9が検出される」という矛盾した状況を生み出す原因の一つです。

解決方法:ステップバイステップガイド

問題を解決するには、環境のCUDAバージョンと、使用するAIフレームワークが要求するcuDNNバージョンを整合させる必要があります。以下のステップに従って確認・修正を行ってください。

ステップ1:現在の環境を正確に把握する

まず、インストールされているCUDAとcuDNNのバージョンを確認します。

# CUDAツールキットのバージョン確認
nvcc --version
# または
cat /usr/local/cuda/version.txt

# cuDNNのバージョン確認 (方法1: ヘッダーとライブラリの確認)
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# cuDNNのバージョン確認 (方法2: Pythonからの確認 - フレームワークが読み込むバージョン)
python -c "import torch; print(torch.backends.cudnn.version())"
python -c "import tensorflow as tf; print(tf.sysconfig.get_build_info()['cudnn_version'])" 2>/dev/null || echo "TensorFlow not installed or version info unavailable"

ステップ2:互換性マトリクスに基づいて方針を決定する

確認したバージョンに基づき、以下のフローチャートに従って対応を決定します。

  1. CUDA 12.0/12.1 + cuDNN 9 が検出された場合: これは非互換な組み合わせです。ステップ3-A「cuDNNをダウングレード」を実行してください。
  2. CUDA 12.2以降 + cuDNN 9 が検出された場合: ハードウェア的には互換性があります。しかし、フレームワークエラーが発生するなら、ステップ3-B「フレームワークを再インストールまたはソースからビルド」を検討してください。
  3. CUDA 12.x + cuDNN 8 が検出された場合: これは安定した組み合わせです。エラーが発生する場合は、フレームワークのCUDAバージョン指定が間違っている可能性が高いです(ステップ3-Bを参照)。

ステップ3-A:cuDNNをダウングレードする(推奨)

最も確実で一般的な解決策は、環境に合ったcuDNN 8.xをインストールすることです。

# 1. 既存のcuDNN関連ファイルを削除 (慎重に実行)
sudo rm -rf /usr/local/cuda/include/cudnn*
sudo rm -rf /usr/local/cuda/lib64/libcudnn*

# 2. NVIDIA公式アカウントから互換性のあるcuDNN 8.x.xをダウンロード
# 例: CUDA 12.1用のcuDNN 8.9.xを選択
# ダウンロードしたtarファイルを展開
tar -xvf cudnn-linux-x86_64-8.9.x.xx_cuda12-archive.tar.xz

# 3. ファイルをCUDAツールキットディレクトリにコピー
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda/lib64/
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

# 4. ライブラリキャッシュの更新
sudo ldconfig

ステップ3-B:フレームワークを正しいバージョンで再インストールする

cuDNNを変更せず、フレームワーク側を環境に合わせます。PyTorchの場合、公式サイトのインストールコマンドジェネレータで、自分のCUDAバージョンに合ったコマンドを取得します。

# 例: CUDA 12.1環境で、cuDNN 8にリンクされたPyTorchをインストール
pip uninstall torch torchvision torchaudio -y
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# TensorFlowの場合 (CUDA 12.0/12.1 + cuDNN 8環境向け)
pip install tensorflow[and-cuda]==2.13.*  # 2.13以降はCUDA 12をサポート
# または、より厳密にバージョン指定
pip install nvidia-cudnn-cu12==8.9.* tensorflow==2.13.*

注意: TensorFlow 2.10以降、tensorflow[and-cuda]メタパッケージやnvidia-cudnn-cu12パッケージの使用が推奨され、ローカルへのcuDNN手動インストールが不要になる場合があります。

ステップ4:環境変数の確認と整理

不要なパスが設定されていないか確認し、クリーンな状態にします。

# 現在の環境変数を確認
echo $LD_LIBRARY_PATH
echo $PATH

# .bashrcや.zshrcに以下のような設定があることを確認
# CUDA 12.1が /usr/local/cuda にインストールされている場合
export PATH=/usr/local/cuda/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH

# 他のCUDAバージョンのパス(例: /usr/local/cuda-11.8)が先頭に来ていないか確認し、必要なら修正する。

コード例・コマンド例:検証スクリプト

以下のPythonスクリプトを実行することで、環境の整合性を総合的にチェックできます。

import subprocess
import sys

def run_cmd(cmd):
    try:
        result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
        return result.stdout.strip()
    except Exception as e:
        return f"Error: {e}"

print("=== CUDA/cuDNN 環境チェック ===")
# 1. nvccバージョン
print("1. nvcc version:", run_cmd("nvcc --version | grep 'release' | awk '{print $6}' | sed 's/,//'"))
# 2. cuDNNバージョン (システム)
print("2. System cuDNN version (header):", run_cmd("grep CUDNN_MAJOR /usr/local/cuda/include/cudnn_version.h 2>/dev/null | head -1 | awk '{print $3}'") + "." +
                                           run_cmd("grep CUDNN_MINOR /usr/local/cuda/include/cudnn_version.h 2>/dev/null | head -1 | awk '{print $3}'") + "." +
                                           run_cmd("grep CUDNN_PATCHLEVEL /usr/local/cuda/include/cudnn_version.h 2>/dev/null | head -1 | awk '{print $3}'"))
# 3. PyTorchから見える環境
try:
    import torch
    print("3. PyTorch Version:", torch.__version__)
    print("   PyTorch CUDA Available:", torch.cuda.is_available())
    print("   PyTorch CUDA Version:", torch.version.cuda)
    print("   PyTorch cuDNN Version:", torch.backends.cudnn.version())
except ImportError:
    print("3. PyTorch is not installed.")

print("n=== 推奨アクション ===")
print("CUDA 12.0/12.1 を使用中で cuDNN 9 が検出された場合:")
print("  -> cuDNN 8.x.x をインストールしてください (ステップ3-A)。")
print("フレームワークのエラーのみの場合:")
print("  -> フレームワークをCUDAバージョンに合ったものに再インストールしてください (ステップ3-B)。")

まとめ・補足情報

CUDA 12.xとcuDNN 9の互換性問題は、バージョン管理の厳密さが原因です。特にCUDA 12.0/12.1ユーザーは、cuDNN 9ではなくcuDNN 8を選択することが安定運用への近道です。CUDA 12.2以降を使用できるのであれば、より新しいcuDNN 9の機能を活用する道も開けていますが、その場合はフレームワークをソースからビルドする必要が生じる可能性が高まります。

重要なポイント:

  • 常にNVIDIAの公式cuDNNサポートマトリクスを参照する。
  • PyTorch/TensorFlowインストール時は、公式が提供する自分のCUDAバージョン用のバイナリを利用する。
  • Dockerを利用する場合は、nvidia/cudaやフレームワーク公式のDockerイメージを使用すると、ビルド済みの整合性の取れた環境を簡単に得られる。
  • エラー発生時は、エラーメッセージをよく読み、どのコンポーネント(CUDA、cuDNN、フレームワーク)のどのバージョンが不一致を起こしているのかを特定することから始める。

環境構築はAI開発の第一歩であり、時に時間を要します。本ガイドが、CUDAとcuDNNのバージョン地獄から抜け出す一助となれば幸いです。

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