問題の概要:WSL2でCUDAが使えない・GPUが認識されない
Windows Subsystem for Linux 2 (WSL2) 上で機械学習や深層学習の開発環境を構築する際、CUDAを利用してGPUのパワーを活用したい場面は多々あります。しかし、WindowsとLinuxの二つの環境が絡むため、設定が複雑で、以下のようなエラーに遭遇することが頻繁にあります。
CUDA driver version is insufficient for CUDA runtime versionNo CUDA-capable device is detectedtorch.cuda.is_available()がFalseを返すnvidia-smiコマンドがCommand not foundまたはエラーを出力する
これらの問題は、主にWindowsホスト側のドライバとWSL2内のCUDA Toolkitのバージョン不一致、またはWSL2自体の設定不足が原因です。本記事では、WSL2上でCUDAを正しく動作させるための環境構築手順と、発生する主要なエラーの解決方法をステップバイステップで解説します。
原因の解説:なぜWSL2でCUDA設定は複雑なのか?
WSL2は、Windows 10/11上でネイティブなLinuxカーネルを動作させる仮想化環境です。CUDAをWSL2で動作させるアーキテクチャは、従来のLinuxマシンや仮想マシンとは根本的に異なります。
主要な原因1:ドライバの分離構造
WSL2でのGPU利用は「Windowsホスト側のNVIDIAドライバ」が「WSL2内のLinuxカーネル」と直接通信する特殊な構造(GPUパーティショニング)を取ります。つまり、WSL2内にNVIDIAドライバをインストールする必要はありません。必要なのは、Windows側の「WSL2対応ドライバ」と、WSL2内の「CUDA Toolkit(ランタイムと開発ライブラリ)」だけです。この分離を理解していないと、WSL2内でapt install nvidia-driverなど不要な操作を行い、環境を破壊してしまう原因となります。
主要な原因2:バージョンの厳密な互換性
Windows用NVIDIAドライバ、CUDA Toolkit for WSL、PyTorch/TensorFlowなどのフレームワーク間には、厳密なバージョン互換性が必要です。例えば、CUDA Toolkit 12.1をインストールした場合、それをサポートするバージョンのWindowsドライバ(R525以降など)が必要です。互換性のない組み合わせでは、冒頭で述べた「ドライババージョン不足」エラーが発生します。
主要な原因3:WSL2のインストール形態とカーネルバージョン
WSL2は「ストア版」と「レガシー版(Windowsコンポーネント)」の2つのインストール方法があります。また、WSL2のLinuxカーネルはMicrosoftによってカスタマイズされており、GPUパーティショニング機能を有効にするには、一定以上のバージョンが必要です。
解決方法:ステップバイステップ設定ガイド
以下に、ゼロからWSL2環境でCUDAを動作させるまでの完全な手順を示します。
ステップ1: 前提条件の確認とWSL2のセットアップ
まず、Windowsのビルドバージョンが要件を満たしているか確認します。WSL2 GPUサポートには、Windows 10 バージョン 21H2以降(ビルド 19044以上)、またはWindows 11が必要です。
# PowerShell (管理者権限不要)で確認
winver
次に、WSL2が有効化され、デフォルトバージョンが2に設定されていることを確認・設定します。
# PowerShell (管理者権限で実行)
wsl --install -d Ubuntu-22.04 # Ubuntu 22.04 LTSをインストール(推奨)
wsl --set-default-version 2
wsl --set-version Ubuntu-22.04 2 # 既存のディストリビューションをWSL2に変換
wsl -l -v # インストール済みディストリビューションとバージョンを確認
# 出力例: * Ubuntu-22.04 Running 2
ステップ2: Windowsホスト側のNVIDIAドライバインストール
これが最も重要なステップです。WSL2専用のドライバをNVIDIA公式サイトからダウンロードします。
- NVIDIA CUDA on WSL ダウンロードページにアクセス。
- 「Download Driver」ボタンをクリックし、Windows用のゲーミングドライバ(Game Ready Driver)をダウンロード・インストール。データセンター向け(GRID/RDC)ではなく、通常のGeForce/RTX用ドライバで構いません。
- インストール後、PCを再起動します。
インストール後、Windows側のコマンドプロンプトまたはPowerShellで以下を実行し、ドライバが正しく認識されているか確認します。
# Windows PowerShell
nvidia-smi
正常にインストールされていれば、GPUのモデル、ドライババージョン、CUDAバージョン(ドライバに含まれる最大CUDAバージョン)が表示されます。
ステップ3: WSL2内でのCUDA Toolkitのインストール
WSL2のUbuntuターミナルを起動し、以下のコマンドを実行します。ここでは、安定版であるCUDA 12.1を例にします(2024年1月時点)。
# WSL2 Ubuntu ターミナル
# 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 (12.1) をインストール
sudo apt-get -y install cuda-toolkit-12-1
# 3. 環境変数をシェルの設定ファイルに追加 (~/.bashrc または ~/.zshrc)
echo 'export PATH=/usr/local/cuda-12.1/bin${PATH:+:${PATH}}' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}}' >> ~/.bashrc
source ~/.bashrc
# 4. インストール確認
nvcc --version # CUDAコンパイラのバージョン確認
ステップ4: 動作確認と深層学習フレームワークのインストール
CUDA Toolkitのインストールが完了したら、GPUがWSL2から認識されているか確認します。
# WSL2 Ubuntu ターミナル
nvidia-smi
ここでCommand 'nvidia-smi' not foundと出る場合は、/usr/lib/wsl/libディレクトリがライブラリパスにない可能性があります。以下のコマンドで対処できます。
sudo ldconfig /usr/lib/wsl/lib
nvidia-smiが成功したら、PyTorchをインストールして最終確認します。
# 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'GPU name: {torch.cuda.get_device_name(0) if torch.cuda.is_available() else "N/A"}')"
この出力でCUDA available: Trueと表示されれば、設定は成功です。
よくあるエラーメッセージとその解決策
エラー1: CUDA driver version is insufficient for CUDA runtime version
原因: Windowsホストのドライバが古すぎて、WSL2内にインストールしたCUDA Toolkitのバージョンをサポートしていない。
解決策: ステップ2に戻り、NVIDIA公式サイトから最新のゲーミングドライバをインストールし、再起動します。nvidia-smiで表示される「CUDA Version」が、WSL2内のnvcc --versionで表示されるバージョン以上であることを確認してください。
エラー2: No CUDA-capable device is detected または nvidia-smiが実行できない
原因A: WSL2のカーネルバージョンが古い。
# WSL2内でカーネルバージョンを確認
uname -r
# 5.10.102.1 以上であることが望ましい
解決策A: Windows側でPowerShellを管理者権限で開き、wsl --updateを実行してWSL2カーネルを手動更新します。その後、wsl --shutdownでWSL2を終了し、再起動します。
原因B: WSL2内でldconfigが実行されていない。
解決策B: 前述のsudo ldconfig /usr/lib/wsl/libを実行します。
エラー3: PyTorch/TensorFlowでtorch.cuda.is_available() == False
原因: フレームワークのインストール時に、CUDAサポートなしのCPU版がインストールされている。
解決策: 必ず公式サイトのインストールコマンドを使用し、CUDAバージョンを明示します。PyTorchなら--index-url、TensorFlowならtensorflow[and-cuda]または特定のバージョン指定を確認してください。
まとめ・補足情報
WSL2上でのCUDA環境構築の成功の鍵は、「Windowsホストに適切なドライバを入れ、WSL2内にはドライバではなくCUDA Toolkitのみを入れる」という基本原則を理解することにあります。バージョン互換性には常に注意を払い、問題が発生した場合は以下のチェックリストを確認してください。
- Windowsビルドバージョンは21H2以上か?
- Windows NVIDIAドライバはWSL2対応の最新版か?(Game Ready Driver)
- WSL2のデフォルトバージョンは2か?
- WSL2内のCUDA Toolkitバージョンはドライバがサポートする範囲内か?
- フレームワークは正しいCUDAバージョン指定でインストールしたか?
一度正しく設定できれば、Windowsの利便性を保ちながら、ほぼネイティブに近いパフォーマンスでLinux上のGPU計算環境を利用できるようになります。開発時は、データセットなどの大きなファイルをWSL2内のLinuxファイルシステム(/home/以下)ではなく、Windowsファイルシステム(/mnt/c/以下)に置くと、ファイルI/Oのパフォーマンスが大幅に低下する点にも注意が必要です。プロジェクトはできるだけWSL2のホームディレクトリ内で管理することをお勧めします。