【CUDA】CUDA 12.xとcuDNN 9の互換性マトリクス完全ガイド:エラー「cudnn not initialized」を解決する環境構築手順

問題の概要:CUDA 12.x環境でのcuDNN関連エラー

CUDA 12.x(12.0, 12.1, 12.2, 12.3, 12.4など)とcuDNN 9.xを組み合わせて深層学習フレームワーク(PyTorch, TensorFlowなど)の環境を構築する際、互換性の問題に直面することがあります。具体的には、以下のようなエラーメッセージが表示され、学習や推論の実行に失敗します。

RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
# または
Could not load dynamic library 'libcudnn.so.9'; dlerror: libcudnn.so.9: cannot open shared object file: No such file or directory
# または
torch.cuda.is_available() は True を返すが、実際にGPUを使った計算を始めると上記エラーが発生する

これらのエラーは、CUDA ToolkitとcuDNNのバージョン組み合わせが公式にサポートされていない場合や、インストールパスが正しく設定されていない場合に発生します。本記事では、CUDA 12.xとcuDNN 9の正確な互換性マトリクスと、確実に動作する環境構築の手順を解説します。

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

CUDA(Compute Unified Device Architecture)はNVIDIA GPUを用いた並列計算プラットフォームであり、cuDNN(CUDA Deep Neural Network library)はその上で深層学習の基本演算を高速化するライブラリです。これらは密接に連携して動作するため、バージョン間に厳格な互換性要件が存在します。

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

1. 公式サポート外のバージョン組み合わせ

CUDAの各メジャーバージョンは、特定のメジャーバージョンのcuDNNとのみテストされ、保証されています。例えば、CUDA 12.0はcuDNN 8.xとの組み合わせが主であり、cuDNN 9.xは後続のCUDA 12.1以降で本格サポートされる場合があります。

2. シンボリックリンクまたは環境変数の不備

cuDNNは共有ライブラリ(.soファイル)の集合として提供されます。これらがシステムのライブラリ検索パス(例: /usr/local/cuda/lib64)に正しく配置されていない、またはシンボリックリンクが適切に設定されていないと、実行時にライブラリを見つけられません。

3. フレームワーク側の制約

PyTorchやTensorFlowなどのフレームワークは、特定のCUDA/cuDNNバージョンに対してビルドされたバイナリを提供しています。フレームワークが要求するcuDNNバージョンと、システムにインストールされた実際のバージョンが一致しない場合、エラーが発生します。

解決方法:ステップバイステップ環境構築ガイド

ここからは、CUDA 12.xとcuDNN 9を正しく組み合わせてインストールし、動作を確認するまでの具体的な手順を説明します。

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

まず、NVIDIAの公式ドキュメントで互換性を確認することが最も重要です。以下の組み合わせが一般的に安定して動作することが確認されています。

  • CUDA 12.1: cuDNN 8.9.x を推奨。cuDNN 9.0.0 以降もサポートされる場合が多い。
  • CUDA 12.2 / 12.3 / 12.4: cuDNN 9.x.x(9.0.0以降)を正式サポート。

重要な注意点: CUDA 12.0はcuDNN 9.xを公式にはサポートしていません。CUDA 12.0を使用している場合は、cuDNN 8.9.xまでの使用を強く推奨します。

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

NVIDIAドライバが既にインストールされていることを前提とします。以下のコマンドでCUDA 12.3をインストールする例を示します(バージョンは必要に応じて変更してください)。

# リポジトリの設定とCUDA 12.3のインストール(Ubuntu 22.04例)
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.3.2/local_installers/cuda-repo-ubuntu2204-12-3-local_12.3.2-545.23.08-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-12-3-local_12.3.2-545.23.08-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-12-3-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda-toolkit-12-3

# 環境変数をシェルの設定ファイル(~/.bashrcなど)に追加
echo 'export PATH=/usr/local/cuda-12.3/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.3/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc

# インストール確認
nvcc --version # CUDAコンパイラのバージョン確認
nvidia-smi     # ドライバとCUDAバージョンの確認(ここで表示されるCUDA Versionはドライバの最大互換バージョンです)

ステップ3:cuDNN 9.xのインストール(Debianパッケージ利用推奨)

NVIDIA Developerアカウントが必要です。ダウンロードページから「Local Installer for Linux (Deb)」を選択することをお勧めします。

# 例: CUDA 12.3用のcuDNN 9.3.0をインストール
# 1. NVIDIAサイトから以下の3つのファイルをダウンロード(例):
#    libcudnn9_9.3.0.1-1+cuda12.3_amd64.deb
#    libcudnn9-dev_9.3.0.1-1+cuda12.3_amd64.deb
#    libcudnn9-samples_9.3.0.1-1+cuda12.3_amd64.deb

# 2. インストール実行
sudo dpkg -i libcudnn9_9.3.0.1-1+cuda12.3_amd64.deb
sudo dpkg -i libcudnn9-dev_9.3.0.1-1+cuda12.3_amd64.deb
# サンプルは任意
# sudo dpkg -i libcudnn9-samples_9.3.0.1-1+cuda12.3_amd64.deb

# 3. インストール確認(シンボリックリンクの確認)
ls -la /usr/lib/x86_64-linux-gnu/libcudnn.so*
# 以下のような出力(バージョン番号は異なる場合あり)を確認:
# libcudnn.so -> libcudnn.so.9
# libcudnn.so.9 -> libcudnn.so.9.3.0

ステップ4:インストールの検証

cuDNNが正しくインストールされ、CUDAから認識されているかを確認します。

# 方法1: サンプルプログラムのコンパイルと実行(サンプルをインストールした場合)
cp -r /usr/src/cudnn_samples_v9/ $HOME
cd $HOME/cudnn_samples_v9/mnistCUDNN
make clean && make
./mnistCUDNN
# 出力の最後に "Test passed!" と表示されれば成功。

# 方法2: Pythonからの簡易確認
python3 -c "from tensorflow.python.client import device_lib; print(device_lib.list_local_devices())"
# GPUデバイス情報の中に、エラーなくcuDNNの情報が含まれているか確認。
# またはPyTorchの場合:
python3 -c "import torch; print(torch.backends.cudnn.version())"
# インストールしたcuDNNのバージョン番号(例: 9030)が表示されれば成功。

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

エラー「libcudnn.so.9: cannot open shared object file」への対処

このエラーは、ライブラリのパスが通っていないことが原因です。以下のコマンドで対処します。

# 1. ライブラリファイルが実際に存在するか確認
find /usr -name "libcudnn.so.9*" 2>/dev/null

# 2. 見つかったディレクトリをLD_LIBRARY_PATHに追加(例: /usr/lib/x86_64-linux-gnu にあった場合)
export LD_LIBRARY_PATH=/usr/lib/x86_64-linux-gnu:$LD_LIBRARY_PATH
# 恒久化するには ~/.bashrc に上記行を追加

# 3. キャッシュの更新
sudo ldconfig

# 4. cuDNNのヘッダーファイルパスも確認(開発用)
find /usr -name "cudnn.h" 2>/dev/null

PyTorchで特定のCUDA/cuDNNバージョンを使うインストールコマンド

PyTorchの公式サイトの「Previous PyTorch Versions」から、互換性のあるバージョンを選択します。

# CUDA 12.1用のPyTorch 2.3.0をインストール(pipの場合)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

# インストール後の確認
python3 -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}'); print(f'cuDNN version: {torch.backends.cudnn.version()}')"

まとめ・補足情報

CUDA 12.xとcuDNN 9の環境構築で最も重要なのは、公式の互換性マトリクスを最初に確認することです。特にCUDA 12.0とcuDNN 9の組み合わせは避け、CUDA 12.2以降を使用することをお勧めします。

インストールにはOSのパッケージマネージャ(aptdnf)やDebianパッケージ(.deb)を利用することで、依存関係やライブラリパスの設定を自動化でき、トラブルを大幅に減らせます。手動でのtarファイル展開は、パス設定ミスの原因となるため、上級者以外は避けた方が無難です。

また、DockerやNVIDIA NGCコンテナを利用する方法も有効です。これらはあらかじめ整合性の取れた環境がパッケージ化されているため、複雑な環境構築から解放されます。

# NGC PyTorchコンテナの実行例(CUDA 12.3, cuDNN 9付き)
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.10-py3

最後に、環境構築後は必ず簡単なサンプルコードやフレームワークのバージョン確認コマンドを実行し、CUDA、cuDNN、フレームワークの三者が連携して動作していることを確認してください。このステップを怠ると、後々の開発で予期せぬエラーに時間を奪われることになります。

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