Tensorflow + GPU 環境を Windows + Visual Studio で使うための各種インストール (2023年11月)

# はじめに
機械学習についていろいろ勉強しているのですが、Tensorflow を使ったコードがそこそこ書けるようになって、処理に要する時間も数時間を要するようになり、高速化したい！と思うようになりました。
Windows のタスクマネージャーでパフォーマンスを見ると、Tensorflow での処理は、100% CPU 側で処理されていたので、これ GPU でやったら速いよね？と思い、ちょうど遊びたい PC ゲームもあったので、GPU を GeForce RTX 4060Ti (16GB) に新調！　さて、GPU で Tensorflow を動かそう・・・と思ったら、ドハマりして 2 週間悪戦苦闘。一瞬あきらめかけたのですが、ついに成功したので、メモがてら設定手順をまとめます。

><img width="70%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/cd82132e-45d9-ed67-d442-850a29fb31c7.png">
><br>CPU で計算中の様子...

Qiita にもいくつか同様の記事があるのですが、先達の皆様による2~3年前のものが多く、バージョン違いでなかなか最新のものが見つからないので、頑張ってまとめてみました。
まだ始めて間もないので、他にももっと簡単な方法やスマートな方法とかあるかもしれませんが、そういうのがあればコメントにてお教えください:slight_smile:


# まずは GPU 化の効果を・・・
あくまで 1 つの例ですが、Tensorflow で Transformer を使った同じ学習処理が

- CPU での処理： 3時間40分 (220分)
- GPU での処理： 10分

ということで、なんと GPU は 22 倍高速化！
CPU も 14 コアあるので、それなりに速かったはずなのですが、もちろんコアの種類が違えど GPU の 4352 コアは AI の演算に非常に有効的なようです。

:::note info
環境は以下です (自作デスクトップ)
CPU : 13th Gen Intel(R) Core(TM) i5-13600KF 3.50 GHz
GPU : NVIDIA GeForce RTX 4060 Ti (16GB)
メモリ : 32 GB
:::

# GPU で Tensorflow を使いたい！(顛末)
まずは悪戦苦闘の過程を順を追って語らせてください。そんなこと知らんけど、とにかくインストールして Tensorflow が GPU で使えればいいんじゃ！という方は、飛ばして **インストール手順** をご覧ください。
これまで使っていた環境は次の通り。古めの Python に苦しめられたので、最新版のほうがいいよね、ということでなるべく最新版を使っていました。

:::note info
これまでのわたしの環境
- Windows 11 Pro
- Visual Studio Community 2022
- Python 3.11 (VS2022 にてインストール)
- Tensorflow 2.14 (VS2022 内で "tensorflow" を検索してパッケージ追加)
- GPU は古いものだったので、CPU にて処理
:::

まず初めにたどり着くのは Tensorflow の公式ページ [[ GPU サポート|Tensorflow ] ](https://www.tensorflow.org/install/gpu?hl=ja) ですが、いきなりこんな記述が。
> TensorFlow の GPU サポートには、各種ドライバやライブラリが必要です。インストールを簡略化し、ライブラリの競合を避けるため、GPU サポートを含む TensorFlow の Docker イメージ（Linux 用のみ）を使用することをおすすめします。

Docker 使ってないし、使ったことないし「おすすめ」ってことは使わなくてもいいんだよね？ということで、Docker環境はスキップ (無視) します。
**ソフトウェア要件**をみると、GPUドライバ、CUDA Toolkit、cuDNNを入れればよいとあるのですが、同サイトのパッケージの "pip" の項目を見ると、こうあります。

![スクリーンショット 2023-11-14 124332.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/93b93189-d3c3-04a9-0a9f-6ac729af4818.png)
最新版 Tensorflow 2.14 は Windows GPU サポート無いらしい:fearful:

実はその先をちゃーんと読み進めると、Windows 環境での設定方法が記述されていたのですが、上記の「:exclamation:注意」にビビった私は、先走って Linux 未経験なのに WSL2 + Ubuntu を試してみたり、なんか上手くいかず、先におすすめされていた Docker を入れて、さらに混乱:persevere:するハメになりました (WSL2 を何度インストールしたことか...)。結局 WSL2 や Docker の Python 環境と Visual Studio Community の連携がさっぱり分からず、行き詰ってました。

で、いろいろ試行錯誤を繰り返した末に、ようやく **「最新版を使うのはあきらめて、ちょい古いバージョンの Tensorflow を使う」** という選択肢にようやくたどり着きます。

# Tensorflow + GPU セットアップの戦略
と、カッコいい表現しましたが、セットアップの方針をまとめます。
- Visual Studio 連携の使い勝手は維持したいので、Windows 環境のみで構成したい
- Tensorflow はなるべく新しいやつにしたほうがよさそう
- GPU のためなら多少のバージョン遡りは許容する

です。なかでも、キーになるのは、Tensorflow のバージョンになりそうなので、最後の Windows ネイティブ対応らしい 2.10 を使うということになります。
そうなると、Tensorflow 2.10 に合わせて Python、CUDA、cuDNN のバージョンを合わせこむことになりそう、ということで、[こちらのページ](https://www.tensorflow.org/install/source_windows?hl=ja#gpu)にある "GPU" という表を参考にしながらチェックします。

:::note info
Tensorflow GPU のバージョン対応
- Tensorflow version : 2.10.0
- Python version : 3.7 ~ 3.10
- cuDNN version : 8.1 ⇒ 詳細 8.1.1
- CUDA version : 11.2 ⇒ 詳細 11.2.2
:::

Python のバージョンは幅があるようなのですが、私はなんとなく 3.9 を使ってみることにしました。
CUDA は、(https://developer.nvidia.com/cuda-toolkit-archive) を見ると、細かなバージョンがあるようなので、11.2の最新ということで、11.2.2 を選択
cuDNN も同様に、(https://developer.nvidia.com/rdp/cudnn-archive) v8.1の最新ということで、cuDNN v8.1.1 for CUDA 11.2。



# セットアップ Step by step
以下、順を追って私が行った設定を記載します。何度もインストール＆削除を繰り返しているので、抜け漏れあったら申し訳ありません。でも、そうしたややこしい環境でもちゃんと動いているので、多少順序が入れ替わっても大丈夫だと思います。では以下、ご確認ください。

基本的な手順は、[こちらの　[Tensorflow インストール > パッケージ pip] の下のほうにある**段階的な説明 > Windows ネイティブ**](https://www.tensorflow.org/install/pip?hl=ja)に従います。
バージョンが変わるごとにここの記載が少しずつ更新されている雰囲気ですので、もし、この記事を遠い未来に読んでいる場合は Tensorflow のページ内容を優先するのがよさそうです笑

![スクリーンショット 2023-11-14 152003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/4c5d308d-ecf1-1b01-6d56-3ecfbc37f9b2.png)

なお、下記の見出しの番号は、Tensorflow インストールページに準拠した番号付けにしていて、記載のない処理は番号なし "#." の見出しにしています。

## 1. Windows や Visual Studio 
私の環境は Windows 11 ですが、Windows 7 以降の 64bit 環境なら問題ないようです。
Visual Studio は、無料で使える Visual Studio Community 2022 を使っています。

## 2. Microsoft Visual C++ 再頒布可能パッケージ
昔から "Microsoft Visual C++ xxxx Redistributable" って微妙なバージョン違いがたくさんインストールされています。Visual Studio 2022 を使っているので、インストール不要な予感もするのですが、念のため説明通りインストールをします。
- [Microsoft Visual C++ ダウンロードページ](https://learn.microsoft.com/ja-jp/cpp/windows/latest-supported-vc-redist?view=msvc-170)を開く
- 「Visual Studio 2015、2017、2019、および 2022」から、X64 版を選んでインストール。

###  "LongPathsEnabled" のレジストリ設定
説明のなかにさりげなく潜んでる記述があって、260 文字を超える長いパスでもちゃんと処理できないとエラーになる可能性があるようです。ということで、これを設定します。
Microsoft の説明が日本語で分かりやすいので、[こちらのページ](https://learn.microsoft.com/ja-jp/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-version-1607-and-later)を参照して設定します

## #. GPUドライバ / CUDA / cuDNN インストール
Windows 環境の各種インストールを行います。バージョンをチェックしながらインストールしていきましょう。
- GPU ドライバ
これは通常の最新版 GPU ドライバのインストールで OK
(PC ゲームで使うやつですよね)
- CUDA ツールキット
前述のとおり下記より v11.2.2 を選んでインストールします。
https://developer.nvidia.com/cuda-toolkit-archive
- cuDNN
こちらも同様に、v.8.1.1 for CUDA 11.2 を選んで、cuDNN Library for Windows (x86)をダウンロードします。
https://developer.nvidia.com/rdp/cudnn-archive
cuDNN は、zip ファイルなので解凍して、私は CUDA と同じ場所にコピーしました。(C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/1bf5d10e-d69e-784b-3a69-b15e35529cc0.png)

## #. 環境変数の Path を登録する
CUDA はインストーラーが自動的に Path 設定してくれるのですが、cuDNN は手動で設定しなければいけません。
Windows の設定 > システム > バージョン情報の画面に「システムの詳細設定」があるので、そこで、環境変数を編集します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/a65ff823-365c-ba4c-2139-48d2b2e12051.png)
下図のとおり、システム環境変数の Path を開いて、
`.....\CUDA\bin`
`.....\CUDA\lib\x64`
の Path を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/48b4538d-803e-0f5f-cae2-1dae7db13fdf.png)


## 3. Miniconda (と Python) をインストール
Miniconda のページから、Windows 64bit 版をインストールせよ、という指示があるのですが、ここでは Python のバージョンを選んでインストールしたいので、こっちのページから必要なバージョンを選んで Miniconda をインストールしました。
- [Miniconda Pythoバージョン別のインストールページ](https://docs.conda.io/projects/miniconda/en/latest/miniconda-other-installer-links.html#)

>Tensorflow インストールの説明でも「Miniconda は、 GPU サポートを備えた TensorFlow をインストールする場合に推奨されるアプローチです」とあります。「推奨」とあるので、conda 環境がよく分かっていなかったので最後まで避けていたのですが、conda でインストールができる環境が必要だったようです。

## 4. "conda" 環境を作成する (はスキップしました)
もしかしたら後々必要になるのかもしれないのですが、私は、同じ環境を何度もセットアップするのがイヤだったので、conda 環境の作成はスキップしてます。

## 5. GPU のセットアップ
Tensorflow インストールページではさらりと書かれてるのですが、たぶん、ここが肝心のインストールのようです。説明にしたがっていくと・・・
### 5.1 まずは Nvidia GPU ドライバーのインストール
普通に GPU カードを差し込んだ後でやるドライバインストール作業のことです。PC ゲーム等で使う最新ドライバが入っていればヨシです。
![スクリーンショット 2023-11-14 161330.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/b11b9679-a281-18b8-704b-6aa3478269a7.png)

### 5.2 次に CUDA、cuDNN を conda でインストール
Tensorflow ページではさらっと説明してますが、軽く苦労したので詳しめに書きます。`conda install -c conda-forge ccudatoolkit=11.2 cudnn=8.1.0` と書かれているんですが、なぜかエラーが。

- スタートメニューから **Anaconda Powershell Prompt を探して開く**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/efadd39a-65bf-4e87-5877-be69f6c25897.png)
- 念のため Python がちゃんと使えるか、あと Python バージョンも確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/6d7c13f1-fe4c-579c-54a1-8eda57916300.png)
-  **cuda と cuDNN を分けてインストール**
一度に 2 つをインストールできるようなのですが、私の場合エラーで 3 回ほどリトライしたので、以下のようにしました。ここでバージョンも指定が必要、ということで先ほど調べた **CUDA Toolkit / cuDNN のバージョンを指定**します。
① CUDA Toolkit
`conda install -c conda-forge cudatoolkit=11.2.2`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/18e6d660-8ac7-6172-cdeb-83b6294551f4.png)
② cuDNN
こちら Nvida のサイトには Version 8.1.1 があるようなのですが、下記でインストールしようとすると見つからないとエラーになってしまったので、8.1.0 を使いました。
`conda install -c conda-forge cudnn=8.1.0`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/97cca82f-f6e4-10dc-5af0-209158ca2ec1.png)
(※画面用に(tf)という名前の環境作ってますが、実際は(base)へインストールしてます)

## 6. Tensorflow をインストールする
さきほどの CUDA Toolkit や cuDNN は conda でインストールしていたのですが、Tensorflow は pip を使ってインストールするそうです(ややこしい)。でも手順としては、シンプルで、Anaconda Powershell Prompt を開いて...
- まずは pip を更新しておく
`pip install --upgrade pip
`
私の場合、エラーが出たので、エラーメッセージのとおり下記で対応
`python.exe -m pip install --upgrade pip
`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/7c61a5ce-f7f6-a637-7b3d-6bdc203ee5e8.png)

- 続いて Tensorflow をバージョン指定でインストール
`pip install "tensorflow<2.11"
`
(上記の記述で、v2.10台の最新版がインストールされます)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/0ecd2e78-8fdb-b1bd-118d-7a96f45fdc79.png)
上図では 2.10.1 がインストールされています。

## 7. Tensorflow が GPU を認識したかチェック
以上でインストール作業は完了したはずです。下記で GPU の表示が出れば OK
`python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/8f9483ca-97d1-a1a1-bb8e-d5d0b07163cb.png)

## 8. Visual Studio で環境を追加
最後は、
- Visual Studio のソリューションエクスプローラー画面で、Python 環境を右クリックで「環境の追加...」を選んで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/76056c62-52f9-570d-8877-1aaf3728a225.png)

- 「既存の環境」のところに、設定をした miniconda の環境がでてくるのでそれを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/9e1773cb-bd30-990e-c152-13bb5d1b8ef1.png)
(conda 環境も選択肢に出ると思うので、conda 環境を切り分けしたい方はそちら)
- 上記の操作で、Visual Studio のソリューションエクスプローラーの Python 環境に、GPU 対応の環境が追加されるので右クリック「環境のアクティブ化」をして完了です。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/fa286545-0882-a624-1122-3ebcad53f6ee.png)


この設定にたどり着くまで長い道のりでした...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/30f55314-955a-44c5-5b2b-68145da8997d.png)
こんな感じで、GPU フル稼働状態で CPU の 20 倍以上のスピードで処理が進んでいきます:sparkling_heart:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557789/b230057b-9d2e-1b60-bd1d-e8b81f0f7fda.png)

せっかくの高性能 GPU ですから、ぜひいろいろな場面で活用してあげたいと思っています。

# 参考文献
Tensorflow のインストール解説ページ
https://www.tensorflow.org/install?hl=ja

福山大学　金子邦彦研究室のページもとても参考になりました。
https://www.kkaneko.jp/tools/win/keras.html