このエントリは、WSL2とCUDAを使ったPythonでの開発環境を構築する手順のメモです。

Windows上のIntelliJ IDEAから、
GPUを利用したPyTorchのサンプルを動かすまでの流れを紹介します。

この手順を行った環境・バージョンは次の通りです。
GPUが貧弱ですが。。

  • Windows11 Pro 21H2
  • Intel Core i9-10900K 3.70GHz
  • NVIDIA GeForce GTX 1070 / GeForce Game Ready ドライバー 512.95
  • Windows Terminal (Preview) 1.13.10984.0
  • IntelliJ IDEA Ultimate 2021.3.3 (Community版はWSL対応していないのでUltimate版が必要)
    • Plugin: Python 213.7172.26

以下の流れで、作業を進めていきます。

  • WSLとUbuntuLinuxのインストール、環境のコピー
  • Anacondaのインストール
  • Conda環境の作成
  • IntelliJ IDEAの設定
  • PyTorchのサンプルを動かす
  • CUDAのセットアップ
  • GPUでPyTorchのサンプルを動かす

WSLのインストール

以下を参考にWSLをインストールします。

WSLのインストール | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/wsl/install

管理者としてWindows PowerShellを起動して、次のコマンドを実行します。

wsl --install

既にインストール済みの場合は、次のコマンドで最新版に更新しておきます。
※更新を反映するためには、一旦shutdownが必要

wsl --update
wsl --shutdown

Ubuntu Linuxのインストール

次はWSLにUbuntuLinuxをインストールします。

Windows PowerShellを起動し、次のコマンドを実行すると、
利用可能なDistribution一覧が確認出来ます。

wsl --list --online

ここでは最新のUbuntuLinuxUbuntu-20.04をインストールします。
次のコマンドでインストールします。

wsl --install -d "Ubuntu-20.04"

ユーザ名・パスワードを聞かれるので指定します。

インストールされているDistributionは、次のコマンドで確認出来ます。

wsl --list

誤ってインストールしてしまった場合は、--unregisterで削除できます。
次の例は、誤って16.04をインストールしてしまった場合

wsl --unregister Ubuntu-16.04

UbuntuLinxuの環境を増やす

先ほどインストールした環境で作業を行っても良いのですが、
開発案件ごとに環境を分けておいた方が都合が良いことも多いので、
UbuntuLinuxの環境を複製して、増やしておきます。

Windows PowerShellを起動し、次のコマンドで環境をエクスポートします。

wsl.exe --export "Ubuntu-20.04" ubuntu-20.04.tar
mv ubuntu-20.04.tar c:\wsl

次のコマンドで環境を、別名称(Ubuntu-20.04-pytorch)でインポートします。

mkdir -p c:\wsl\ubuntu-pytorch
wsl.exe --import "Ubuntu-20.04-pytorch" c:\wsl\ubuntu-pytorch c:\wsl\ubuntu-20.04.tar

別名称の環境が増えたことを確認します。

> wsl --list
Linux 用 Windows サブシステム ディストリビューション:
Ubuntu-20.04 (既定)
Ubuntu-20.04-pytorch

複製した環境では、既定ユーザがルートになるので、
レジストリを書き換える必要があります。
以下のコマンドで書き換えます。
部分は自分のユーザ名に置き換えてください

Function WSL-SetDefaultUser ($distro, $user) { Get-ItemProperty Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Lxss\*\ DistributionName | Where-Object -Property DistributionName -eq $distro | Set-ItemProperty -Name DefaultUid -Value ((wsl -d $distro -u $user -e id -u) | Out-String); };
WSL-SetDefaultUser Ubuntu-20.04-pytorch <UserName>

参考: https://github.com/Microsoft/WSL/issues/3974

Windows Terminalに、複製した環境のプロファイルを追加します。

Windows Terminal → 設定 → 新しいプロファイルを追加します と進み、
「プロファイルを複製する」で「Ubuntu-20.04」を選んで、「複製」を押下します。
複製された「Ubuntu-20.04(コピー)」の設定を次のように変更します。

  • 名前: Ubuntu-20.04(コピー) → Ubuntu-20.04-pytorch
  • コマンドライン: C:\WINDOWS\system32\wsl.exe -d Ubuntu-20.04 → C:\WINDOWS\system32\wsl.exe -d Ubuntu-20.04-pytorch

また、複製元環境と区別できるように、
追加の設定 → 外観 → 配色 で色を変更しておくことをおすすめします。

以上で、
Windows Terminalの「Ubuntu-20.04-pytorch」から、
複製した環境を利用出来るようになりました。

以下の記事を参考にしました、ありがとうございます。

複数の WSL (Linux インスタンス) をコピーして使う | Zenn https://zenn.dev/takajun/articles/50044292cf6060

WSLでimport、export、デフォルトユーザー名を変更 | アプリ開発備忘録 https://matsudamper.hatenablog.com/entry/2020/01/06/173939

UbuntuLinuxにPython(Anaconda)をインストール

ここでは、次の手順を参考にAnacondaをインストールします。

参考: Linux版Anacondaのインストール | Python環境構築ガイド
https://www.python.jp/install/anaconda/unix/install.html

AnacondaのサイトのInstallerの箇所から、
「Linux」の「64-Bit (x86) Installer」を探し、リンク先URLをコピーします。

ANACONDA DISTRIBUTION | ANACONDA
https://www.anaconda.com/products/distribution

WindowsTerminalで、Ubuntu-20.04-pytorch環境に接続し、
以下のように、インストーラーのURLをwgetして、実行します。

wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
sh Anaconda3-2022.05-Linux-x86_64.sh

License Agreement・インストール先を確認、
「by running conda init? [yes|no]」は「yes」と入力します。

Terminalを再起動し、以下コマンドでconda環境を自動で有効にしないように変更します。

conda config --set auto_activate_base false

Conda環境と作業ディレクトリの準備

サンプルを動かすためのConda環境を作成します。

conda create --name studycpu python=3.9

Conda環境が作成されたことを確認します。

conda info --envs

Conda環境をactivateします。

conda activate studycpu

Conda環境のpythonコマンドのパスを確認しておきます。

which python

作業ディレクトリを作成します。

mkdir ~/study
touch ~/study/sample.py

IntelliJ IDEAのプロジェクト設定

WindowsでIntelliJ IDEAを起動します。

Open Projectで、先ほど作成した作業ディレクトリを開きます。
Windowsから見ると\\wsl$\Ubuntu-20.04-pytorch\home\<UserName>\studyという名称です。

File → Project Structure → SDKs → + → Add Python SDK → WSL と選び、
次の通り指定してSDKを追加します。

  • LinuxDistribution: Ubuntu-20.04-pytorch
  • Python interpreter path: 先ほど確認したConda環境のpythonコマンドのパス

File → Project Structure → Project と選び、SDKに先ほどのPython SDKを指定します。

このあとPythonSDKのIndexingが行われるのでしばらく待ちます。
Indexingされなかったら、IDEAを一旦終了させて開き直すと動いたりします。
Indexingが終わるとコード補完などが行われるようになります。

IDEAのTerminalも設定しておきます。
自動的にConda環境をactivateできると便利なので、そのための設定も行います。

まず、渡された環境変数に応じてConda環境を切り替えるように、
~/.bashrcに以下を追記します。

if [ -v CONDA_ENV ]; then conda activate "$CONDA_ENV"; fi

Settings → Tootls - Treminal と選び、次の通り指定します。

  • Shell path: wsl.exe --distribution Ubuntu-20.04-pytorch
  • Environment variables:
    • CONDA_ENV=studycpu
    • WSLENV=CONDA_ENV/u

以上でIDEAからTerminalを開くと、Conda環境が自動で有効になります。

WSLENVはWSLに環境変数を引き渡すための設定です、
詳しくは次のページを参照してください。

WSLENV を使用して Windows と WSL の間で環境変数を共有する | Microsoft Docs
https://docs.microsoft.com/ja-jp/windows/wsl/filesystems#share-environment-variables-between-windows-and-wsl-with-wslenv

sample.pyに適当なプログラムを書いて、
IDEAやTerminalから実行出来ることを確認しておきます。

sample.py

if __name__=="__main__":
    print("foobar")

例えば、Terminalからは以下のように動作確認できます。

(studycpu) <UserName>@<HostName>:~/study$ python sample.py 
foobar

PyTorchのサンプルを動かす (CPU)

ひとまずCPUでPyTorchのサンプルを動かしてみます。

以下のサイトで、インスト-ル用コマンドを調べて実行します。

START LOCALLY | PyTorch
https://pytorch.org/get-started/locally/

選択した環境: Stable(1.11.0) / Linux / Conda / Python / CPU

わたしが参照した時点のコマンドは、以下の通り。

conda install pytorch torchvision torchaudio cpuonly -c pytorch

ライブラリをインストールしたら、
以下のQUICKSTARTページで紹介されているコードを動かしてみます。

QUICKSTART | PyTorch
https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html

Working with data ~ Optimizing the Model Parameters くらい動かせば、
動作確認としては十分だと思うので、GPU版の環境整備にすすみます。

CUDAのセットアップ

次のサイトを参照して、作業を進めていきます。

CUDA on WSL User Guide | NVIDIA DEVELOPER ZONE - CUDA TOOLKIT DOCUMENTATION https://docs.nvidia.com/cuda/wsl-user-guide/index.html

まずはWindows側にGPU Driverをインストールします。
以下から、使用しているProductにあったドライバをダウンロードしインストールします。

NVIDIA Driver Downloads | NVIDIA
https://www.nvidia.com/download/index.aspx

インストールしたら、次のコマンドでGPUを認識しているかを確認します。

nvidia-smi

以下のページで、
対象環境のCUDAのインストールコマンドを調べ、インストールします。

CUDA Toolkit 11.7 Downloads | NVIDIA DEVELOPER
https://developer.nvidia.com/cuda-downloads

選択したTarget:
Linux / x86_64 / WSL-Ubuntu / 2.0 / dev(local)

わたしが参照した時点のコマンドは、以下の通り。

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
wget https://developer.download.nvidia.com/compute/cuda/11.7.0/local_installers/cuda-repo-wsl-ubuntu-11-7-local_11.7.0-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-11-7-local_11.7.0-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-11-7-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

CUDAがインストールできたら、
サンプルを動かしてGPUが有効になっているか確認しておきます。

以下のとおり、CUDAのサンプルをcloneします。

git clone https://github.com/nvidia/cuda-samples

以下の通り、サンプルをmakeして動かします。

cd ~/cuda-samples/Samples/5_Domain_Specific/BlackScholes
make
../../../bin/x86_64/linux/release/BlackScholes

PyTorchのサンプルを動かす (GPU版)

GPU用のサンプルを動かすためのConda環境を、
作成及びactivateします。

conda create --name studygpu python=3.9
conda activate studygpu

CPU版同様、次のサイトで調べたコマンドを実行します。

START LOCALLY | PyTorch
https://pytorch.org/get-started/locally/

選択した環境: Stable(1.11.0) / Linux / Conda / Python / CUDA 11.3

わたしが参照した時点のコマンドは、以下の通り。

conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch

GPU用のConda環境のpythonコマンドのパスも確認しておきます。

which python

IntelliJ IDEA側の設定もGPU環境に変更しておきます。

File → Project Structure → SDKs → + → Add Python SDK → WSL と選び、
次の通り指定してSDKを追加します。

  • LinuxDistribution: Ubuntu-20.04-pytorch
  • Python interpreter path: 先ほど確認したGPU用Conda環境のpythonコマンドのパス

File → Project Structure → Project と選び、SDKをGPU用SDKに変更します。

Terminalの設定も変更します。
Settings → Tootls - Treminal と選び、次の通り指定します。

  • Shell path: wsl.exe --distribution Ubuntu-20.04-pytorch
  • Environment variables:
    • CONDA_ENV=studygpu ←変更箇所
    • WSLENV=CONDA_ENV/u

CPU版と同様にQUICKSTARTページをサンプルを動かします。
GPUを使っているかどうかは、nvidia-smiコマンドやタスクマネージャを使って確認できます。

以上。。