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

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

CUDA 12.x環境でcuDNN 9.xを利用しようとすると、ライブラリの読み込みに失敗したり、バージョン不一致によるエラーが頻発します。具体的には、PyTorchやTensorFlowなどの深層学習フレームワークを起動・実行する際に、以下のようなエラーメッセージが表示されることがあります。

Could not load dynamic library 'libcudnn.so.9'; dlerror: libcudnn.so.9: cannot open shared object file: No such file or directory
cudnnGetVersion() が想定外の値を返しました。インストールされているcuDNNのバージョンを確認してください。
ImportError: libcudnn.so.9: cannot open shared object file: No such file or directory

これらのエラーは、CUDAツールキットのバージョンとcuDNNライブラリのバージョン間に互換性がないことが主な原因です。特にCUDA 12はメジャーバージョンアップであり、cuDNN 8.x以前との間で大きな変更が加えられています。本記事では、CUDA 12.xとcuDNN 9.xの正しい組み合わせと、安定した環境構築の手順を詳細に解説します。

原因の解説:CUDAとcuDNNのバージョン管理

cuDNN (CUDA Deep Neural Network library) は、NVIDIAが提供するGPUアクセラレーテッドな深層学習プリミティブライブラリです。これは特定のCUDAツールキットのバージョンに対してビルドされており、厳密な互換性が要求されます。

主な原因は以下の3点です。

1. 公式サポート外の組み合わせ

CUDA 12.xは、cuDNN 8.x以降と公式に設計されて連携します。cuDNN 9.xはCUDA 12.xを主なターゲットとしてリリースされています。問題は、CUDA 12.0、12.1、12.2、12.3などのマイナーバージョンと、cuDNN 9.0.0、9.1.0、9.2.0などのマイナーバージョンの間で、細かい互換性の要件があることです。互換性マトリクスを無視してインストールすると、シンボルエラーや実行時エラーが発生します。

2. シンボリックリンクの不備

多くのインストールガイドでは、ダウンロードしたcuDNNのファイルを/usr/local/cudaディレクトリにコピーします。この際、ライブラリファイル(libcudnn.so.9.x.x)から汎用的な名前(libcudnn.so.9)へのシンボリックリンクが正しく作成されていないと、フレームワークがライブラリを見つけられず、冒頭のエラーが発生します。

3. 環境変数の設定ミス

LD_LIBRARY_PATHPATH環境変数に、インストールしたcuDNNライブラリへのパスが含まれていない場合、システムはライブラリを発見できません。

解決方法:互換性マトリクスに基づくステップバイステップ設定

以下に、CUDA 12.xとcuDNN 9.xを正しく組み合わせてインストールする手順を説明します。

ステップ1:互換性マトリクスの確認

まず、NVIDIA公式のcuDNNサポートマトリクスを必ず確認してください。執筆時点での主要な互換性は以下の通りです。

  • CUDA 12.4: cuDNN 9.2.0以上(推奨: 9.3.x)
  • CUDA 12.3: cuDNN 9.0.0以上(推奨: 9.1.x, 9.2.x)
  • CUDA 12.2: cuDNN 9.0.0以上
  • CUDA 12.1: cuDNN 9.0.0以上
  • CUDA 12.0: cuDNN 9.0.0以上

重要: CUDAのマイナーバージョン(例:12.1)と、cuDNNのマイナーバージョン(例:9.1.0)を可能な限り最新の安定版で揃えることが、後続のエラーを防ぐコツです。

ステップ2:CUDA 12.xのインストール確認

既にCUDAがインストールされているか、以下のコマンドでバージョンを確認します。

nvcc --version
# または
cat /usr/local/cuda/version.json | grep -A 2 cuda

出力例:

nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Tue_Aug_15_22:02:13_PDT_2023
Cuda compilation tools, release 12.2, V12.2.140

CUDAがインストールされていない、または古いバージョンの場合は、NVIDIA公式サイトからインストーラーをダウンロードしてインストールします。

ステップ3:互換性のあるcuDNN 9.xのインストール

1. NVIDIA cuDNNダウンロードページ(要ログイン)にアクセスし、あなたのCUDAバージョンに対応するcuDNN 9.xバージョンを選択します。例えば、CUDA 12.2の場合、「Download cuDNN v9.2.0 (October 3rd, 2023), for CUDA 12.x」といったアーカイブを選択します。
2. ローカルマシンにダウンロードしたら(例:cudnn-linux-x86_64-9.2.0.70_cuda12-archive.tar.xz)、以下のコマンドで展開し、ファイルを適切な場所にコピーします。

# 1. アーカイブを展開
tar -xvf cudnn-linux-x86_64-9.2.0.70_cuda12-archive.tar.xz

# 2. 展開したディレクトリに移動
cd cudnn-linux-x86_64-9.2.0.70_cuda12-archive

# 3. ヘッダーファイルとライブラリファイルをCUDAディレクトリにコピー
sudo cp include/cudnn*.h /usr/local/cuda/include
sudo cp lib/libcudnn* /usr/local/cuda/lib64

# 4. ライブラリファイルのパーミッションを変更
sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn*

ステップ4:シンボリックリンクの作成(最も重要なステップ)

コピーしたライブラリファイルに対して、適切なシンボリックリンクを作成します。これにより、libcudnn.so.9という名前でライブラリが参照できるようになります。

# /usr/local/cuda/lib64 ディレクトリに移動
cd /usr/local/cuda/lib64

# 実際のライブラリファイルを確認 (例: libcudnn.so.9.2.0)
ls -la libcudnn*

# シンボリックリンクを作成
# libcudnn.so.9.2.0 は実際のファイル名に置き換えてください
sudo ln -sf libcudnn.so.9.2.0 libcudnn.so.9
sudo ln -sf libcudnn.so.9 libcudnn.so

# リンクが正しく作成されたか確認
ls -la libcudnn.so*

出力例:

lrwxrwxrwx 1 root root       18 Mar 15 10:00 libcudnn.so -> libcudnn.so.9
lrwxrwxrwx 1 root root       22 Mar 15 10:00 libcudnn.so.9 -> libcudnn.so.9.2.0
-rw-r--r-- 1 root root 68745752 Mar 15 09:58 libcudnn.so.9.2.0

ステップ5:環境変数の設定と確認

シェルの設定ファイル(~/.bashrc または ~/.zshrc)に以下の行を追加し、変更を反映させます。

export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
export PATH=/usr/local/cuda/bin:$PATH
# 設定を反映
source ~/.bashrc  # または source ~/.zshrc

インストールが成功したか、以下のコマンドで確認します。

# cuDNNのバージョン確認方法1
cat /usr/local/cuda/include/cudnn_version.h | grep -E "CUDNN_MAJOR|CUDNN_MINOR|CUDNN_PATCHLEVEL"
# 出力例:
# #define CUDNN_MAJOR 9
# #define CUDNN_MINOR 2
# #define CUDNN_PATCHLEVEL 0

# cuDNNのバージョン確認方法2 (Python経由)
python3 -c "import torch; print(f'PyTorch cuDNN Version: {torch.backends.cudnn.version()}')"

コード例・コマンド例:トラブルシューティング集

エラー「libcudnn_adv_infer.so.9: undefined symbol」が発生した場合

これは、cuDNNライブラリとCUDAランタイムのマイナーバージョンが完全に一致していない可能性があります。一度インストールしたcuDNNを完全に削除し、CUDAバージョンに合致する正確なcuDNNアーカイブをダウンロードし直してください。

# 古いcuDNNファイルを削除
sudo rm /usr/local/cuda/include/cudnn*.h
sudo rm /usr/local/cuda/lib64/libcudnn*
# その後、ステップ3から再インストール

PyTorch/TensorFlowインストール時の注意点

pipやcondaでフレームワークをインストールする際は、必ずCUDA 12.x用のビルドを指定しましょう。

# PyTorchの場合 (公式サイト https://pytorch.org/ のコマンドを最新確認)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# TensorFlowの場合
pip install tensorflow[and-cuda]==2.13.*  # 2.13以降はCUDA 12をネイティブサポート

まとめ・補足情報

CUDA 12.xとcuDNN 9.xの環境構築では、「公式互換性マトリクスの確認」「シンボリックリンクの正確な作成」「環境変数の設定」の3点が最も重要です。特にシンボリックリンクの作成は手動作業であり、よく見落とされるため、本記事のステップ4を丁寧に実施してください。

また、Dockerを使用する場合は、NVIDIAが提供するNGCカタログのコンテナ(例:nvcr.io/nvidia/pytorch:23.10-py3)を利用することを強くお勧めします。これらのコンテナはCUDA、cuDNN、フレームワーク間の互換性が保証されており、手動設定の手間とリスクを大幅に軽減できます。

環境構築はAI開発の基礎です。一度正しく構築できれば、その後のモデル開発や実験に集中できるようになります。本ガイドが、皆さんのGPU環境構築の一助となれば幸いです。

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