WSL2 + AlmaLinux-9 + CUDA + PyTorch 環境構築


Windows 11 の WSL2 + AlmaLinux-9 環境上で NVIDIA CUDA 環境のインストールと PyTorch の動作確認をしたときのメモ。

なぜ AlmaLinux なのかというと自分の普段の仕事では RHEL 系で開発していて使い慣れているから、というそれだけの理由です。特に拘りがなければ Ubuntu のほうが楽で情報も多いと思います。

## 概要

おおまかな作業の流れは以下の通り。
 * (1) Windows 上で NVIDIA ドライバをインストールする
 * (2) WSL2 (AlmaLinux-9) をインストールする(以降の手順は WSL2上で実施)
 * (3) CUDA Toolkit 12.8(最新版)を Rocky 9 の手順に沿ってインストールする
     * ここではドライバはインストールしない
 * (4) Python バージョン切替・仮想環境用に pyenv インストールする
 * (5) PyTorch 2.6.0(最新版) をインストールして動作確認する
 * (6) 古いバージョンの CUDA Toolkit, PyTorch を共存させてインストールしてみる

詳細は以下の NVIDIA の公式ドキュメントを参照してインストールする。
 * [CUDA on WSL User Guide](https://docs.nvidia.com/cuda/wsl-user-guide/index.html)

## NVIDIA ドライバのインストール

以下の公式ドキュメントに手順に従ってインストールする
 * [2.1. Step 1: Install NVIDIA Driver for GPU Support](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#step-1-install-nvidia-driver-for-gpu-support)

NVIDIA ドライバは以下から自分の環境に合わせてダウンロード・インストールする。
   * https://www.nvidia.com/en-us/drivers/
   * 自分の環境の場合はこれ
     * [NVIDIA Studio Driver 572.83 | Windows 11](https://www.nvidia.com/en-us/drivers/details/242242/)


## WSL2のインストール
 * AlmaLinux-9 ディストリビューションをインストール
```powershell
PS> wsl --install AlmaLinux-9
```
 * WSLカーネルの最新化
```powershell
PS> wsl --update
```
 * WSL2 環境の起動
 ```powershell
 PS> wsl
 $
 ```
  * WSL2環境からドライバが見えていることを確認
 ```bash
$ ls -l /usr/lib/wsl/lib/libcuda.so
-r-xr-xr-x 4 root root 166872 Mar 15 08:58 /usr/lib/wsl/lib/libcuda.so
$
```

## CUDA Toolkit 12.8 (最新版)のインストール

CUDA Toolkit 12.8(現時点での最新版)をインストールする。

以下の公式ドキュメントの「**Option 2:**」の手順に従ってインストールする。
  * [3. CUDA Support for WSL 2](https://docs.nvidia.com/cuda/wsl-user-guide/index.html#cuda-support-for-wsl-2)
   * **Option 2: Installation of Linux x86 CUDA Toolkit using Meta Package**

具体的な手順・インストールパッケージは以下の Rocky 9 の手順を参考にする。
 *  [CUDA Toolkit 12.8 Update 1 Downloads](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Rocky&target_version=9&target_type=rpm_local)
     *  [Linux -> x86_64 -> Rocky -> 9 -> rpm(local)](https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&Distribution=Rocky&target_version=9&target_type=rpm_local)

```bash
wget https://developer.download.nvidia.com/compute/cuda/12.8.1/local_installers/cuda-repo-rhel9-12-8-local-12.8.1_570.124.06-1.x86_64.rpm
sudo rpm -i cuda-repo-rhel9-12-8-local-12.8.1_570.124.06-1.x86_64.rpm
sudo dnf clean all
sudo dnf -y install cuda-toolkit-12-8
```

インストールするのは ```cuda-toolkit-12-8``` のみ。ここでドライバはインストールしないこと。

 * インストール完了後の確認
```bash
$ /usr/local/cuda/bin/nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2025 NVIDIA Corporation
Built on Fri_Feb_21_20:23:50_PST_2025
Cuda compilation tools, release 12.8, V12.8.93
Build cuda_12.8.r12.8/compiler.35583870_0
$ 
```

これで動作しているっぽい。

## Python 環境設定

pyenv と venv を使ったPython仮想環境を準備する。

pyenv はPython バージョン切替のためにインストールする。
他にも ```alternatives``` を利用する方法もあるが、他環境(MacOS/Homebrew)との手順共通化やディストリビューションに含まれないバージョン利用時のために今回は pyenv を利用した。

* 参考: AlmaLinux-9 標準の Python バージョン
```bash
$ python -V
Python 3.9.21
```

### pyenv のインストール
[pyenvのドキュメント](https://github.com/pyenv/pyenv) に従ってインストール

 * 開発用ツールと依存パッケージのインストール
```bash
$ sudo dnf group install "Development Tools"
$ sudo dnf install git
$ sudo dnf install bzip2-devel readline-devel openssl-devel sqlite-devel libffi-devel tk-devel
```
 * pyenv をダウンロード
```bash
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
 * pyenv 高速化(省略可)
```bash
cd ~/.pyenv && src/configure && make -C src
```
 * ```~/.bashrc``` への設定追加
```~/.bashrc
### pyenv
export PYENV_ROOT="$HOME/.pyenv"
[[ -d $PYENV_ROOT/bin ]] && export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init - bash)"
```
 * ```~/.bashrc``` 設定の有効化(もしくはWSL2シェルをいったん終了し再起動)
```bash
$ . ~/.bashrc
```
 * pyenv インストール完了後の確認
```bash
$ pyenv versions
* system (set by /home/XXX/.pyenv/version)
$
```
 * pyenv 用 Python 3.9.12 インストール
     * AlmaLinux-9 の同梱版も Python-3.9.12 であるが、今後 pyenv でバージョン切り替えできるようにするためにインストール
```bash
$ pyenv install 3.9.12
(略)
$ pyenv versions
* system (set by /home/XXX/.pyenv/version)
  3.9.12
```

## PyTorch 動作確認

### Python 仮想環境作成

作業ディレクトリ配下で以下を実行する

 * Python バージョン指定
```
$ pyenv local 3.9.12
```
 * Python 仮想環境作成
```
$ python -m venv ./venv-cuda128
```
 * Python 仮想環境の有効化
```
$ . ./venv-cuda128/bin/activate
```
 * pip 最新化
```
$ pip install --upgrade pip
```

### PyTorch インストール
 * インストール時点での PyTorch 最新バージョン
   * PyTorch: 2.6.0 (Stable)
   * 対応CUDA: 12.6

これを試している時点では CUDA-12.8 は Nightly 開発版しか対応してなかったので、CUDA-12.6 用のリポジトリを使用。

 * PyTorch インストール
```
$ pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu126
```

### PyTorch 動作確認
 * 状態表示スクリプト例
```torch-info.py
#!/usr/bin/env python3

import torch

print(f"{torch.__version__                   = }")
print(f"{torch.cuda.is_available()           = }")
print(f"{torch.version.cuda                  = }")
print(f"{torch.cuda.device_count()           = }")
print(f"{torch.cuda.get_device_name()        = }")
print(f"{torch.cuda.get_device_capability()  = }")
print(f"{torch.backends.cudnn.is_available() = }")
print(f"{torch.backends.cudnn.version()      = }")
```
 * 実行結果
```
$ ./torch-info.py
torch.__version__                   =  2.6.0+cu126
torch.cuda.is_available()           =  True
torch.version.cuda                  =  12.6
torch.cuda.device_count()           =  1
torch.cuda.get_device_name()        =  NVIDIA GeForce RTX 4070 Laptop GPU
torch.cuda.get_device_capability()  =  (8, 9)
torch.backends.cudnn.is_available() =  True
torch.backends.cudnn.version()      =  90501
$
```

ちゃんと動作しているっぽい。最新版のインストールはここまでで完了。

----
## 以前のバージョンの CUDA ToolKit / PyTorch との共存

自分の使いたいアプリケーションで古いバージョンの PyTorch に依存しているものがあるので、古いバージョンと共存してインストールしたい。

今回は以下のバージョンの組み合わせをインストールする。
 * Python: 3.9
 * PyTorch: 1.10.0
 * CUDA Toolkit: 11.3

### CUDA Toolkit 11.3 のインストールパッケージ

CUDA Toolkit の以前のバージョンは [CUDA Toolkit Archive](https://developer.nvidia.com/cuda-toolkit-archive) から参照できる。

 * [CUDA Toolkit 11.3 Update 1 Downloads](https://developer.nvidia.com/cuda-11-3-1-download-archive)

しかし、CUDA-11.3 は RHEL7 / RHEL8用RPMしか提供されていない。

今回は RHEL8 用RPMパッケージを利用して AlmaLinux-9 にインストールする方法を試してみた。自分が試してみた範囲では問題なく動作している。

自分以外でも CUDA 11.4 rhel8用パッケージを Rocky 9 で動作させた人がいるらしい。
 * [Cuda 11.4 on Rocky 9 Linux](https://forums.developer.nvidia.com/t/cuda-11-4-on-rocky-9-linux/240636)

### AlmaLinux-9 でのインストール手順

 * RHEL8 用パッケージをダウンロードしリポジトリをインストールする
     * ここまでは公式の手順と同じ
```
wget https://developer.download.nvidia.com/compute/cuda/11.3.1/local_installers/cuda-repo-rhel8-11-3-local-11.3.1_465.19.01-1.x86_64.rpm
sudo rpm -i cuda-repo-rhel8-11-3-local-11.3.1_465.19.01-1.x86_64.rpm
sudo dnf clean all
```
 * ```cuda-toolkit-11.3``` をインストールする
     * ここは公式の手順と異なるので注意
     * ```nvidia-driver```や ```cuda``` はインストールしてはいけない(はず。おそらく誤ったドライバが上書きされてしまう)
```
$ sudo dnf install cuda-toolkit-11.3
```
 * ```alternatives```コマンドで CUDA Toolkit のバージョンを 11.3 へ切り替える
```
$ sudo alternatives --config cuda

There are 2 programs which provide 'cuda'.

  Selection    Command
-----------------------------------------------
*+ 1           /usr/local/cuda-12.8
   2           /usr/local/cuda-11.3

Enter to keep the current selection[+], or type selection number: 2
```
 * ```nvcc``` で動作確認
```
$ /usr/local/cuda/bin/nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:15:13_PDT_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0
$
```

おそらくこれで動作してるっぽい。

### Python 仮想環境の準備

 * 作業用ディレクトリを作成し Python 仮想環境を準備する
```bash
$ mkdir pytorch1.10-test
$ cd pytorch1.10-test/
$ pyenv local 3.9.12
$ python -m venv ./venv-cuda113
$ . ./venv-cuda113/bin/activate
$ pip install --upgrade pip
```

### PyTorch (過去のバージョン)の動作確認
 * PyTorchの過去のバージョンの情報は以下のページを参照
     * https://pytorch.org/get-started/previous-versions/#linux-and-windows-41

 * ```torch 1.10.0+cu113``` をインストールする 
     * PyTorch の公式ページには cu111 までしか記載がないが、過去のアプリケーションの実績として cu113 を利用していたため今回も cu113 を指定
     * numpy も過去の動作実績のあるバージョンを指定。指定しないと互換性のない numpy-2.* がインストールされてしまいインストールが失敗する
```bash
$ pip install numpy==1.20.3 torch==1.10.0+cu113 torchvision==0.11.0+cu113
 -f https://download.pytorch.org/whl/torch_stable.html
```
 * PyTorch の動作確認
```bash
$ ./torch-info.py
torch.__version__                   =  1.10.0+cu113
torch.cuda.is_available()           =  True
torch.version.cuda                  =  11.3
torch.cuda.device_count()           =  1
torch.cuda.get_device_name()        =  NVIDIA GeForce RTX 4070 Laptop GPU
torch.cuda.get_device_capability()  =  (8, 9)
torch.backends.cudnn.is_available() =  True
torch.backends.cudnn.version()      =  8200
$
```

ちゃんと動作してるっぽい。

この後、このバージョンを利用するアプリケーションが正常に動作することも確認済み。

----
以上