深層学習の環境構築、特にCUDAとcuDNNのバージョン管理で「cudnn not initialized」エラーに悩まされた経験はありませんか?PyTorchやTensorFlowがGPUを認識しているのに、いざ計算を始めると突然エラーが発生するあの現象です。この問題の多くは、CUDA ToolkitとcuDNNのバージョン組み合わせの非互換性に起因しています。
本記事では、特にCUDA 12.x系とcuDNN 9.x系に焦点を当て、公式情報を基にした確実な互換性マトリクスと、エラーを出さないためのステップバイステップの環境構築手順を解説します。最後には動作確認用の簡単なPythonスクリプトも用意しているので、ぜひ最後までご覧ください。
遭遇する典型的なエラーメッセージ
以下のいずれかのエラーでこの記事にたどり着いた方も多いのではないでしょうか。
# エラー例1: PyTorchなどでよく見られるランタイムエラー
RuntimeError: cuDNN error: CUDNN_STATUS_NOT_INITIALIZED
# エラー例2: ライブラリそのものが見つからない
Could not load dynamic library 'libcudnn.so.9'; dlerror: libcudnn.so.9: cannot open shared object file: No such file or directory
# エラー例3: 一見GPUは使えるが、実際に使うと失敗
torch.cuda.is_available() # => True を返すが、実際の計算で上記エラーが発生
なぜ「cudnn not initialized」エラーが発生するのか? 3つの根本原因
CUDAはNVIDIA GPUのための並列計算プラットフォーム、cuDNNはその上で深層学習の演算を加速するライブラリです。両者は非常に密接に連携するため、バージョン間に厳密な互換性が要求されます。
エラーの主な原因は以下の3つです。
-
公式サポート外のバージョン組み合わせ
NVIDIAは各CUDAバージョンに対して、テスト済みのcuDNNバージョンを公式に発表しています。これを無視した組み合わせ(例:CUDA 12.0 + cuDNN 9.x)は、たとえ動くことがあっても未定義の動作や突然のエラーの原因となります。 -
ライブラリパスやシンボリックリンクの不備
cuDNNは複数の共有ライブラリ(.soファイル)の集合体です。これらがシステムのライブラリ検索パス(例:/usr/local/cuda/lib64)に正しく配置されていない、またはバージョン番号を含む実ファイルから汎用的な名前へのシンボリックリンクが切れていると、実行時にライブラリを見つけられずエラーになります。 -
フレームワークの事前ビルド済みバイナリとの不一致
PyTorchやTensorFlowは、特定のCUDA/cuDNNの組み合わせに対して事前にビルドされたパッケージ(torchやtensorflow-gpu)を提供しています。pip installしたフレームワークのバイナリが要求するcuDNNのバージョンと、実際にシステムにインストールされているバージョンが一致しない場合、実行時にエラーが発生します。
最重要:CUDA 12.x と cuDNN 9.x の互換性マトリクス
まずは、何よりも公式の互換性を確認することがすべての前提です。以下の表は、NVIDIAの公式ドキュメントおよび実践的な検証に基づく、推奨される安定組み合わせです。
| CUDA Toolkit バージョン | 推奨 / 公式サポートされる cuDNN バージョン | 備考 |
|---|---|---|
| CUDA 12.0 | cuDNN 8.9.x | CUDA 12.0はcuDNN 9.xを公式サポートしていません。 この組み合わせはエラーの元です。 |
| CUDA 12.1 | cuDNN 8.9.x (推奨安定版) | 一部のcuDNN 9.0.0以降でも動作する報告はありますが、8.9.x系が無難です。 |
| CUDA 12.2 | cuDNN 9.x.x | ここからcuDNN 9.xの本格的なサポートが始まります。 |
| CUDA 12.3 | cuDNN 9.x.x | 安定した組み合わせです。 |
| CUDA 12.4 | cuDNN 9.x.x | 最新の安定した組み合わせです。 |
結論: CUDA 12.0を使っている方は、cuDNNを9.xに上げるのではなく、CUDA自体を12.2以上にアップグレードすることが最も確実な解決策です。CUDA 12.2/12.3/12.4を使用する場合は、cuDNN 9.xを安心して利用できます。
ステップバイステップ環境構築手順 (Ubuntu 22.04 LTS 例)
ここからは、CUDA 12.3 と cuDNN 9.3.0 をクリーンにインストールする手順を示します。他のバージョンでも基本は同じです。
前提条件:NVIDIAドライバの確認
まずは既存のドライバとGPUを確認します。
nvidia-smi
このコマンドでGPU情報とドライババージョンが表示されればOKです。ドライバが古い場合は、NVIDIA公式サイトやaptからアップデートしてください。nvidia-smiの上部に表示される「CUDA Version」は、そのドライバがサポートする最大のCUDAランタイムバージョンであり、現在インストールされているCUDA Toolkitのバージョンではない点に注意してください。
ステップ1:CUDA Toolkit 12.3 のインストール
ネットワーク経由でのインストールが簡単です。CUDAのバージョンは必要に応じて12-3の部分を変更してください(例:12-4)。
# キーリングとリポジトリの設定
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/3bf863cc.pub
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/ /"
sudo apt-get update
# CUDA Toolkit 12.3 のインストール (開発ツールとライブラリを含む)
sudo apt-get -y install cuda-toolkit-12-3
# 環境変数の設定 (~/.bashrc に追記)
echo 'export PATH=/usr/local/cuda-12.3/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.3/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
# 設定を反映
source ~/.bashrc
# インストール確認
nvcc --version # CUDAコンパイラのバージョン確認 (12.3などと表示されるはず)
これで/usr/local/cuda-12.3以下にCUDAがインストールされ、/usr/local/cudaはこのバージョンへのシンボリックリンクになります。
ステップ2:cuDNN 9.3.0 のインストール (Debianパッケージ推奨)
cuDNNのインストールにはNVIDIA Developerアカウントへの登録とログインが必要です。パッケージ形式(.deb)でのインストールを強く推奨します。これにより、ライブラリの配置とシンボリックリンクの管理をシステムが自動で行ってくれ、手動インストールによるミスを防げます。
-
NVIDIA cuDNNアーカイブページにアクセスし、「Download cuDNN v9.3.0 (October 2024), for CUDA 12.x」のような、自分のCUDAバージョン(12.3)に対応するcuDNN 9.3.0を選択します。
-
「Local Installer for Linux (Deb)」をダウンロードします。通常、以下の3つのファイルがリストされます。
-
libcudnn9_9.3.0.xx-1+cuda12.3_amd64.deb(ランタイムライブラリ) -
libcudnn9-dev_9.3.0.xx-1+cuda12.3_amd64.deb(開発用ファイル、ヘッダー) -
libcudnn9-samples_9.3.0.xx-1+cuda12.3_amd64.deb(サンプルコード、任意)
-
-
ダウンロードしたディレクトリで以下のコマンドを実行します(ファイル名の
xxはマイナーバージョン番号です)。
# ランタイムライブラリと開発パッケージをインストール
sudo dpkg -i libcudnn9_9.3.0.xx-1+cuda12.3_amd64.deb
sudo dpkg -i libcudnn9-dev_9.3.0.xx-1+cuda12.3_amd64.deb
# インストール確認: インストールされたcuDNNのバージョンを確認
cat /usr/include/x86_64-linux-gnu/cudnn_version_v8.h | grep CUDNN_MAJOR -A 2
# または (パスが異なる場合もあります)
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
これで、cuDNNのライブラリは/usr/lib/x86_64-linux-gnu/などに、ヘッダーファイルは/usr/include/などに自動的に配置され、CUDAのライブラリパスからも参照できるようになります。
ステップ3:PyTorchのインストールと動作確認
フレームワーク側でも、システムのCUDAバージョンに合ったものをインストールすることが重要です。
# CUDA 12.1用のPyTorchをインストール (例)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# または、CUDA 12.3用など、より新しいバージョンが公式に提供されている場合はそれを使用
# 最新のコマンドは https://pytorch.org/get-started/locally/ で確認してください
インストール後、以下の簡単なPythonスクリプトでCUDAとcuDNNが正しく連携しているかを確認しましょう。
import torch
print(f"PyTorch version: {torch.__version__}")
print(f"CUDA available: {torch.cuda.is_available()}")
print(f"CUDA version (PyTorch built with): {torch.version.cuda}")
if torch.cuda.is_available():
device = torch.device("cuda")
x = torch.randn(3, 3).to(device)
y = torch.randn(3, 3).to(device)
# 単純な行列計算を実行 (ここでcudnnエラーが発生するかチェック)
z = torch.matmul(x, y)
print("GPU matrix multiplication succeeded!")
print(f"Result tensor on {z.device}:\n{z}")
else:
print("CUDA is not available.")
このスクリプトがエラーなく実行され、最後のメッセージが表示されれば、環境構築は成功です!
まとめ:エラーを防ぐための黄金律
- 公式マトリクス第一:常にNVIDIAの公式ドキュメントを参照し、サポートされた組み合わせを使う。
- CUDA 12.0ユーザーはアップグレード:cuDNN 9.xを使いたいなら、CUDAは12.2以上に上げる。
- cuDNNインストールはDebパッケージ:手動コピーより確実で管理が楽。
-
フレームワークのCUDAバージョンを合わせる:
pip installする時、システムのCUDAバージョンに対応したフレームワークのバイナリを選択する。
この手順に従うことで、煩わしい「cudnn not initialized」エラーとは決別し、ストレスのない深層学習開発環境を手に入れましょう。
この記事の詳細版は元記事サイトで公開しています。