問題の概要:WSL2でCUDAが使えない・認識されない
Windows Subsystem for Linux 2 (WSL2) 上でAI開発(PyTorch, TensorFlowなど)を行おうとした際、GPU(CUDA)が利用できない問題に直面することがあります。具体的には、以下のようなエラーメッセージが表示されます。
RuntimeError: No CUDA GPUs are available
# または
torch.cuda.is_available() # False を返す
さらに、CUDA Toolkitをインストール後、サンプルプログラムを実行すると、以下の致命的なエラーが発生するケースも多いです。
CUDA error: CUDA_ERROR_NO_DEVICE
# または
CUDA driver version is insufficient for CUDA runtime version
この問題は、WindowsホストOS、WSL2内のLinuxディストリビューション、そしてNVIDIAドライバの3者が適切に連携できていないために発生します。本記事では、この問題をステップバイステップで解決する方法を解説します。
原因の解説:WSL2用ドライバの必要性とアーキテクチャ
WSL2は、従来の仮想マシンとは異なる軽量な仮想化技術を使用しています。従来のVMwareやVirtualBox上でLinuxを動かしCUDAを使う場合とは根本的にドライバのアーキテクチャが異なります。
主な原因は以下の3点です。
1. 専用ドライバの未インストール
Windowsホスト側にインストールする標準のNVIDIAグラフィックスドライバには、WSL2を介してGPUをLinuxカーネルに公開する機能が含まれていません。そのため、「WSL2用のNVIDIAドライバ」を別途Windows側にインストールする必要があります。
2. WSL2のカーネルバージョン
WSL2内で動作するLinuxカーネルは、Microsoftが提供する特殊なバージョンです。このカーネルがGPUのリソースを適切にマウントできないと、CUDAデバイスを認識できません。
3. WindowsとWSL2のバージョン要件
WSL2でのGPUサポートには、特定バージョン以上のWindows 10/11とWSL2自体が必要です。古いバージョンでは機能そのものが利用できません。
解決方法:ステップバイステップ設定ガイド
以下の手順を順番に実行してください。手順を飛ばすと問題が解決しない可能性があります。
ステップ1: システム要件の確認
まず、以下の条件を満たしていることを確認します。
- Windows 10 バージョン 21H2(ビルド 19044)以上、またはWindows 11。
- WSL2が有効化されており、Linuxディストリビューション(Ubuntu 20.04/22.04推奨)がインストール済み。
- NVIDIA製GPU(Compute Capability 6.0以上)が搭載されている。
PowerShell(管理者権限)で以下のコマンドを実行し、WSL2のバージョンを確認します。
wsl --version
# 出力例
# WSL バージョン: 2.0.9.0
# カーネル バージョン: 5.15.90.1
# ...
ステップ2: Windowsホスト側へのNVIDIAドライバインストール
これが最も重要なステップです。Windows用の標準ゲーミングドライバではなく、「WSL2用のCUDAドライバ」をインストールする必要があります。
- NVIDIAドライバダウンロードページ (https://www.nvidia.com/Download/index.aspx) にアクセス。
- お使いのGPUの製品シリーズ、製品タイプを選択します。
- 「製品ファミリ」で「CUDA on WSL」を選択してください。 これがWSL2対応ドライバです。
- ダウンロードしたインストーラーを実行し、ドライバをインストールします。
インストール後、PCを再起動してください。再起動は必須です。
ステップ3: WSL2内でのCUDA Toolkitインストール
WSL2のUbuntuターミナルを開き、以下のコマンドを実行します。ここではUbuntu 22.04 LTSを例にします。
# 1. リポジトリのキーと設定を追加
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-keyring_1.1-1_all.deb
sudo dpkg -i cuda-keyring_1.1-1_all.deb
sudo apt-get update
# 2. CUDA Toolkitのインストール (バージョンは必要に応じて変更)
sudo apt-get -y install cuda-toolkit-12-4
# 3. 環境変数をシェルの設定ファイルに追加
echo 'export PATH=/usr/local/cuda-12.4/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.4/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
# 4. 設定を反映
source ~/.bashrc
ステップ4: インストール確認と動作テスト
まず、WSL2内からGPUが認識されているか確認します。
nvidia-smi
正常に設定されていれば、以下のようにGPUの情報とドライババージョンが表示されます。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 545.23.08 Driver Version: 545.23.08 CUDA Version: 12.3 |
|-----------------------------------------+----------------------+----------------------+
| GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|=========================================+======================+======================|
| 0 NVIDIA GeForce RTX 4090 On | 00000000:01:00.0 Off | Off |
| 0% 38C P8 22W / 450W | 0MiB / 24564MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
次に、CUDAのバージョンと簡単なコンパイルテストを行います。
nvcc --version
# サンプルプログラムのコンパイルと実行(CUDAサンプルがインストールされている場合)
cd /usr/local/cuda-12.4/samples/1_Utilities/deviceQuery
sudo make
./deviceQuery
deviceQueryの最後にResult = PASSと表示されれば成功です。
ステップ5: PyTorch/TensorFlowのインストールと確認
最後に、実際のAIフレームワークからGPUを認識できるか確認します。
# PyTorchの例 (CUDA 12.1用)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
# Pythonインタラクティブシェルで確認
python3 -c "import torch; print(f'PyTorch version: {torch.__version__}'); print(f'CUDA available: {torch.cuda.is_available()}'); print(f'CUDA device count: {torch.cuda.device_count()}'); print(f'Current device: {torch.cuda.current_device()}'); print(f'Device name: {torch.cuda.get_device_name(0)}')"
すべてのチェックが通れば、WSL2上でCUDAを利用したAI開発環境が構築できたことになります。
よくあるエラーとその対処法
エラー1: 「Failed to initialize NVML: Driver/library version mismatch」
このエラーは、Windowsホスト側のドライバとWSL2内のユーザーモードライブラリのバージョンが一致していない場合に発生します。
解決策: Windowsホストを再起動してください。WSL2インスタンスの再起動だけでは解決しないことが多いです。wsl --shutdownでWSL2を完全に終了させた後、Windowsを再起動します。
エラー2: 「CUDA driver version is insufficient for CUDA runtime version」
インストールしたCUDA Toolkitのランタイムバージョンに対応するドライバが古い場合に発生します。
解決策: ステップ2でインストールしたWSL2用ドライバのバージョンを確認し、必要に応じて最新版に更新します。nvidia-smiで表示される「CUDA Version」はドライバがサポートする最大のCUDAランタイムバージョンを示しており、これより新しいCUDA Toolkitをインストールするとこのエラーが発生します。
エラー3: WSL2起動時に「参考になるオブジェクトが見つかりません」
WSL2のカーネルが古い可能性があります。
解決策: PowerShell(管理者)で以下のコマンドを実行し、WSL2カーネルを更新します。
wsl --update
まとめ・補足情報
WSL2でCUDAを利用するには、「Windowsホスト側に専用ドライバ」をインストールすることが最大のポイントです。従来のVM環境とは設定方法が根本的に異なるため、この点を理解していないと「なぜCUDAが使えないのか」という根本原因にたどり着けません。
また、環境構築後は以下の点にも注意してください。
- メモリ/GPUメモリの競合: WindowsホストとWSL2でGPUメモリを共有します。大規模モデルを学習させる場合は、Windows側のグラフィック負荷を減らす(ブラウザを閉じる等)ことでWSL2により多くのリソースを割り当てられます。
- パフォーマンス: ネイティブのLinux環境やWindowsネイティブのCUDAと比べて、ファイルI/Oなどで若干のオーバーヘッドが発生する可能性があります。ただし、GPU計算自体のパフォーマンスはほぼネイティブに近いことが報告されています。
- ドライバ更新時: NVIDIAドライバを更新した後は、必ずWindowsの再起動を行い、
wsl --shutdownでWSL2セッションをリセットすることをお勧めします。
本手順に従うことで、Windowsマシン上でLinuxの開発環境を活かしつつ、強力なNVIDIA GPUをフル活用したAI開発が可能になります。トラブルが発生した場合は、各ステップの確認出力をよく観察し、どこで問題が起きているのかを特定することが解決への近道です。