ALIENWAREを買ったのでGPUで機械学習してみた

ALIENWAREを買ったのでGPUで機械学習できるかやってみました。
キーボード虹色に光らせて暗い部屋で作業しています笑マリオカートのレインボーロードに来たみたいで楽しいです笑笑
僕と同じように「NVIDIA製GPUを積んでるPC持ってるからGPGPUやってみたい！」って方は、参考にしてみてください。

# 製品仕様・実験詳細

製品|Alienware m15 R4
:-:|:-:
GPU 0|Intel UHD Graphics
GPU 1|NVIDIA GeForce RTX 3070 Laptop GPU
CPU|Intel Core i7-10870H CPU @ 2.20GHz, 2.21GHz (8コア)
OS|windows 10 home 64bit
実装RAM|16GB
記憶域|476GB
実施日|2021年8月9日
実施時のPCの状態|新品

# 手順
ざっと、次の通りです。管理者権限が必要です。

1. NVIDIA Driver, CUDA(およびvisual studio), cuDNNをインストール
1. python3とjupyter notebookをインストール
1. TensorFlow-gpuとKerasをインストール
1. テストプログラムを実行し、GPUが使われていることを確認

よっぽど自信がない限り、ここに示した順番通りにやるのが無難です。
例えばCUDAよりも先にpythonをインストールしてしまっていると、バージョンが合わなかったときに結局後でpythonを再インストールすることになったりして二度手間です。

# 1. NVIDIA Driver, CUDA(およびvisual studio), cuDNNをインストール

## 1-1. なんで必要なの？
NVIDIA Driver: OSにGPUを認識してもらうために必要です。
CUDA: (NVIDIA製の)GPUを操作するためのプログラミング言語及びその環境として必要です。
visual studio: CUDA語(≒c/c++)で書かれたプログラムのコンパイラ(機械語への翻訳をしてくれるプログラム)が欲しいので、インストールします。多分コンパイラだけインストールしようとすると面倒だから、visual studioごとインストールするよう勧められているのでしょう。
cuDNN: CUDAのライブラリです。深層学習(≒機械学習)を効率よく行うための工夫が詰まっています。

## 1-2. NVIDIA Driverのインストール。
1. https://www.nvidia.co.jp/Download/index.aspx?lang=jp へアクセスします。
2. 写真のようにプルダウンを選択したら、「検索」を押します。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/df00fa4e-a3f6-ae58-e3a7-27b5c99fd31e.png)
3. **バージョンをメモしてから**ダウンロードします。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/313a78ac-0f2e-900e-a881-574369e52644.png)

3. ダウンロードされたexeファイルを実行します。
3. インストールモードは「高速」で大丈夫だと勝手に思っています。
3. インストールが終わったら「閉じる」を押しましょう。

## 1-3. CUDA(およびvisual studio)のインストール。
1. https://docs.nvidia.com/cuda/cuda-toolkit-release-notes/index.html へ行き、NVIDIA Driverと相性の合うCUDAのバージョンを調べます。(その具体的手順は2と3で述べるので安心してください)
2. 「CUDA Toolkit and Corresponding Driver Versions」の表を見てください。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/61863e15-9d3f-5b34-802d-9a6eefe07e7c.png)
3. 「Windows x86_64 Driver Version」の列にある各数値と、3-2節で確認したNVIDIA Driverのバージョンを比較します。  NVIDIA Driverのバージョンが、各数値以上であれば、同じ行が示すバージョンのCUDAが利用可能です。例えば今回は「CUDA 11.4 Update 1」の行の数値は「471.41」です。3-2節で確認したバージョン情報は、この「471.41」以上ですので、今持っているNVIDIA Driverは「CUDA 11.4 Update 1」に対応していることがわかります。ほかの行も同様です。  以上で、11.4かそれ以前のバージョンのCUDAが利用可能であることがわかりました。
1. 次に、https://www.tensorflow.org/install/source_windows#gpu へ行き、できるだけ最新のtensorflowと相性の合うCUDAのバージョンを調べます。(その具体的手順は手順5で述べます)
5. 表と、2-2節で確認したTensorFlowバージョン情報を照らし合わせます。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/449f2022-3800-630b-6552-6eb89eb149f0.png)
前の手順で、CUDAのバージョンは「11.4かそれ以下」であることが問われているので、表のどの行についても、CUDAのバージョンについて、問題はありませんね。CUDAのバージョンについて問題がない中で最新のTensorflowのバージョンは2.4.0ですね。<sub><sub>実は実施日(2021年8月9日)の時点で、公開されている最新のTensorFlowのバージョンは2.5.0なのですが、この時点ではまだ2.5.0は新しすぎてCUDAと仲良くできない可能性があります。(実際やってみたところ、無事喧嘩しました（笑）)こういうことがあるから、pythonやtensorflowよりも先にCUDA等のインストールを済ませなければならないのです。</sub></sub>今回は、一番上の行が「利用可能な中で最新のバージョン」ということになります。**tensorFlowのバージョン、pythonのバージョン、cuDNNの対応バージョンをメモしておいてくださいね**。
1. 以上のように吟味し、NVIDIA Driverが文句を言わないCUDAのバージョンを選びましょう。今回の場合はCUDA 11.0.3 Update 1ですな。
1. いよいよCUDAをインストールします。 https://developer.nvidia.com/cuda-toolkit-archive へ行きます。
1. 選ばれたバージョンのCUDAをクリックします。
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/a08be0f6-e6f3-680b-ba1a-01aac0f105dd.png)
1. ダウンロードリンクをクリックし、ダウンロードされたexeファイルを実行してインストールします。
1. インストールは「高速」でいいと思います。
1. 途中で次のような画面が出てきた場合、赤で囲ったところをクリックしてvisual studioをインストールしてください。逆に、表示されなかった方は手順17までお進みください。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/ffcf9ef5-964c-efe0-a714-6b16b373bbf9.png)
1. visual studioについては、Communityバージョンでいいと思います。年代は、「CUDA 11.0 visualstudio バージョン」みたいググって調べてください。<sub><sub>確証はないのですが、たぶん手順5の表の「コンパイラ」と「ビルドツール」によってもvisualstudioのバージョンが特定できます。(そもそも、コンパイラとビルドツールが欲しいために、それらを中に含んでいるvisual studioが要求されているので)</sub></sub>  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/534a0e87-0ad1-aa30-150f-c4667002a583.png)
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/932e4314-012b-25af-297f-cf7b1ac3a28f.png)
1. 「再起動が必要」と言われたら、再起動します。(その前にこの記事をお気に入り(ブックマーク)に登録しておくと、素早く再開できますね！)
1. cudaのインストーラをもう一度起動します。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/fa871703-0796-9ca1-f029-f4b11b868642.png)
17. 次のように表示されれば成功です！  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/beb1ceed-121d-9e20-ad64-036c82a3ecd4.png)

## 1-4. 最後にcuDNNをインストールしよう！
1. https://developer.nvidia.com/cuDNN へアクセスします。
1. Download cuDNNとかをクリックします。
1. NVIDIA Developer Program Membership Required(訳: ダウンロードしたいならNVIDIA開発者プログラムの会員になってください)とか表示されるので、Join now(訳: 会員登録します)をクリック。
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/f9ef919f-d058-df98-e937-511d6d9e0371.png)
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/8c82b7b2-3511-bf39-d4dd-f3307c05aff6.png)
1. 会員登録・アンケート回答する
1. 1-3節の手順5で特定したバージョンで、かつCUDAのバージョンと合うcuDNNをダウンロードする。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/dc7934b4-e885-4d4b-f7b2-e4d120566265.png)  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/a1152d13-1cea-d503-df6d-476966afeb4f.png)
1. ダウンロードされたzipファイルを展開(解凍)し、cudaフォルダを開きます。
1. 中身をすべて、`C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.0` へ移動してください。  アクセス拒否とか言われても管理者権限ですべて続行しちゃってください。

# 2. python3とjupyter notebookをインストール

## 2-1. なんで必要なの？
python3はpython3プログラムを実行するための処理機として必要。python3語で書かれた命令に従う従者である。
jupyter notebookは、文章を書きながらpythonプログラムを実行できたり、いくつかに分割してプログラムを実行できるなど、あると便利だからインストールする。

## 2-2. まずはpython3をインストール。

1. https://pythonlinks.python.jp/ja/index.html へアクセスする。
2. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/dc23b82e-5841-4dd9-3ebf-02902b6cc58a.png)
2. ダウンロードされたexeファイルを実行
2. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/166ee9a2-3fae-147d-2886-30cb54ce8850.png)
2. 「ユーザアカウント制御」とやらには「はい」 と答える。
2. インストールに成功後、次のような画面が出るかもしれない。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/2feab606-b48a-79aa-2123-256fd0b06f3b.png)
2. closeする。
2. コマンドプロンプトを開く。(すでに開いている場合は一度閉じてから開きなおそう)
2. `python`と入力する。

```:pythonインストールに成功した場合例えば次のように表示される
Python 3.x.x (tags/v3.x.x:db3ff76, Jun 28 2021, 15:26:21) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>
```

```:失敗した場合
'python' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

## 2-3. 次に、jupytetr notebookをインストールしましょう。

1. コマンドプロンプトに`pip install notebook`と入力。  先にpythonのインストールをしていないと、動作しません。
1. いろいろ表示されている中に`Successfully installed`という文字列があればOK。
1. コマンドプロンプトに`jupyter notebook`と打ち込むとブラウザが起動し、次のような画面が立ち上がるはずである。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/116a7385-ab91-0cb1-6ed0-b841f133d275.png)

# 3. TensorFlow-gpuとKerasをインストール

## 3-1. なんで必要なの？
Tensorflowは機械学習を行うために機械を制御してくれる存在。一方Kerasは機械学習を行いたい人間の要望を聞いてくれる存在。
営利企業で例えるなら、Tensorflowは技術職のエンジニアで、Kerasは営業職のセールスマンといったところだろうか。
技術職みたいな存在をバックエンド、営業職みたいな存在をフロントエンドといったりします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/6812179b-deab-60ce-6b5c-477f1fc09712.png)

よって、TensorFlow(もしくはそれに代わるもの)がなければそもそも機械学習できません。
Kerasはなくても何とかなりますが、その場合、相当面倒くさいです。保険の契約とかも営業マンがいるから比較的簡単に結べますよね。それと同じです。

## 3-2. TensorFlowをインストールしよう。

1. コマンドプロンプトに`pip list`といれて、現在インストールされているモジュールの一覧を表示します。ここに`tensorflow`がないことを確認。もしあったなら`pip uninstall tensorflow`をします。
1. `pip install tensorflow-gpu=x.x.x`します。**`x.x.x`のところは1-3節手順5で制限される中でなるべく新しいものを指定してください**ね。
1. 再度`pip list`して、`tensorflow-gpu`が追加されていることを確認してください。
1. 最後にコマンドプロンプトに`python -c "import tensorflow; print('\nバージョンは'+tensorflow.__version__)"`といれると、バージョン確認が可能です。

手順1は、`tensorflow`と`tensorflow-gpu`の両方がインストールされていると、処理機が混乱してしまうので、それを避けるために行うものです。


## 3-3. Kerasも。

1. `pip install keras`
1. `pip list`して、`keras`が追加されていることを確認。


# 4. テストプログラムを実行し、GPUが使われていることを確認

1. 好きなフォルダを開いて、アドレスバーに`jupyter notebook`と打ち込んでください。  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/cfeb2653-195d-0ef5-472b-55d00670eea3.png)
1. ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/af13076c-f415-d2df-6748-dd77fef3a119.png)
1. notebookが新しく作られるので、`code`モードにし、そこに※プログラムを打ち込んで実行してください。
1. 実行中、タスクマネージャの「パフォーマンス」タブを選択すると、GPUの頑張り具合をなんとなくみれます。

```python:※プログラム
import tensorflow as tf
mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0


model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
```

(プログラムは https://keita-blog.com/data_science/keras-tensorflow-gpu より引用。
どうやら手書き文字データを大量に読み込んで学習し、文字認識プログラムを行う全結合２層NNを学習させているようですね。)

僕の環境では次のようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319477/9677a55f-6a17-b7ee-4391-81f24d5a3852.png)




# 参考サイト
https://keita-blog.com/data_science/keras-tensorflow-gpu
https://dslab.work/2019/09/19/post-224/
https://qiita.com/konzo_/items/a6f2e8818e5e8fcdb896