問題の概要:WSL2でCUDAが使えない・GPUが認識されない
Windows Subsystem for Linux 2 (WSL2) 上で機械学習や深層学習の開発環境を構築する際、CUDAを利用してGPUのパワーを活用したい場面は多々あります。しかし、WindowsホストとWSL2ゲストの間で適切な設定を行わないと、以下のような問題に直面します。
nvidia-smiコマンドを実行しても「コマンドが見つからない」または「NVIDIAドライバが実行されていません」というエラーが発生する。- PyTorchやTensorFlowで
torch.cuda.is_available()を実行するとFalseが返り、GPUが認識されない。 - エラーメッセージ:
CUDA error: no kernel image is available for execution on the deviceやFailed to initialize NVML: Driver/library version mismatchが表示される。
これらの問題は、Windows側のドライバ、WSL2側のCUDA Toolkit、そしてWSL2自体の設定が連携していないことが主な原因です。本記事では、ステップバイステップで確実に動作する環境構築方法を解説します。
原因の解説:なぜWSL2でCUDA設定は複雑なのか?
WSL2は、従来の仮想マシンとは異なるアーキテクチャを採用しています。GPUリソースへのアクセスに関して、以下のような複雑な要素が絡み合っています。
1. 新しいGPUドライバモデル
WSL2でCUDAを利用するためには、Windows側にインストールするNVIDIAドライバが、WSL2サポートを含んだ特別なバージョンである必要があります。従来の「GeForce Game Ready Driver」などでは動作せず、「NVIDIA Driver for CUDA on WSL」という位置付けのドライバが必要です。このドライバが、WindowsカーネルとWSL2のLinuxカーネルを橋渡しする役割を果たします。
2. ホスト(Windows)とゲスト(WSL2)のバージョン整合性
Windows側のドライババージョンと、WSL2内にインストールするCUDA ToolkitやcuDNNのバージョンに互換性がなければなりません。バージョン不一致は、Driver/library version mismatchエラーの直接的な原因となります。
3. WSL2のカーネルとCUDAの互換性
WSL2はMicrosoftが提供するLinuxカーネルを使用しています。このカーネルバージョンが古すぎると、新しいCUDAドライバと互換性の問題が生じる可能性があります。
解決方法:ステップバイステップ設定ガイド
ステップ1: 前提条件の確認
まず、以下の条件を満たしていることを確認してください。
- Windows 10 バージョン 21H2(ビルド 19044)以上、または Windows 11。
- WSL2が有効化されており、Ubuntu 20.04 LTSまたは22.04 LTSなどのディストリビューションがインストール済み。
- NVIDIA製GPU(Pascalアーキテクチャ以降)を搭載。
WSL2のバージョンとデフォルトバージョンを確認します。
# PowerShell (管理者権限で実行)
wsl --list --verbose
# 出力例:
# NAME STATE VERSION
# * Ubuntu-22.04 Running 2
# デフォルトのWSLバージョンが2であることを確認。
wsl --set-default-version 2
ステップ2: Windows側への正しいNVIDIAドライバのインストール
これが最も重要なステップです。通常のグラフィックスドライバではなく、WSL2用のCUDAドライバをインストールする必要があります。
- 既存のNVIDIAドライバがある場合は、DDU (Display Driver Uninstaller) などのツールを使用して完全にアンインストールすることを推奨します(特に問題が発生している場合)。
- NVIDIA公式のCUDA on WSLダウンロードページにアクセスします。
- 「Download Driver for CUDA on WSL」ボタンをクリックし、お使いのGPUに合ったドライバをダウンロード・インストールします。このドライバパッケージには、Windows用グラフィックスドライバと、WSL2を通じてGPUにアクセスするためのコンポーネントの両方が含まれています。
インストール後、WindowsのコマンドプロンプトまたはPowerShellで以下のコマンドを実行し、ドライバが正しく認識されているか確認します。
# PowerShell
nvidia-smi.exe
Windows側でnvidia-smi.exeが正常に実行され、GPU情報が表示されることを確認してください。
ステップ3: WSL2内でのCUDA Toolkitのインストール
次に、WSL2のLinuxディストリビューション内でCUDA Toolkitをインストールします。NVIDIAが提供するWSL2専用のリポジトリを使用する方法が最も簡単で確実です。
# WSL2のUbuntuターミナルで実行
# 1. キーリングとリポジトリの設定
wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/3bf863cc.pub
sudo add-apt-repository 'deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /'
sudo apt-get update
# 2. CUDA Toolkitのインストール (最新版をインストール)
sudo apt-get -y install cuda-toolkit-12-4 # 例: CUDA 12.4。バージョンは適宜変更。
# 3. パスを通す(~/.bashrcに追記)
echo 'export PATH=/usr/local/cuda-12/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
ステップ4: 動作確認
すべての設定が完了したら、WSL2内で以下のコマンドを実行してGPUが正しく認識されているか確認します。
# 1. nvidia-smiの実行(WSL2内)
nvidia-smi
# 正常な出力例:
# +---------------------------------------------------------------------------------------+
# | NVIDIA-SMI 535.104.05 Driver Version: 535.104.05 CUDA Version: 12.2 |
# |-----------------------------------------+----------------------+----------------------+
# | 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 4070 Ti On | 00000000:01:00.0 On | N/A |
# | 0% 39C P8 10W / 285W | 105MiB / 12288MiB | 0% Default |
# | | | N/A |
# +-----------------------------------------+----------------------+----------------------+
# 2. PyTorchでの確認
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()}'); if torch.cuda.is_available(): print(f'Current device: {torch.cuda.get_device_name(0)}')"
# 期待する出力:
# PyTorch version: 2.2.0
# CUDA available: True
# CUDA device count: 1
# Current device: NVIDIA GeForce RTX 4070 Ti
コード例・コマンド例:トラブルシューティング
設定中に発生する可能性のある具体的なエラーとその解決策です。
エラー1: “Failed to initialize NVML: Driver/library version mismatch”
原因: Windowsホストのドライババージョンと、WSL2内のCUDAライブラリのバージョンが一致していない。
解決策: バージョンの整合性を取る。Windowsのnvidia-smi.exeで表示される「CUDA Version」と、WSL2内でnvcc --versionや/usr/local/cuda/version.txtで確認できるCUDA Toolkitのバージョンを近いものに揃える。必要であれば、WSL2内のCUDA Toolkitをアンインストールし、バージョンを指定して再インストールする。
# WSL2内でCUDA Toolkitをアンインストール
sudo apt-get --purge remove "*cuda*" "*cublas*" "*cufft*" "*cufile*" "*curand*" "*cusolver*" "*cusparse*" "*gds-tools*" "*npp*" "*nvjpeg*" "nsight*" "*nvvm*"
# 特定バージョンの再インストール(例:CUDA 11.8)
sudo apt-get install cuda-toolkit-11-8
エラー2: “CUDA error: no kernel image is available for execution on the device”
原因:</strong PyTorchやTensorFlowのバージョンが、インストールされているCUDAのバージョンや、GPUのコンピュート能力(Compute Capability)に対応していない。
解決策: フレームワークを正しいバージョンでインストールし直す。特に、PyTorchのインストールコマンドは公式サイトの「Get Started」から生成されたものを使用する。
# PyTorch公式サイト推奨のコマンド例(CUDA 12.1用)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
エラー3: WSL2起動時に「参照されるオブジェクトは使用されていません」などのWindowsエラー
原因: WSL2のカーネルコンポーネントが古い。
解決策: WSL2カーネルを手動で更新する。
# PowerShell (管理者権限)
wsl --update
wsl --shutdown
# その後、WSL2を再起動
まとめ・補足情報
WSL2でCUDAを利用する設定は、「Windows用WSL対応ドライバのインストール」→「WSL2内での対応バージョンのCUDA Toolkitインストール」→「フレームワークのバージョン整合性確認」という3段階の流れを確実に踏むことが成功のカギです。一度設定が完了すれば、Windowsの利便性を保ちながら、Linux環境でネイティブに近いGPUパフォーマンスを発揮できる強力な開発環境が手に入ります。
最後の注意点:
- WSL2のGPUアクセスは、現時点ではNVIDIA GPUのみが公式サポートされています。AMD GPUやIntel Arc GPUでは別の方法(例えばDirectMLなど)を検討する必要があります。
- WSL2内のCUDAは、主にコンピュート(計算)用途に最適化されています。グラフィックスレンダリング(OpenGL/DirectX)のパフォーマンスは、ネイティブのWindows環境には劣る場合があります。
- メモリ使用量に注意してください。WSL2インスタンスとWindowsホストはGPUメモリを共有します。大規模なモデルを学習させる場合は、
.wslconfigファイルでWSL2に割り当てるメモリ量を調整することを検討しましょう。
このガイドに沿って設定を行えば、多くの一般的な問題は解決できるはずです。それでも問題が解決しない場合は、エラーメッセージを詳細に確認し、NVIDIAの公式フォーラムやWSLのGitHubリポジトリのIssueを検索することをお勧めします。