問題の概要:WSL2でCUDAが使えない、GPUが認識されない
Windows Subsystem for Linux 2 (WSL2) 上で機械学習や深層学習の開発環境を構築する際、CUDAを利用してGPUのパワーを活用したい場面は多いでしょう。しかし、WSL2環境でCUDAをセットアップしようとすると、以下のような問題に直面することが頻繁にあります。
nvidia-smiコマンドを実行しても「Command not found」や「No devices were found」と表示される- PyTorchやTensorFlowをインポートした際に
CUDA is not availableというエラーが発生する - Windows側のGPUドライバはインストール済みなのに、WSL2内からGPUが認識されない
- CUDA ToolkitをWSL2内にインストールしても、実際のGPUアクセスができない
これらの問題は、WSL2におけるGPUサポートが「Windows側のドライバ」と「WSL2内のユーザースペースドライバ」の連携によって実現される特殊なアーキテクチャに起因しています。単純にLinux用のNVIDIAドライバをWSL2内にインストールしても動作しません。
原因の解説:WSL2 GPUサポートのアーキテクチャ
WSL2でCUDAを利用するための公式サポートは、NVIDIAによって「CUDA on WSL」として提供されています。その核心的な仕組みを理解することが、トラブルシューティングの第一歩です。
従来のLinux環境との根本的な違い
通常のLinuxマシンや仮想マシン(VM)では、NVIDIAのカーネルモードドライバをLinuxカーネルに直接ロードします。しかし、WSL2はHyper-Vを基盤とする軽量仮想マシンであり、GPUなどのハードウェアリソースへの直接アクセスが制限されています。
WSL2のGPUパススルーアーキテクチャ
WSL2のGPUサポートは以下のような2層構造になっています:
- Windowsホスト側: 標準のNVIDIA Game ReadyまたはStudioドライバ(バージョン 465以降)がインストールされ、物理GPUを管理します。このドライバには、WSL2用の「WSLインターフェース」コンポーネントが含まれています。
- WSL2ゲスト側: NVIDIAが提供する「ユーザーモードドライバ」(libcuda.soなど)がインストールされ、Windows側のドライバと通信します。WSL2内にカーネルモードドライバは存在しません。
このアーキテクチャのため、WSL2内でsudo apt install nvidia-driver-xxxなどのコマンドを実行してLinux用ドライバをインストールしようとすると、システムが破損したり、そもそも動作しなかったりします。これが最も多い間違いです。
解決方法:ステップバイステップでの環境構築
WSL2でCUDAを正しく動作させるには、以下の手順を厳密に守って環境を構築する必要があります。
ステップ1: システム要件の確認
まず、以下の前提条件を満たしていることを確認してください。
- Windows 10 バージョン 21H2(ビルド 19044)以上、または Windows 11
- WSL2が有効化されており、Linuxディストリビューション(Ubuntu 18.04/20.04/22.04推奨)がインストール済み
- NVIDIA GPU(GeForce GTX/RTXシリーズ、Quadro、Teslaなど)が搭載されている
ステップ2: Windows側のドライバインストール
WSL2内でCUDAを使用するために、まずWindows側に適切なドライバをインストールすることが最も重要です。
- 既存のNVIDIAドライバをアンインストール(DDUなどのツールを使用推奨)
- NVIDIA公式サイトから「WSL2用のドライバ」をダウンロード
- Game Ready Driver または Studio Driver のバージョン 465以上を選択
- ドライバの種類を選択する画面で「Windows Driver Type」に「Standard」ではなく「DCH」が表示されていることを確認(最新版はほとんどDCH)
- ダウンロードしたドライバをインストールし、PCを再起動
ステップ3: WSL2のカーネル更新
WSL2のカーネルを最新版に更新します。管理者権限でPowerShellまたはWindowsターミナルを開き、以下のコマンドを実行します。
wsl --update
更新後、WSL2を再起動します。
wsl --shutdown
その後、WSL2ディストリビューションを再度起動します。
ステップ4: WSL2内でのCUDA Toolkitインストール
WSL2のUbuntuターミナルを開き、以下の手順でCUDA Toolkitをインストールします。NVIDIAの公式リポジトリを追加する方法が確実です。
# 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
# 2. リポジトリキーの追加
sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/3bf863cc.pub
# 3. リポジトリの追加
sudo add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/ /"
# 4. パッケージリストの更新とCUDA Toolkitのインストール
sudo apt update
sudo apt install -y cuda-toolkit-12-4 # バージョンは必要に応じて変更(例: cuda-toolkit-11-8)
ステップ5: 環境変数の設定と動作確認
インストール後、環境変数を設定し、GPUが正しく認識されているか確認します。
# 環境変数を~/.bashrcに追加
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
source ~/.bashrc
# GPU認識の確認(WSL2内で実行)
nvidia-smi
正常に設定されていれば、以下のようなGPU情報が表示されます。
+---------------------------------------------------------------------------------------+
| NVIDIA-SMI 535.161.07 Driver Version: 537.13 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 4090 On | 00000000:01:00.0 Off | Off |
| 0% 38C P8 22W / 450W | 0MiB / 24564MiB | 0% Default |
| | | N/A |
+-----------------------------------------+----------------------+----------------------+
コード例・コマンド例:よくあるエラーとその対処法
エラー1: 「Failed to initialize NVML: Driver/library version mismatch」
このエラーは、Windows側のドライババージョンとWSL2内のユーザーモードドライバのバージョンが一致していない場合に発生します。
# エラーメッセージ例
$ nvidia-smi
Failed to initialize NVML: Driver/library version mismatch
解決策:
- Windows側のドライバを最新版に更新
- WSL2を完全にシャットダウンして再起動
# PowerShellで実行
wsl --shutdown
# その後、WSL2ディストリビューションを再起動
エラー2: PyTorchで「CUDA is not available」
PyTorchをインストールした後、CUDAが利用できないというエラーが発生することがあります。
import torch
print(torch.cuda.is_available()) # Falseが返る
解決策:
- WSL2用の正しいPyTorchバージョンをインストール
- WSL2内のCUDA ToolkitバージョンとPyTorchが要求するCUDAバージョンが一致しているか確認
# CUDA 12.1用のPyTorchをインストール(例)
pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
エラー3: 「libcuda.so.1: cannot open shared object file」
このエラーは、CUDAライブラリのパスが正しく設定されていない場合に発生します。
ImportError: libcuda.so.1: cannot open shared object file: No such file or directory
解決策:
# シンボリックリンクを作成またはLD_LIBRARY_PATHを確認
sudo ldconfig
echo $LD_LIBRARY_PATH # CUDAライブラリパスが含まれているか確認
# もし含まれていなければ、明示的に追加
export LD_LIBRARY_PATH=/usr/lib/wsl/lib:$LD_LIBRARY_PATH
まとめ・補足情報
WSL2でCUDAを利用する際の最大のポイントは、「ドライバはWindows側にインストールし、WSL2内にはCUDA Toolkitのみをインストールする」という基本原則を理解することです。このアーキテクチャを把握していれば、多くのトラブルを未然に防ぐことができます。
パフォーマンスに関する注意点
WSL2上のCUDAパフォーマンスは、ネイティブLinux環境と比較して若干のオーバーヘッドが存在しますが、最新のドライバとWSL2の更新により、その差は最小化されています。特に、Windows 11と最新のNVIDIAドライバの組み合わせでは、ほぼネイティブに近いパフォーマンスが得られることが報告されています。
メモリ管理の注意点
WSL2は動的にメモリを割り当てますが、大規模なモデルを学習させる場合、.wslconfigファイルを設定してメモリ制限を調整することをお勧めします。
# C:Users[ユーザー名].wslconfig に作成
[wsl2]
memory=16GB # システムメモリに応じて調整
processors=8 # 使用するCPUコア数
localhostForwarding=true
推奨されるワークフロー
安定した環境を維持するためには:
- Windows側のNVIDIAドライバを定期的に更新する(Game Ready DriverよりStudio Driverの方が安定性が高い場合あり)
- WSL2のカーネルは
wsl --updateで最新に保つ - CUDA Toolkitのバージョンは、使用するAIフレームワーク(PyTorch、TensorFlow)と互換性のあるものを選択する
- 大きな変更を行う前には、WSL2ディストリビューションのエクスポートでバックアップを取る
WSL2上のCUDA環境は、WindowsとLinuxの良いとこ取りができる強力な開発プラットフォームです。本ガイドで紹介した手順と注意点を守ることで、AI開発におけるGPUリソースをスムーズに活用できるようになるでしょう。
⚡ GPU環境をすぐに使いたいなら
ハードウェアの購入・セットアップなしで、すぐにGPU環境を使えるクラウドサービスがおすすめです。
- RunPod — RTX 4090/A100/H100を即座に利用可能
- Vast.ai — 最安のGPUクラウド、オークション方式で低コスト
- RTX 5090をAmazonで見る — 自宅GPU環境を構築するなら