GeForce Laptop GPUでPyTorchが動くようにするまで(Windows11編)

この前買ったノートパソコンにGPUが付いていたので、せっかくだからこのGPUでPyTorchを動かしてみました。

今回はその時のセットアップの手順をまとめます。

(Windows11上で動かす前提です。WSL2の方はそのうち。)

# 環境

- ASUS Vivobook 16X
- NVIDIA GeForce RTX 4060 Laptop GPU
- Windows 11 Home

# 必要なもの一覧

- NVIDIA Driver
- CUDA
- cuDNN
- Python
- PyTorch

# NVIDIA Driverのインストール

内蔵GPUだったせいか`スタート>すべてのアプリ`の一覧の中に`NVIDIA Contorol Panel`というものがあって、既にNVIDIA Driverが入っているみたいです。

![スクリーンショット 2023-11-25 214756.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/6f6581fd-014c-e643-423b-1e44da885a80.png)

バージョンは528.96だそうです。

一応公式サイトで最新バージョンか確認してみます。
https://www.nvidia.co.jp/Download/index.aspx?lang=jp

![スクリーンショット 2023-11-25 220111.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/173bfcd4-d09e-f03d-0074-69661f529be1.png)

![スクリーンショット 2023-11-25 220124.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/8fdbc875-600b-0895-7bf9-0aa0e690910c.png)

最新版は546.01みたいです。更新しましょう。

NVIDIA Driverの更新は`GeForce Experience`というアプリを使うのが主流のようですが、アカウント登録が必要だったり面倒なので、公式サイトから直接インストーラをダウンロードします。

:::note info
後の工程で結局アカウント登録が必要になるので、ここで登録してしまって良いと思います。
:::

さっきのページから落としてきたインストーラを実行します。

![スクリーンショット 2023-11-25 222051.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/dc39718b-ced0-28c4-9457-f3024df8509a.png)

![スクリーンショット 2023-11-25 222528.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/b3cb1958-3d0e-bd01-7065-a35937f28110.png)

特に特別な操作はなく完了します。

再度`NVIDIA Contorol Panel`を開いて確認します。

![スクリーンショット 2023-11-25 222553.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/1c7c3d9c-07ba-097d-3129-071c1dc32e5f.png)

546.01になりました。

一応再起動をしてNVIDIA Driverの更新は完了です。

# CUDAのインストール

もう一度NVIDIAの公式サイトへ行ってCUDA Toolkitのインストーラを配布しているページを開きます。
https://developer.nvidia.com/cuda-downloads

![スクリーンショット 2023-11-25 224509.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/20c36b92-ec13-cab9-7594-20e619d230f9.png)

インストーラを実行するとさっきと似たような画面が出てくるので、似たような感じで操作すれば完了します。

![スクリーンショット 2023-11-25 224614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/c38be43e-0d19-c566-1fa2-42b4b47b74f5.png)

# エラーが出ました。

![スクリーンショット 2023-11-25 232515.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/3684e57b-2139-cd21-400e-77d7537e7ece.png)

Nsight Computeというやつで失敗しているようです。

調べてみるとNsight ComputeはVisual StudioでCUDAを使うときに必要なもののようで、今回は不要そうです。

インストーラオプションのカスタムからNsight Computeのチェックを外してもう一度やってみます。

![スクリーンショット 2023-11-26 094245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/06b8993d-5ae6-ca31-84b7-1c9395f749c4.png)

![スクリーンショット 2023-11-26 095044.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/50c4db31-7b9b-8ac3-9187-8e87585250ca.png)

できました。

![スクリーンショット 2023-11-26 095549.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/2d773d93-762e-a7aa-3eb2-34226232b00b.png)

システム環境変数にもPathが通っています。

![スクリーンショット 2023-11-26 100142.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/2a5f4701-00ad-24c7-2657-56877ba0d80f.png)

PowerShellからもバージョンが確認できました。

```shell
> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2023 NVIDIA Corporation
Built on Fri_Nov__3_17:51:05_Pacific_Daylight_Time_2023
Cuda compilation tools, release 12.3, V12.3.103
Build cuda_12.3.r12.3/compiler.33492891_0
```

念のためもう一度再起動してCUDAのインストールは完了です。

# cuDNN

cuDNNのページへ行き、インストーラをダウンロードしてきます。
https://developer.nvidia.com/cudnn

![スクリーンショット 2023-11-26 102411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/a07d7921-1671-1b20-a835-ebf081014a33.png)

アカウント登録を求められました。

![スクリーンショット 2023-11-26 102428.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/4b108241-6a4c-8e77-c708-113a4a88615c.png)

登録しないと無理そうなので登録します。

そのあとダウンロードページを開けるようになるので、自分の環境に合ったパッケージを選びます。

![スクリーンショット 2023-11-26 103256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/e88df51a-9c43-eb8a-4378-0b002402c3d5.png)

Zipがダウンロードされるので展開します。
展開するとLICENSE、include、lib、binというファイルやディレクトリがあるので、これを適当な場所へ移動します。
今回は`C:\Program Files\NVIDIA GPU Computing Toolkit\cuDNN\v12.3`のディレクトリを作ってここへ移動しました。

次にPathを通してあげます。
システム環境変数の「Path」の編集からさっき移動したディレクトリのうち、binまでのパスを追加してあげます。

![スクリーンショット 2023-11-26 111419.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/e1402861-f282-cff5-647e-498dd4a544de.png)

(今回追加したのは３つ目で、上２つはCUDAのインストールの時に勝手に追加してもらったものです。)

一応Pathが通っていることをPowerShellで確認。

```shell
> where cudnn64_8.dll
C:\Program Files\NVIDIA GPU Computing Toolkit\cuDNN\v12.3\bin\cudnn64_8.dll
```

大丈夫そうですね。もう一度再起動してcuDNNのインストールは完了です。

# Pythonのインストール

今回はpyenvを使います。pyenvはPythonのバージョンを簡単に切り替えられて便利です。

:::note info
pyenvはターミナルの動作が重くなって使いたくないという人は、バージョンを切り替えるたびにPythonを再インストールすれば良いと思います。
:::

pyenv-winのGitHubページを参考にインストールします。
https://github.com/pyenv-win/pyenv-win

```shell
# インターネットからダウンロードしてきた署名あり実行ファイルに対する実行権限を現在のユーザに与えます
Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser

# pyenv-win のダウンロードとインストール
Invoke-WebRequest -UseBasicParsing -Uri "https://raw.githubusercontent.com/pyenv-win/pyenv-win/master/pyenv-win/install-pyenv-win.ps1" -OutFile "./install-pyenv-win.ps1"; &"./install-pyenv-win.ps1"
```

PowerShellを再度立ち上げて、pyenvのバージョンを確認してインストールが完了していることが確認できました。
Path周りは勝手にやってくれているみたいです。
```shell
> pyenv --version
pyenv 3.1.1
```

インストール可能なPythonバージョンを見てみます。
```shell
> pyenv install -l
2.4-win32
2.4.1-win32
2.4.2-win32
2.4.3c1-win32
(中略)
3.12.0-arm
3.12.0-win32
3.12.0
3.13.0a1-win32
3.13.0a1-arm
3.13.0a1
```

最新の3.12.0をインストールしたいところですが、PyTorchのサイトを確認すると執筆時の時点でPyTorchがサポートしているのは3.11までのようですので、3.11.6をインストールしてデフォルトに設定します。
![スクリーンショット 2023-11-26 175630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/c0323bdf-784b-9d3d-bbb1-93ceab3ade6c.png)

```shell
# Python3.11.6をインストール
> pyenv install 3.11.6
:: [Info] ::  Mirror: https://www.python.org/ftp/python
:: [Downloading] ::  3.11.6 ...
:: [Downloading] ::  From https://www.python.org/ftp/python/3.11.6/python-3.11.6-amd64.exe
:: [Downloading] ::  To   C:\Users\-\.pyenv\pyenv-win\install_cache\python-3.11.6-amd64.exe
:: [Installing] ::  3.11.6 ...
:: [Info] :: completed! 3.11.6
# 3.11.6をデフォルトに設定
> pyenv global 3.11.6
# Pythonバージョンの確認
> python -V
Python 3.11.6
```

適当な作業ディレクトリを作り、そこに仮想環境を構築することにします。
```shell
> mkdir sandbox
> cd sandbox
# このディレクトリのPythonバージョンを3.11.6に指定
> pyenv local 3.11.6
# 仮想環境を「.env」の名前で作成
> python -m venv .env
# 仮想環境のアクティベート
> .\.env\Scripts\activate
# pipのアップグレード
(.env) > python -m pip install -U pip
```

これでPythonの下準備は完了です。

# PyTorchのインストール

PyTorchの公式サイトを参考に、インストールコマンドを調べます。

![スクリーンショット 2023-11-26 175918.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/79914949-4dac-8fcd-7e14-f039c5e1efbe.png)

CUDA12.3が選択できないようなので12.1でやってみます。また、`pip3'の部分は`pip`へ変更しました。
```shell
(.env) > pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
```
インストールが終わったら`python`コマンドでPythonを立ち上げて、PyTorchとGPUが使えることが確認します。
```python
import torch
# 初回だったからかここで5分ぐらいかかりました。
torch.cuda.is_available()
# -> True

# torch.cuda.is_available()はあまり信用していないので、実際にテンソルをGPUへ送って確認します。
torch.tensor([0.1, 0.2], device=torch.device('cuda:0'))
# -> tensor([0.1000, 0.2000], device='cuda:0')
```

大丈夫そうですね。

# サンプルコードでテストラン

こちらのサンプルコードを拝借して、GPUを使うことでちゃんと速くなっているのか確認します。
https://imagingsolution.net/deep-learning/pytorch/pytorch_mnist_sample_program/

|デバイス|実行時間|
|:-----------|:------------:|
|CPU|9分35秒|
|GPU|1分18秒|

とても速い。

GPUを使った時のタスクマネージャーの様子。「3D」のところの稼働率が上がっていてGPUが使われている感じがあります。
![スクリーンショット 2023-11-26 182115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3568254/0129190f-addb-d290-ef79-effcf530f8c0.png)

# 結論

ノートパソコン内蔵のGPUでもちゃんと機械学習に使えました。
ただ、冷却能力はたかが知れているので燃やさないように気を付けましょう。