問題の概要: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.0のcu121バージョンは、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の環境構築では、以下のポイントを押さえることが成功の鍵です。
- 公式情報を第一に参照する: NVIDIAの互換性表と、PyTorch/TensorFlowの公式インストールガイドが最も信頼できる情報源です。
- 「フレームワークの要求」を最優先する: システムにCUDA 12.4とcuDNN 9.3が入っていても、インストールするPyTorchバイナリがcuDNN 8.9を要求していれば、そちらが使用されます。無理にcuDNN 9を使わせようとすると問題が発生します。
- コンテナ技術の活用を検討する: DockerやNVIDIA Container Toolkitを利用すれば、プロジェクトごとに独立したCUDA/cuDNN環境を簡単に構築でき、ホスト環境の汚染やバージョン競合を防げます。
- バージョン固定の重要性: プロジェクトの
requirements.txtや環境設定ファイルに、CUDA、cuDNN、フレームワークのバージョンを明記することで、再現性のある環境を構築できます。
深層学習の開発環境構築は、バージョン依存の迷路に感じられるかもしれません。しかし、互換性マトリクスを理解し、フレームワークが求める環境を正確に構築するという基本手順を踏むことで、ほとんどの問題は解決できます。本ガイドが、皆さんのGPUを活用したAI開発の助けとなれば幸いです。