NZXT H1 と RTX A4000 でディープラーニング(とゲーム)用自作PC組みました

# はじめに
　ディープラーニングとゲーム用に新しいPCが欲しかったのですが、どうしてもNZXT H1で組みたかったので、予算と要望(ディープラーニングとゲームができる)に合うGPUを探した結果RTX A4000で組んだという記事です。
　なお、私は自作PC初心者ですので暖かい目で見守ってください。

　以下の人向けになります。

* NZXT H1を組むならどんなGPUがいいか知りたい
* RTX A4000のディープラーニング性能はどんなものか知りたい
* RTX A4000のゲーム性能はどんなものか知りたい

　以下の内容は含まれません。

* NZXT H1の組み立て過程  
[こちら](https://peta.okechan.net/blog/archives/5567)が非常に参考になりました。

# PC構成

| |名前|価格[円]|
|-|-|-|
|OS|Windows 10 Pro|余ったライセンス使用|
|ケース|[NZXT H1](https://shop.tsukumo.co.jp/goods/0405769407013/?cid=kakakukcom)|39,800|
|電源|ケースに付属|-|
|簡易水冷CPUクーラー|ケースに付属|-|
|CPU|[Ryzen 5 5600X](https://kaago.com/pc-idea/Ryzen-5-5600X-BOX-並行輸入品-当店三年保証/?itemcode=1000000001708)|35,976|
|GPU|[NVIDIA RTX A4000](https://www.oliospec.com/shopdetail/000000011132/ct855/page1/order/)|128,040|
|マザーボード|[ASUS ROG STRIX B550-I GAMING](https://www.amazon.co.jp/dp/B089Y8YXP6?tag=kakaku-subtag-22&ascsubtag=kakaku-pc-pcparts-22_B089Y8YXP6_K0001259408_e1a_13730f718f704941a5089a26fd9ee51db&me=AN1VRQENFRJN5&linkCode=ogi&th=1&psc=1)|22,977|
|メモリ|[Crucial 32GB DDR4-3200 UDIMM](https://www.yodobashi.com/product/100000001005721731/?gad1=&gad2=g&gad3=&gad4=452607784558&gad5=11521813217227082537&gad6=&gclid=Cj0KCQjwraqHBhDsARIsAKuGZeG_njaFPDDR0ouO_5ewZsZPA1udAnijjuDM8xQMhjMdq34ZpXWddAkaAu0uEALw_wcB&xfr=pla)|23,069|
|SSD|[Corsair M.2 SSD MP600 1TB](https://www.amazon.co.jp/dp/B08TB1R595?tag=kakaku-subtag-22&ascsubtag=kakaku-pc-pcparts-22_B08TB1R595_K0001329254_08c_de0ad757ffe7452792733e87570adcce3&me=AN1VRQENFRJN5&linkCode=ogi&th=1&psc=1)|18,458|
|HDD|[TOSHIBA MQ04ABD200 2TB](https://shop.tsukumo.co.jp/goods/4582353585008/?cid=kakakukcom)|6,111|
|合計||274,431|

### ケース: NZXT H1
![IMG_20210727_184439.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325733/91d79e06-e3ef-afb8-9321-4801b6857ff6.jpeg)
　確定枠です。発火の恐れがあり販売が見合わせられておりましたが、問題が解決され最近販売が再開したので組んでみました。コンパクトでカッコいいですよ！PS5と同じようなサイズ感。
　以下のような特徴があります。

* Mini ITXケース
* 電源、簡易水冷CPUクーラー、PCIe 3.0 ライザーカード付き
* 縦長のコンパクトなデザイン
* 組み立てがシンプルで初心者にもおすすめ
* マザーボードI/Oが下向きになっており、ケーブルを底面にコンパクトにまとめられる(抜き差しは面倒)
* GPUサイズ:  
長さ~265mmまでは幅145mmまで  
長さ265~305mmは幅128mmまで  
厚みは2.5スロットまで
* SATA接続SSD/HDDは2.5インチを2台まで
* ケース上部のType-Cポートを使用するにはUSB 3.2 Gen 2の内部コネクタを備えたマザボを選ぶ必要あり

### GPU: NVIDIA RTX A4000  
![IMG_20210727_184904.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325733/adc965c4-934c-92b6-aa80-e4384d0014ff.jpeg)
　正面パネルを外すと画像のようになります。
　最近はGeForce RTX 30シリーズが続々登場して、かなりGPUの選択肢がありますよね。ゲーム用途ならGeForce一択だと思いますが、ディープラーニング用途を考えると、今年順次発売したRTX Aシリーズ(旧Quadroシリーズ)も選択肢に入ってきます。
　以下にGPUの簡単な比較を行っています。10万円台では3080が最もCUDAコア数が多いですが、NZXT H1に入るかどうかかなり微妙なところです。日本では、3070, 3070 Tiが少し高めな上、高騰もしているので、少し背伸びすればA4000が買えるくらいになっています。それでいてA4000はメモリが16GBあるのでディープラーニング用途での使い勝手は良いのではないでしょうか。また、最大消費電力の観点ではA4000が飛びぬけてエコです。
　20万円台では3090のCUDAコア数、メモリが多いですが、確実にNZXT H1に入らないため、A4000以上の性能が欲しければA5000を選択することになるでしょう。

|型番|RTX A4000|RTX 2080 Ti|RTX 3070 Ti|RTX 3080|RTX A5000|RTX 3090|
|-|-|-|-|-|-|-|
|CUDAコア数|6144|4352|6144|8704|8192|10496|
|メモリ|16GB|11GB|8GB|10GB|24GB|24GB|
|最大消費電力|140W|250W|290W|320W|230W|350W|
|価格帯[円]※1|[13万](https://www.oliospec.com/shop/shopbrand.html?search=a4000&x=0&y=0)|掲載なし|[10万](https://kakaku.com/pc/videocard/itemlist.aspx?pdf_Spec103=486&lid=facet_suggest_0550_cancel)|[15万](https://kakaku.com/pc/videocard/itemlist.aspx?pdf_Spec103=480&lid=facet_suggest_0550_cancel)|[28万](https://www.oliospec.com/shop/shopbrand.html?search=a5000&x=0&y=0)|[25万](https://kakaku.com/pc/videocard/itemlist.aspx?pdf_Spec103=481&lid=facet_suggest_0550_cancel)|
|H1に入るか|〇|〇|〇|△※2|〇|×|

※1　RTX A4000, RTX A5000はオリオスペックで販売されている価格、それ以外は2021/7/26時点の価格.comの価格を参考。RTX 2080 Tiのみ出品がなく掲載なしだった。
※2　数値だけ見るとギリギリNZXT H1に入りそうなグラフィックボードはある(実際に試したわけではない)が、多くのものは入らないと思われる。

### マザーボード: ASUS ROG STRIX B550-I GAMING
　第3世代Ryzen対応で、USB 3.2 Gen 2の内部コネクタ付きのMini ITXマザーボードです。PCIe 4.0のM.2ソケットがあります。Wifi, Bluetoothも使えます。BluetoothはWifiアンテナをつなげないと使えませんでした([Reddit参考](https://www.reddit.com/r/ASUS/comments/k830f5/bluetooth_on_asus_rog_strix_b550i/))。
　また、ASUS製で、BIOSの設定からGPUのPCIe 4.0を3.0にダウングレードできることもポイントです。[NZXT公式Twitter](https://twitter.com/NZXTJapan/status/1323203286560776196?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1323203286560776196%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fwww.revolversix.com%2Fentry%2F20201203%2F1606998706)によると、NZXT H1のライザーケーブルは3.0のため、ダウングレードしないと動作が不安定になることがあるそうです。また、[こちらのブログ](https://www.revolversix.com/entry/20201203/1606998706)によると、ASRock製はPCIeのダウングレード手順が煩雑なようです。

### メモリ
　Mini ITXのため、メモリスロットが2つしかありません。16GBを2本挿した後に増設したくなったとき大変なので、32GBを1本にしました。

### SSD: Corsair M.2 SSD MP600 1TB
　せっかくなのでPCIe 4.0対応のSSDを選びました。4.0対応でもっと安いものがありましたが、取り寄せが数か月後でした。

# ディープラーニング性能
　kerasでMNISTデータセットを15epoch学習する時間を計測します。CPU: Ryzen 5 5600X, GPU: RTX A4000, GPU: Tesla T4(Colaboratory)で比較を行った結果を示します。
　Tesla T4はColaboratoryで割り当てられるGPUの中で最新だそうなので、それより早いというのはかなり良いのではないでしょうか。

||Ryzen 5 5600X|RTX A4000|Tesla T4|
|-|-|-|-|
|学習時間(15epoch)|455.0[s]|36.3[s]|59.7[s]|

　ローカルで実行するにあたり以下のバージョンをインストールし、動作しました。Tensorflowのインストールは[こちら](https://www.kkaneko.jp/tools/win/tensorflow2.html)が大変参考になります。

* Python: 3.8.0
* Tensorflow: 2.5.0
* CUDA: 11.3.1
* cuDNN: 8.2.1

　動かしたコードは以下になります。ほぼ[こちら](https://qiita.com/futakuchi0117/items/5d31aacac5f6ab6665dd)からのコピペです。

```python
import time

import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten, MaxPooling2D, Conv2D
from tensorflow.keras.callbacks import TensorBoard


(X_train,y_train), (X_test, y_test) = mnist.load_data()

X_train = X_train.reshape(60000,28,28,1).astype('float32')
X_test = X_test.reshape(10000,28,28,1).astype('float32')

X_train /= 255
X_test /= 255

n_classes = 10
y_train = keras.utils.to_categorical(y_train, n_classes)
y_test = keras.utils.to_categorical(y_test, n_classes)

model = Sequential()
model.add(Conv2D(32, kernel_size=(3,3), activation='relu', input_shape=(28,28,1)) )
model.add(Conv2D(64, kernel_size=(3,3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())          
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(n_classes, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

start = time.time()

model.fit(X_train, y_train, batch_size=128, epochs=15, verbose=1, validation_data=(X_test,y_test))

elapsed_time = time.time() - start
print ("elapsed_time:{0}".format(elapsed_time) + "[sec]")
```

RTX A4000で学習中はこんな感じです。
![スクリーンショット 2021-07-27 211013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325733/de5733c8-d27b-ff04-82ac-27a628d525e4.png)


# ゲーム性能
　[FF15ベンチマーク](http://benchmark.finalfantasyxv.com/jp/)を行いました。高品質、1920×1080で実行したところ9392でとても快適でした。また、80~90fpsくらいでした。
　[こちら](https://pcgamebto.com/ff15/)のベンチマーク結果と比較すると、大体3060から3070の間の性能でしょうか。当たり前ですが値段の割にゲーム性能は高くないです。しかし、ほとんどのゲームで60fps以上出るでしょう。
![スクリーンショット 2021-07-27 212353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/325733/7ff59d45-0ec9-812e-8621-223da463f832.png)

# おわりに
　お金に余裕があったらRTX A5000買いたかったなぁ。