はじめに (対象読者・この記事でわかること)

この記事は、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 であれば ldconfigldd コマンドを使える、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 なら以下のコマンドで動的リンクをチェックします。

Bash
ldconfig -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. がほとんどです。
以下のワンライナーで解決します。

Bash
echo "/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 を探せません。
手順:

  1. 環境変数 CUDA_PATHC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2 など正しいパスになっているか確認
  2. 同ディレクトリの bin\cudnn64_8.dll が存在するか確認
  3. 存在しなければ、NVIDIA Developer から zip をダウンロードし、 - bin\cudnn*.dll%CUDA_PATH%\bin - lib\x64\cudnn*.lib%CUDA_PATH%\lib\x64 - include\cudnn*.h%CUDA_PATH%\include をコピー
  4. コマンドプロンプトを再起動して 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 listldconfig -p で一目でわかる
  • TensorFlow から見えるかは 5 行の Python スクリプトで即チェック
  • Linux では ldconfig 登録、Windows では %CUDA_PATH%\bin へのコピーを忘れずに

この記事を通して、Deep Learning フレームワークが GPU を認識しないときに「cuDNN 側の問題かどうか」を 5 分で切り分けられるようになりました。
次回は「ソースから TensorFlow をビルドして CUDA/cuDNN のマイナーバージョンを自由に変える方法」について書く予定です。

参考資料