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

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

深層学習フレームワーク(PyTorch, TensorFlowなど)のGPU環境構築時に、CUDA 12.xとcuDNN 9のバージョン不一致によるエラーが頻発します。具体的には、プログラム実行時に以下のようなエラーメッセージが表示され、学習や推論が開始できない状況に陥ります。

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
# または
ImportError: libcudnn.so.9: cannot open shared object file: No such file or directory

これらのエラーは、インストールしたCUDAツールキットのバージョンと、深層学習ライブラリが要求するcuDNNのバージョンに互換性がない場合、またはパスが正しく設定されていない場合に発生します。特にCUDA 12.xは複数のマイナーバージョン(12.0, 12.1, 12.2, 12.3, 12.4)が存在し、それぞれに対応するcuDNNのバージョンが異なるため、設定が複雑化しています。

原因の解説:バージョン管理の複雑さと依存関係

この互換性問題の根本的な原因は以下の3点に集約されます。

1. 厳密なバージョン依存関係

CUDAツールキットとcuDNNは、単に「メジャーバージョンが合っていれば良い」というものではありません。CUDA 12.1用にビルドされたcuDNNは、CUDA 12.2や12.3では動作しない可能性が高く、マイナーバージョン単位での厳密な一致が求められます。NVIDIAが提供する互換性マトリクスを無視した組み合わせでは、ライブラリの初期化に失敗します。

2. フレームワーク側の要求バージョン

PyTorchやTensorFlowなどのフレームワークは、特定のCUDA/cuDNNバージョンの組み合わせに対してプリビルドされたバイナリを提供しています。例えば、PyTorch 2.0以降の多くのバージョンはCUDA 11.8をベースとしていますが、CUDA 12.1用のビルドも存在します。フレームワークが要求するバージョンと、実際にシステムにインストールされているバージョンに齟齬があるとエラーが発生します。

3. 環境変数とシンボリックリンクの不備

CUDAやcuDNNを正しいバージョンでインストールしても、環境変数(LD_LIBRARY_PATH, PATH)の設定や、ライブラリファイルへのシンボリックリンクが適切でない場合、実行時にライブラリを見つけられず「not initialized」エラーが発生します。

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

以下に、CUDA 12.xとcuDNN 9の環境を確実に構築する手順を説明します。

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

まず、使用したいCUDAバージョンに対応するcuDNNのバージョンを、NVIDIAの公式ドキュメントで確認します。CUDA 12.xとcuDNN 9.xの主要な互換性は以下の通りです(2024年5月時点)。

  • CUDA 12.4: cuDNN 9.2.x 以上(推奨: 9.3.0以上)
  • CUDA 12.3: cuDNN 9.1.x 以上(推奨: 9.2.0以上)
  • CUDA 12.2: cuDNN 9.0.x 以上(推奨: 9.1.0以上)
  • CUDA 12.1: cuDNN 8.9.x 以上(注: cuDNN 9.xは非対応
  • CUDA 12.0: cuDNN 8.9.x 以上(注: cuDNN 9.xは非対応

重要な注意点: CUDA 12.0/12.1はcuDNN 9.xと互換性がありません。CUDA 12.2以降を使用する必要があります。

ステップ2:CUDAツールキットのインストールと確認

CUDA 12.2以降をインストールします。NVIDIA公式サイトからrunfile(local)インストーラーをダウンロードする方法が確実です。

# 既存のドライバーが古い場合はアップデート(オプション)
sudo apt update
sudo apt upgrade nvidia-driver-550 # ドライバーバージョンは環境に合わせる

# CUDA 12.4のrunfileインストール例
wget https://developer.download.nvidia.com/compute/cuda/12.4.0/local_installers/cuda_12.4.0_550.54.14_linux.run
sudo sh cuda_12.4.0_550.54.14_linux.run

インストール後、バージョンを確認します。

nvcc --version
# 出力例: nvcc: NVIDIA (R) Cuda compiler driver
#         Copyright (c) 2005-2023 NVIDIA Corporation
#         Built on Wed_Nov_22_10:17:15_PST_2023
#         Cuda compilation tools, release 12.4, V12.4.99

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

NVIDIA Developerアカウントでログイン後、cuDNNのアーカイブから対応バージョンをダウンロードします。CUDA 12.4の場合はcuDNN 9.3.0を選択します。

# 例: cuDNN 9.3.0 for CUDA 12.x (Local Installer for Linux x86_64 (Tar))
# ファイル名: cudnn-linux-x86_64-9.3.0.98_cuda12-archive.tar.xz

# ダウンロード後、解凍してライブラリをコピー
tar -xvf cudnn-linux-x86_64-9.3.0.98_cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.4/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.4/lib64/
sudo chmod a+r /usr/local/cuda-12.4/include/cudnn*.h /usr/local/cuda-12.4/lib64/libcudnn*

ステップ4:環境変数の設定

.bashrcまたは.zshrcに以下の環境変数を追加します。パスはインストールしたCUDAバージョンに合わせて変更してください。

# ~/.bashrc に追加
export PATH=/usr/local/cuda-12.4/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-12.4

# 変更を反映
source ~/.bashrc

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

cuDNNが正しく認識されているか確認します。

# 方法1: ヘッダーファイルのバージョン確認
cat /usr/local/cuda-12.4/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# 出力例:
# #define CUDNN_MAJOR 9
# #define CUDNN_MINOR 3
# #define CUDNN_PATCHLEVEL 0

# 方法2: サンプルプログラムでの検証(より確実)
cp -r /usr/local/cuda-12.4/samples ~/cuda-samples
cd ~/cuda-samples
make -j$(nproc) # 時間がかかります
./bin/x86_64/linux/release/mnistCUDNN
# 「Test passed!」と表示されれば成功

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

エラー例1: 「libcudnn.so.9」が見つからない

このエラーは、シンボリックリンクが正しく作成されていない場合に発生します。

# シンボリックリンクの確認
ls -la /usr/local/cuda-12.4/lib64/libcudnn*
# 出力に libcudnn.so.9 へのリンクがない場合

# 手動でシンボリックリンクを作成(バージョン番号は環境に合わせる)
sudo ln -sf /usr/local/cuda-12.4/lib64/libcudnn.so.9.3.0 /usr/local/cuda-12.4/lib64/libcudnn.so.9
sudo ln -sf /usr/local/cuda-12.4/lib64/libcudnn.so.9 /usr/local/cuda-12.4/lib64/libcudnn.so
sudo ldconfig

エラー例2: PyTorch/TensorFlowとのバージョン不一致

フレームワーク側の要求とシステムのCUDAバージョンが合わない場合。

# PyTorchのインストール例(CUDA 12.1用)
# 誤ったコマンド(システムがCUDA 12.4なのに):
pip3 install torch torchvision torchaudio

# 正しいコマンド(CUDA 12.4用のwheelを指定):
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu124

# TensorFlowのインストール例
# CUDA 12.0/12.1用(cuDNN 8.9.xが必要):
pip install tensorflow[and-cuda]==2.13.0

# CUDA 12.2以降用(公式サポートは限定的):
# ソースからのビルドまたはNVIDIAが提供するNGCコンテナの使用を推奨

まとめ・補足情報

CUDA 12.xとcuDNN 9の環境構築で最も重要なのは、マイナーバージョンを含めた完全な互換性マトリクスの遵守です。特にCUDA 12.0/12.1とcuDNN 9.xの組み合わせはサポート外であることを覚えておきましょう。

実践的なアドバイスとして、以下の点を推奨します:

  1. コンテナ技術の活用: DockerやNVIDIA NGCカタログが提供するプリビルド済みコンテナ(例: nvcr.io/nvidia/pytorch:23.10-py3)を使用すれば、複雑な環境構築を回避できます。
  2. バージョン固定: requirements.txtや環境設定ファイルに、CUDA、cuDNN、フレームワークのバージョンを明記し、再現性を確保します。
  3. 段階的検証: CUDAのインストール → cuDNNのインストール → フレームワークのインストールの各段階で、それぞれの動作確認を行い、問題を早期に発見・切り分けます。

最後に、NVIDIAの公式ドキュメントは頻繁に更新されるため、最新の互換性情報は常にcuDNN Support Matrixで確認する習慣をつけることが、最も確実なトラブルシューティングの第一歩となります。

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