[Windows / Pytorch] GPU付き windows10 で Pytorch 実行するまで (Docker, conda, WSL なしの縛りプレイでゼロから環境構築)

# 概要

Docker, conda, WSL なしで Python + cuda + Pytorch の環境を構築しようという縛りプレイです。

個人的には、この現代において到底考えられない環境なのですが。

必要になったので已むをえません。どなたかのお役に立てることを祈りつつ記事化します。

# 環境

|リソース / Package|version|
|:--|:--|
|windowsOS|10|
|GPU|GeForce RTX 3060|
|WSL|**使わない**|
|docker|**使わない**|
|anaconda / miniconda|**使わない**|
|Visual Studio|2017|
|Nvidia-driver|512.89|
|cuda|11.2|
|cuda-toolkit|11.2.2|
|cudnn|不要|
|pyenv-win|3.1.1|
|python|3.7.3|
|torch|2.0.1|
|Cython|3.0.2|


# 手順

## Visual Studio 2017

VisualStudio 2017 のインストール手順は以下に従う。

https://qiita.com/siruku6/items/0acd240df2e842300a30#2017-%E4%BB%A3%E6%9B%BF%E7%AD%96-20231001

### VisualStudio インストールにあたっての注意点

- Python を install する前にこの install を実施する
- Install 中に、ワークロードの選択画面がありますが、**Python を選択**する
- Install が終わったら PC ごと再起動する

そうしないと、`Cython` や `swig` 使用時に `unable to find vcvarsall.bat` に苦しめられる可能性があります。

参考: [How to deal with the pain of “unable to find vcvarsall.bat”](https://devblogs.microsoft.com/python/unable-to-find-vcvarsall-bat/#:~:text=select%20the%20Python%20development%20workload%20and%20the%20Native%20development%20tools%20option.
)

## VSCode

https://code.visualstudio.com/download

![vscode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/082c7ec3-0798-a23d-2a12-e214cbfb63fc.png)

exeファイルをダウンロードして実行。

## Git

https://gitforwindows.org/

上記サイトから exe ファイルをダウンロードして実行。

- 参考サイト

https://www.curict.com/item/60/60bfe0e.html

## pyenv-win

公式 Repository に記載されている以下の手順に従う。

https://github.com/pyenv-win/pyenv-win/blob/master/docs/installation.md#git-commands

上記リンク先に記載されている手順を、以下にも書いておきます。

Open your `powershell` and exec the following command.

```powershell:powershell
> git clone https://github.com/pyenv-win/pyenv-win.git "$HOME\.pyenv"
Cloning into 'C:\Users\USERNAME\.pyenv'...
remote: Enumerating objects: 3120, done.
remote: Counting objects: 100% (191/191), done.
remote: Compressing objects: 100% (99/99), done.
remote: Total 3120 (delta 111), reused 155 (delta 92), pack-reused 2929
Receiving objects: 100% (3120/3120), 3.63 MiB | 12.50 MiB/s, done.
Resolving deltas: 100% (2009/2009), done.
```

Add four paths for `pyenv` by executing the following commands.

```powershell:powershell
> [System.Environment]::SetEnvironmentVariable('PYENV',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
```

```powershell:powershell
> [System.Environment]::SetEnvironmentVariable('PYENV_ROOT',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
```

```powershell:powershell
> [System.Environment]::SetEnvironmentVariable('PYENV_HOME',$env:USERPROFILE + "\.pyenv\pyenv-win\","User")
```

```powershell:powershell
> [System.Environment]::SetEnvironmentVariable('PATH', $env:USERPROFILE + "\.pyenv\pyenv-win\bin;" + $env:USERPROFILE + "\.pyenv\pyenv-win\shims;" + [System.Environment]::GetEnvironmentVariable('PATH', "User"),"User")
```

**Restart powershell** and check whether `pyenv` is installed successfully or not.

```powershell:powershell
> pyenv --version
pyenv 3.1.1
```

ただし、PCによっては `PowerShellでこのシステムではスクリプトの実行が無効になっている` といったエラーが発生することがある。

その場合は以下の記事に従って、

https://qiita.com/ponsuke0531/items/4629626a3e84bcd9398f

以下のコマンドをどちらか実行する。

```powershell:powershell
# powershell を起動し直す度に実行する必要あり
> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope Process

# 試してないが、おそらく1回実行したらそれきりでよさそう。。。
> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
```


## Python

```powershell:powershell
> pyenv install 3.7.3
:: [Info] ::  Mirror: https://www.python.org/ftp/python
:: [Downloading] ::  3.7.3 ...
:: [Downloading] ::  From https://www.python.org/ftp/python/3.7.3/python-3.7.3-amd64.exe
:: [Downloading] ::  To   C:\Users\USERNAME\.pyenv\pyenv-win\install_cache\python-3.7.3-amd64.exe
:: [Installing] ::  3.7.3 ...
:: [Info] :: completed! 3.7.3
```

## Create and enable venv

```powershell:powershell
> pyenv global 3.7.3
> python -m venv .venv
> .\.venv\Scripts\activate
(.venv) >
```

## pip modules

Maybe, it might be better to install `wheel` in advance.

Make `requirements.txt` like this.

```powershell:powershell
> New-Item requirements.txt -type file 
```

```bash:requirements.txt
Cython==3.0.2
grad-cam==1.4.6
jupyter==1.0.0
lightgbm==4.0.0
matplotlib==3.7.3
numpy==1.24.4
opencv-python==4.8.0.76
openpyxl==3.1.2
pandas==2.0.3
Pillow==10.0.1
pytorch-lightning==2.0.6
scipy==1.10.1
scikit-learn==1.3.0
streamlit==1.22.0
torch==2.0.1
torchvision==0.15.2
tqdm==4.65.0
```

And run the following command.

```powershell:powershell
# 注意) `pip install -r .\requirements.txt` だと opencv install に失敗した
> python3 -m pip install -r .\requirements.txt

# install し直すときは、以下のように `--no-cache-dir` をつける
# pip install -r .\requirements.txt --no-cache-dir

Collecting Cython==3.0.2
  Downloading Cython-3.0.2-cp38-cp38-win_amd64.whl (2.8 MB)
     |████████████████████████████████| 2.8 MB 3.3 MB/s
Installing collected packages: Cython
Successfully installed Cython-3.0.2

... (略)

    Running setup.py install for progress ... done
    Running setup.py install for future ... done
Successfully installed MarkupSafe-2.1.3 Pillow-10.0.1 PySocks-1.7.1 ... (略)
```

I was surprised that all modules were installed much more easily than I expected !

Check whether the packages are installed successfully or not.

```powershell:powershell
> python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import cv2, torch, scipy
>>> torch.__version__
1.12.1+cu113
>>>
```

## cuda-toolkit

自分の場合 cuda-toolkit をインストールしたところ、 cuda のバージョンも書き換わった。
なので、既に cuda がインストールされていても、それとは異なる cuda-toolkit のバージョンをインストールしても良いと思われる（確証はないが。。。）

ただ、GPU、 Nvidia-driver に適合しない cuda-toolkit では恐らく動作しないと思われるので、 install すべき cuda-toolkit のバージョン確認は必須。

### version 確認

Nvidia-driver と cuda (cuda-toolkit) のバージョン対応表については、以下の記事が詳しい。

https://pystyle.info/pytorch-relationship-between-gpu-and-driver-cuda-and-cudnn-versions/

公式サイトだと、以下の2つの表に記載されている。

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id5

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id6

自分の場合は、以下のようにして Nvidia-driver のバージョンを確認した。

```powershell:powershell
> nvidia-smi
Tue Oct  3 15:46:50 2023       
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 512.89       Driver Version: 512.89       CUDA Version: 11.6     |
|-------------------------------+----------------------+----------------------+
| GPU  Name            TCC/WDDM | Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  NVIDIA GeForce ... WDDM  | 00000000:01:00.0 Off |                  N/A |
# 以下略
```

これで　Nvidia-driver の version 判明 - `512.89`。

次のサイトで、 installer をダウンロード。

https://developer.nvidia.com/cuda-toolkit-archive

後は、 installer を実行してしまえば、 installer に表示される説明文に従ってインストールを進められます。

この部分については、以下の記事が画面付きで手順を解説しているので、心配な人はそちらを参照。

[（Windows版）PyTorchでGPUを使えるようにするまでを画像付きで詳細に解説](https://frqux.hatenablog.com/entry/2023/02/07/062433#NVIDIA%E3%83%89%E3%83%A9%E3%82%A4%E3%83%90%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB:~:text=%E3%81%AF%E5%AE%8C%E4%BA%86%E3%81%A7%E3%81%99%E3%80%82-,CUDA%20Toolkit%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB,-%E6%AC%A1%E3%81%AB%E3%80%81CUDA%20Toolkit)

installer が以下のような画面表示になったら、`cuda-toolkit` のインストールは完了。

![nvidia_fin.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/327407/57ce22a5-c749-4768-9c91-6c1aa2f7f42c.png)

念のため、`powershell`を再起動して、toolkitのインストール結果を確認。

```powershell:powershell
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Sun_Feb_14_22:08:44_Pacific_Standard_Time_2021
Cuda compilation tools, release 11.2, V11.2.152
Build cuda_11.2.r11.2/compiler.29618528_0
```

```powershell:powershell
> python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> torch.cuda.is_available()
True
>>>
```

torch からも呼び出せてるのでOK。


## cudnn

なくても動いた。


# 参考情報

## Nvidia-driver バージョン確認

GPU に対応する `Nvidia-driver` のバージョンを知りたい時に、以下のサイトを使う。

https://www.nvidia.co.jp/Download/index.aspx?lang=jp

## cuda-toolkit のバージョン情報

`Nvidia-driver` に対応する `cuda-toolkit` のバージョンを知りたい時に、以下のサイトを見る。

https://pystyle.info/pytorch-relationship-between-gpu-and-driver-cuda-and-cudnn-versions/

https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html#id5


## 全般

https://frqux.hatenablog.com/entry/2023/02/07/062433

https://qiita.com/n-yamanaka/items/b00a94eec7eac4d2e76a


## cuda はいつインストールされるのか

- cuda-toolkit をインストールすると、 cuda もインストールされているように見える。
- ChatGPT は Nvidia-driver インストール時に cuda がインストールされると言っていた。

矛盾している。。。 ChatGPT ではそこまではわからないのだろうか。。