【CUDA】CUDA 12.xとcuDNN 9の互換性マトリクス完全ガイド:環境構築エラー解決法

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

深層学習フレームワーク(PyTorch、TensorFlowなど)の環境構築時、特にCUDA 12.xとcuDNN 9の組み合わせで、以下のようなエラーメッセージに遭遇することがあります。

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
E tensorflow/stream_executor/cuda/cuda_dnn.cc:378] Loaded runtime CuDNN library: 8.9.7 but source was compiled with: 9.0.0.

これらのエラーは、インストールしたCUDAツールキットのバージョンと、フレームワークが要求する(またはシステムにインストールされている)cuDNNライブラリのバージョン間に互換性がない場合に発生します。CUDA 12.xは複数のcuDNNバージョン(8.x系と9.x系)をサポートしていますが、組み合わせを間違えると環境が正常に機能しません。

原因の解説:バージョン管理の複雑さ

この問題の根本原因は、CUDA、cuDNN、そして深層学習フレームワークの間にある複雑な依存関係とバージョン管理にあります。

1. CUDAとcuDNNのリリースサイクルの違い

CUDAツールキットはNVIDIAが提供するGPU計算プラットフォームの基盤です。一方、cuDNN(CUDA Deep Neural Network library)は、深層学習の基本演算をGPU上で高速に実行するための特化されたライブラリです。これらは独立して開発・リリースされるため、すべてのCUDAバージョンがすべてのcuDNNバージョンと互換性があるわけではありません。

2. フレームワークの事前ビルドバイナリの依存関係

PyTorchやTensorFlowは、ユーザーの利便性のために特定のCUDA/cuDNNバージョンに対して事前にコンパイルされたバイナリ(pip installで取得するもの)を提供しています。例えば、torch==2.3.0cu121バージョンは、CUDA 12.1と特定のcuDNNバージョン(多くの場合cuDNN 8.9系)に対してビルドされています。この組み合わせから外れると、ライブラリの読み込みに失敗します。

3. システムパスの設定ミス

正しいバージョンのcuDNNをダウンロードしても、ライブラリパス(LD_LIBRARY_PATH)やcuDNNのインストールディレクトリが適切に設定されていないと、システムは必要な.soファイルを見つけることができません。

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

以下に、CUDA 12.x環境でcuDNN 9を正しく設定する手順を説明します。

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

まず、NVIDIAの公式ドキュメントで互換性を確認します。CUDA 12.xは主に以下のcuDNNバージョンと互換性があります。

  • CUDA 12.0: cuDNN 8.9.x, 8.8.x, 8.7.x
  • CUDA 12.1 / 12.2 / 12.3 / 12.4: cuDNN 9.x.x (9.0.0以降), 8.9.x, 8.8.x

重要なポイント: CUDA 12.1以降では、cuDNN 9.x系が正式にサポートされています。しかし、フレームワークのバイナリがcuDNN 8.x系に依存している場合は、cuDNN 9をインストールしても使われない可能性があります。

ステップ2:使用するフレームワークの要件を確認

インストールしようとしているフレームワークのバージョンが、どのCUDA/cuDNNバージョンを要求するかを確認します。

PyTorchの例(2024年5月時点):

# CUDA 12.1用のPyTorch 2.3.0は、内部的にcuDNN 8.9系を想定している
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121

TensorFlowの例:

# TensorFlow 2.15以降、公式pipパッケージはCUDA 12をサポート(内部のcuDNNバージョンはパッケージに同梱)
pip install tensorflow[and-cuda]==2.15

フレームワークの公式インストールガイドやpipのバージョン指定(cu121など)を必ず確認してください。

ステップ3:cuDNN 9のインストール(必要な場合)

フレームワークがcuDNN 9を要求する場合(またはソースからビルドする場合)は、以下の手順でインストールします。

1. NVIDIA Developerサイトから、ご自身のCUDAバージョンに対応するcuDNN 9.xのアーカイブ(例: cudnn-linux-x86_64-9.0.0-cuda12-archive.tar.xz)をダウンロードします(ログインが必要)。
2. ダウンロードしたファイルを展開し、ファイルをCUDAツールキットのインストールディレクトリにコピーします。

# 例: CUDA 12.1が /usr/local/cuda-12.1 にインストールされている場合
tar -xvf cudnn-linux-x86_64-9.0.0-cuda12-archive.tar.xz
sudo cp cudnn-*-archive/include/cudnn*.h /usr/local/cuda-12.1/include/
sudo cp -P cudnn-*-archive/lib/libcudnn* /usr/local/cuda-12.1/lib64/
sudo chmod a+r /usr/local/cuda-12.1/include/cudnn*.h /usr/local/cuda-12.1/lib64/libcudnn*

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

システムが正しいcuDNNライブラリを見つけられるように、環境変数を設定します。~/.bashrcまたは~/.zshrcに以下を追加します。

export PATH=/usr/local/cuda-12.1/bin${PATH:+:${PATH}}
export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}
export CUDA_HOME=/usr/local/cuda-12.1

変更を反映させます。

source ~/.bashrc  # または source ~/.zshrc

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

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

# CUDAバージョンの確認
nvcc --version

# cuDNNバージョンの確認(ヘッダとライブラリのバージョンを比較)
cat /usr/local/cuda-12.1/include/cudnn_version.h | grep -E "CUDNN_MAJOR|CUDNN_MINOR|CUDNN_PATCHLEVEL"
# または
cat /usr/local/cuda/include/cudnn_version.h | grep -E "CUDNN_MAJOR|CUDNN_MINOR|CUDNN_PATCHLEVEL"

出力例:

#define CUDNN_MAJOR 9
#define CUDNN_MINOR 0
#define CUDNN_PATCHLEVEL 0
...

Pythonからも確認できます。

python -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}'); print(f'CUDA version: {torch.version.cuda}')"

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

エラー例1:ライブラリが見つからない

エラーメッセージ: libcudnn.so.9: cannot open shared object file
解決策: シンボリックリンクの確認と作成。

# libcudnn.so.9へのシンボリックリンクが存在するか確認
ls -la /usr/local/cuda/lib64/libcudnn.so*

# 存在しない場合、適切なバージョンへのリンクを作成
# 例: libcudnn.so.9.0.0 が存在する場合
sudo ln -s /usr/local/cuda/lib64/libcudnn.so.9.0.0 /usr/local/cuda/lib64/libcudnn.so.9
sudo ldconfig  # キャッシュの更新

エラー例2:バージョン不一致

エラーメッセージ: Loaded runtime CuDNN library: 8.9.7 but source was compiled with: 9.0.0
解決策: フレームワークを、システムのcuDNNバージョンと一致するものにダウングレードするか、システムのcuDNNをアップグレードします。または、フレームワークをソースからビルドします(上級者向け)。最も安全なのは、フレームワークの公式pipバイナリがサポートする組み合わせに環境を合わせることです。

まとめ・補足情報

CUDA 12.xとcuDNN 9の環境構築では、以下のポイントを押さえることが成功の鍵です。

  1. 公式情報を第一に参照する: NVIDIAの互換性表と、PyTorch/TensorFlowの公式インストールガイドが最も信頼できる情報源です。
  2. 「フレームワークの要求」を最優先する: システムにCUDA 12.4とcuDNN 9.3が入っていても、インストールするPyTorchバイナリがcuDNN 8.9を要求していれば、そちらが使用されます。無理にcuDNN 9を使わせようとすると問題が発生します。
  3. コンテナ技術の活用を検討する: DockerやNVIDIA Container Toolkitを利用すれば、プロジェクトごとに独立したCUDA/cuDNN環境を簡単に構築でき、ホスト環境の汚染やバージョン競合を防げます。
  4. バージョン固定の重要性: プロジェクトのrequirements.txtや環境設定ファイルに、CUDA、cuDNN、フレームワークのバージョンを明記することで、再現性のある環境を構築できます。

深層学習の開発環境構築は、バージョン依存の迷路に感じられるかもしれません。しかし、互換性マトリクスを理解し、フレームワークが求める環境を正確に構築するという基本手順を踏むことで、ほとんどの問題は解決できます。本ガイドが、皆さんのGPUを活用したAI開発の助けとなれば幸いです。

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