深層学習の開発環境を構築する際、CUDAとcuDNNのバージョン不一致は多くの人が直面する古典的でありながら解決に手間取る問題です。特にCUDA 12.xとcuDNN 9.xの組み合わせでは、以下のようなエラーに悩まされたことはありませんか?
Could not load dynamic library 'libcudnn.so.9'; dlerror: libcudnn.so.9: cannot open shared object file: No such file or directory
または
cudnnGetVersion() が想定外の値を返しました。インストールされているcuDNNのバージョンを確認してください。
このエラーは、PyTorchやTensorFlowなどのフレームワークを起動した瞬間に発生し、せっかくのGPU環境が使えないというフラストレーションの原因になります。
本記事では、このエラーの根本原因である「CUDAとcuDNNのバージョン互換性」に焦点を当て、CUDA 12.x環境にcuDNN 9.xを正しくインストールし、確実に動作させるための完全な手順を解説します。単にコマンドを羅列するのではなく、「なぜその手順が必要なのか」を理解できるように構成しています。
問題の本質:CUDAとcuDNNは「一対一」ではない
まず大前提として理解すべきは、CUDAのバージョンとcuDNNのバージョンは、すべての組み合わせが互換性を持つわけではないということです。
cuDNN (CUDA Deep Neural Network library) は、NVIDIAが提供する深層学習用の最適化ライブラリです。これは特定のバージョンのCUDAツールキット向けにビルドされており、CUDAの内部APIに依存しています。そのため、CUDAのメジャー/マイナーバージョンが変わると、それに合わせてビルドされた特定のバージョンのcuDNNが必要になります。
CUDA 12はメジャーバージョンアップであり、内部構造に大きな変更がありました。したがって、CUDA 11用にビルドされたcuDNN 8.xをCUDA 12環境で使おうとすると、シンボルが見つからないなどのエラーが発生します。逆に、CUDA 12用にビルドされたcuDNN 9.xは、CUDA 11環境では動作しません。
原因の詳細解説:エラーメッセージ別の対処箇所
1. libcudnn.so.9: cannot open shared object file
このエラーは、システムが要求されたバージョンのcuDNNライブラリファイルそのものを見つけられないことを意味します。主な原因は以下です。
- cuDNNがそもそもインストールされていない
- インストールされたパスがシステムのライブラリ検索パス(
LD_LIBRARY_PATH)に含まれていない - シンボリックリンクが正しく設定されていない(後述)
2. cudnnGetVersion() が想定外の値を返しました
このエラーは、ライブラリファイルは見つかったものの、そのバージョンがフレームワーク(PyTorch/TensorFlowなど)が想定しているものと一致しない場合に発生します。例えば、フレームワークがcuDNN 9.1.0を想定しているのに、システムにはcuDNN 9.0.0がインストールされている場合などです。マイナーバージョンの不一致が原因であることが多いです。
解決への道筋:互換性マトリクスを確認せよ
問題を解決する最も確実な方法は、NVIDIAが公式に示している互換性情報に従うことです。
以下の表は、執筆時点(2024年5月)における主要なCUDA 12.xとcuDNN 9.xの互換性をまとめたものです。環境構築の際は、必ずNVIDIAの公式ドキュメントで最新情報を確認してください。
| CUDA バージョン | 互換性のある cuDNN 9.x バージョン (推奨) | 備考 |
|---|---|---|
| CUDA 12.4 | 9.3.x, 9.2.x | 最新機能を求めるなら9.3.x系が安定 |
| CUDA 12.3 | 9.2.x, 9.1.x | 広く使われる組み合わせ |
| CUDA 12.2 | 9.2.x, 9.1.x, 9.0.x | |
| CUDA 12.1 | 9.1.x, 9.0.x | |
| CUDA 12.0 | 9.0.x |
重要: 可能な限り、CUDAのマイナーバージョンに対応する、最新の安定版cuDNNを選択することを強く推奨します。これにより、既知のバグが修正され、パフォーマンスと安定性が向上します。
ステップバイステップ実践ガイド
ここからは、CUDA 12.2環境にcuDNN 9.2.0をインストールする具体例を示します。お使いのバージョンが異なる場合は、適宜読み替えてください。
ステップ1: CUDAバージョンの確認
まず、現在インストールされているCUDAのバージョンを確認します。
nvcc --version
出力例:
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
この例では、release 12.2 とあるので、CUDA 12.2がインストールされていることがわかります。
ステップ2: 対応するcuDNNのダウンロード
- NVIDIA cuDNNアーカイブページにアクセスします(NVIDIAアカウントが必要です)。
- 表を参考に、CUDA 12.2に対応するバージョン、ここでは「Download cuDNN v9.2.0 (October 3rd, 2023), for CUDA 12.x」を選択します。
- お使いのOS(例: Linux x86_64)用のローカルインストーラー(
.tar.xzファイル)をダウンロードします。ファイル名はcudnn-linux-x86_64-9.2.0.70_cuda12-archive.tar.xzのようになります。
ステップ3: cuDNNのインストールと配置
ダウンロードしたアーカイブを展開し、必要なファイルをCUDAのインストールディレクトリ(通常は/usr/local/cuda)にコピーします。
# 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のようなバージョン番号のみの名前でライブラリを探します。しかし、コピーしたファイルはlibcudnn.so.9.2.0のような完全なバージョン名です。このギャップを埋めるのがシンボリックリンクです。
# CUDAのライブラリディレクトリに移動
cd /usr/local/cuda/lib64
# 1. ソフトリンク libcudnn.so.9.2.0 -> libcudnn.so.9 を作成
# 書式: sudo ln -s <実体ファイル> <リンク名>
sudo ln -sf libcudnn.so.9.2.0 libcudnn.so.9
# 2. さらに、多くのビルドシステムが探す一般的な名前 libcudnn.so へのリンクも作成
sudo ln -sf libcudnn.so.9.2.0 libcudnn.so
ポイント: -sfオプションは、既存のリンクがあっても強制的に上書きします。以前に異なるバージョンのリンクを作成している場合に便利です。
ステップ5: ランタイムリンカのキャッシュ更新
新しいライブラリをシステムに認識させます。
sudo ldconfig /usr/local/cuda/lib64
ステップ6: インストール確認
インストールが正しく完了したか、2つの方法で確認します。
方法A: ライブラリのバージョン確認
cat /usr/local/cuda/include/cudnn_version.h | grep -E "define CUDNN_MAJOR|define CUDNN_MINOR|define CUDNN_PATCHLEVEL"
出力例:
#define CUDNN_MAJOR 9
#define CUDNN_MINOR 2
#define CUDNN_PATCHLEVEL 0
これでcuDNN 9.2.0が認識されていることが確認できます。
方法B: Pythonからの確認 (推奨)
実際に深層学習フレームワークからcuDNNを読み込めるかテストします。
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"cuDNN version: {torch.backends.cudnn.version()}")
期待する出力:
PyTorch version: 2.x.x+cu121
CUDA available: True
cuDNN version: 8902 (← これは9.2.0を意味する。詳細は後述)
torch.backends.cudnn.version()は、バージョン番号を整数(例:8902)で返します。これは (MAJOR * 1000 + MINOR * 100 + PATCH) で計算されるため、cuDNN 9.2.0 の場合は (9*1000 + 2*100 + 0) = 8902 となります。
トラブルシューティング:もしもうまくいかないらら
-
LD_LIBRARY_PATHの確認echo $LD_LIBRARY_PATH出力に
/usr/local/cuda/lib64が含まれているか確認してください。含まれていない場合は、シェルの設定ファイル(~/.bashrcや~/.zshrc)に以下を追加します。export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH source ~/.bashrc # 変更を反映 -
複数バージョンのCUDA/cuDNNが混在していないか確認
/usr/local/ディレクトリなどに、cuda-11.xやcuda-12.xなど複数のCUDAインストールがある場合、パスやシンボリックリンクが競合している可能性があります。使用するバージョンのディレクトリを明確に指定しましょう。 -
PyTorch/TensorFlowの再インストール
フレームワークをcuDNNインストール前にインストールしていた場合、それが古いバージョンにリンクされている可能性があります。仮想環境内であれば、フレームワークを再インストールするのが確実です。pip uninstall torch torchvision torchaudio pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
まとめ
CUDAとcuDNNのバージョン問題は、以下の3ステップで体系的に解決できます。
-
確認:
nvcc --versionでCUDAバージョンを特定し、公式互換性マトリクスで対応するcuDNNバージョンを決定する。 -
設置: ダウンロードしたファイルを正しい場所にコピーし、適切なシンボリックリンク(
libcudnn.so.9)を作成する。 -
検証:
torch.backends.cudnn.version()などで、フレームワークから正しく認識されているかを確認する。
環境構築は時に試行錯誤を伴いますが、互換性の原則を理解し、一歩一歩手順を踏むことで、必ず安定したGPU開発環境を手に入れることができます。
この記事の詳細版は元記事サイトで公開しています。