はじめに (対象読者・この記事でわかること)
この記事は、TensorFlow や PyTorch を GPU で動かしたいけれど「cuDNN が見つからない」「cuDNN のバージョンが合わない」とエラーに悩まされている方を対象にしています。
記事を読むことで、
- インストール済みの cuDNN バージョンと CUDA の対応関係を調べる
- コマンド1発で cuDNN が認識されているかチェックする
- よくあるエラー「Could not load cudnn64_8.dll」「libcudnn.so cannot open」が出たときの切り分け手順
がスッとできるようになります。筆者も RTX 3060 + Ubuntu 22.04 + TensorFlow 2.15 の環境で「なぜか cuDNN だけロードできない」という謎エラーに 3 時間潰れ、その教訓をまとめました。
前提知識
この記事を読み進める上で、以下の知識があるとスムーズです。
- NVIDIA ドライバがインストール済みであること
- CUDA Toolkit のバージョンがわかる(nvcc --version で確認できる)
- Linux であれば ldconfig や ldd コマンドを使える、Windows であれば where / dir コマンドを使える
cuDNN とは何か、なぜ「存在確認」が必要なのか
cuDNN(CUDA Deep Neural Network library)は、NVIDIA が提供する深層学習向け高速ライブラリです。TensorFlow・PyTorch・Keras は GPU モード時に「CUDA」ではなく「cuDNN」に中核ライブラリを依存しているため、cuDNN が見つからないと GPU があっても CPU フォールバックで学習が 10 倍近く遅くなります。
インストール方法は 3 パターンあります。
1. タールボール(.tgz)を展開して手動コピー
2. ディストリ付きパッケージ(.deb / .rpm)
3. conda-forge や pip で一発インストール
方法 2・3 は一見楽ですが、CUDA バージョンと cuDNN バージョンの組み合わせが合わないと「インストール済み」つまり「動かない」状態になります。そこで「本当に正しく入っているか」を確かめる作業が必要になります。
ステップバイステップで cuDNN 存在確認をする
ステップ1:バージョン番号を一覧で確認する
Linux / WSL2 の場合は以下のコマンドを打ちます。
Bash# 1. パッケージ版なら apt list --installed | grep cudnn # 2. conda 環境なら conda list cudnn # 3. pip で入れた場合 python -m pip list | grep cudnn
Windows(conda)でも同じく conda list cudnn で OK です。
出力例:
cudnn 8.9.2.26 cuda11_0
このとき「cuda11_0」は CUDA 11.x 用であることを示します。
CUDA 12 を入れているのに cudnn 8.6 以下が出たら、バージョンが合わないのでアップデードが必要です。
ステップ2:共有ライブラリがロードできるか実際に試す
Linux なら以下のコマンドで動的リンクをチェックします。
Bashldconfig -p | grep libcudnn
正常にインストールされていれば、たとえば
libcudnn.so.8 (libc6,x86-64) => /usr/local/cuda-12.2/targets/x86_64-linux/lib/libcudnn.so.8
のようにパスが表示されます。
何も出ない場合は「ldconfig のキャッシュに登録されていない」か「ライブラリが実際に存在しない」かのどちらかです。
次に TensorFlow から見えるかを一発で試す Python スクリプトを用意しました。
Python# check_cudnn.py import tensorflow as tf print("TensorFlow version:", tf.__version__) print("GPU Available: ", tf.config.list_physical_devices('GPU')) print("cuDNN:", tf.sysconfig.get_build_info()['cudnn_version'])
実行結果例:
TensorFlow version: 2.15.0
GPU Available: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
cuDNN: 8902
cuDNN: 8902 と出れば「cuDNN 8.9.2」相当です。
もし「Could not load dynamic library 'libcudnn.so.8'」のような警告が出たら、次のステップで対処します。
ステップ3:よくあるエラー「Cannot open shared object file」の対処
エラーログ例:
tensorflow.python.framework.errors_impl.NotFoundError: libcudnn.so.8: cannot open shared object file: No such file or directory
原因は 3 パターン。
1. ライブラリが実際に存在しない → 再インストール
2. 別のディレクトリに入っている → シンボリックリンクを張る
3. ldconfig に登録されていない → /etc/ld.so.conf.d/cudnn.conf を作成して sudo ldconfig
手動インストール時に /usr/local/cuda/lib64 に入れた場合は 3. がほとんどです。
以下のワンライナーで解決します。
Bashecho "/usr/local/cuda/lib64" | sudo tee /etc/ld.so.conf.d/cudnn.conf sudo ldconfig
再度 Python スクリプトを走らせ、エラーが消えれば OK です。
ステップ4:Windows で「Could not load cudnn64_8.dll」が出たとき
Windows は検索パスが複雑なため、TensorFlow が期待する DLL を探せません。
手順:
- 環境変数
CUDA_PATHがC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2など正しいパスになっているか確認 - 同ディレクトリの
bin\にcudnn64_8.dllが存在するか確認 - 存在しなければ、NVIDIA Developer から zip をダウンロードし、
-
bin\cudnn*.dll→%CUDA_PATH%\bin-lib\x64\cudnn*.lib→%CUDA_PATH%\lib\x64-include\cudnn*.h→%CUDA_PATH%\includeをコピー - コマンドプロンプトを再起動して
python check_cudnn.py
これで「I tensorflow/core/common_runtime/gpu/gpu_device.cc:1613] Created device /job:localhost/replica:0/task:0/device:GPU:0」が出れば cuDNN 経由で GPU が使われています。
ハマったポイント:マイナーバージョンの不一致
筆者は CUDA 12.2 に対して cuDNN 8.9.5 を入れたところ、TensorFlow 2.15 がリリース時に 8.9.2 までしかサポートリストに入っていなかったため、ビルド済みのホイールが cuDNN をロードしませんでした。
結局ソースからビルドするか、cuDNN を 8.9.2 にダウングレードするかの二択でした。
結論:「最新」ではなく「TensorFlow/PyTorch の互換表に書いてあるバージョン」を入れることです。
まとめ
本記事では、cuDNN が正しくインストールされているかを確かめる手順と、エラーが出たときの切り分け方法を解説しました。
- バージョン不一致は
conda listやldconfig -pで一目でわかる - TensorFlow から見えるかは 5 行の Python スクリプトで即チェック
- Linux では
ldconfig登録、Windows では%CUDA_PATH%\binへのコピーを忘れずに
この記事を通して、Deep Learning フレームワークが GPU を認識しないときに「cuDNN 側の問題かどうか」を 5 分で切り分けられるようになりました。
次回は「ソースから TensorFlow をビルドして CUDA/cuDNN のマイナーバージョンを自由に変える方法」について書く予定です。
参考資料
