個人でDeep learningを始めようと思った一般人が、PC環境を構築したときの備忘録

# はじめに
　皆様初めまして。
　Ikenier18といいます。

　本記事は**個人で**「Deep learningやってみたいなー」というのを漠然と思っている人に向けた入門記事です。

　私自身が自宅で音声関連のDeep learningをやるために、パソコン（以下、PC）を選んだりした時に考えたことをまとめた備忘録になっています。

　そのため、今回の内容としては計算資源（自作PCなど）のお話をメインとしています。
　環境のセットアップそのものはすでに先人が記事にしてたくさん公開しているので、今回の記事では触れないことにします。

　よく研究などでは、

- 最低限機材は○○以上のものを使わないといけない
- 百万円もするようなグラフィックボード（GPU）を使っている

といったお話が出てきますが、それは企業や研究機関などのDeep learningの成果を用いてご飯を食べる人たちのお話です。
　**個人でまったりと**Deep learningをやる分には、Deep learningをやるうえで必要な条件はかなり緩かったりします。

# 既存のPCでできないか考える

　PCの構成は主に

- OS
- CPU
- マザーボード
- メモリ
- GPU
- ストレージ
- 電源装置

から構成されます。（ここでは、GPUを用いない場合については取り上げないこととします）
　これは、デスクトップPC、ノートPCに問わず同様です。
　つまり、ノートPCであってもDeep learningをやることは可能です。（あまりお勧めはしません）
　筆者の経験上、以下のスペックを満たす場合、不自由を感じることもありますがDeep learningを行うことが可能でした。（参考として、筆者がちょっとDeep learningで遊んだノートPCのスペックを載せておきます。）
　後の【王道ルート②：GTX1000シリーズを選ぶ】でも記述しますが、GTX1000シリーズは今でも十分現役です。

| 項目| スペック |　(参考)筆者のノートPC |
|:------|----------:|----------:|
| OS　| Windows、あるいはLinux |Windows|
| CPU　| 不問 |Corei7-10710U|
| マザーボード　| 不問 |知らない|
| メモリ　| 16GB以上 |16GB|
| GPU　| 4GB以上のメモリを搭載 |GTX1650 4GB|
| ストレージ　| 250GB以上の空き容量 |512GB|
| 電源装置　| 750W(GPU1枚の場合) |---|


# Deep learning用のPC環境を考える

　先ほども述べましたが、PCの構成は主に

- OS
- CPU
- マザーボード
- メモリ
- GPU
- ストレージ
- 電源装置

から構成されます。
　ここで、本記事ではGPUについてはNVIDIA社製のGPUを用いることを前提とします。
　（筆者がAMD製のGPUを用いたDeep learningの経験がないため。）
　というわけで、以下、各部品について考えたお話になります。

## OSを考える
　PCには大きくWindows、Linux、Macの3種類のOSが存在しています。
　**OSの違いによって、Deep learningそのものに与える影響は皆無です。**
　ただし、操作感が全く異なるなど、それぞれ特色があるため、適宜用途に合わせて最適なものを選択しましょう
　また、筆者はMacでの開発経験がないため説明を省略します。

### Windows
　一時期は「Windowsで開発とかｗ」と思った時期もありましたが、実際使ってみると思ったよりも使いやすかったです。
　特にAnaconda系統との相性が素晴らしく、Anaconda環境での利用を想定しているPytorchでは、Windowsを用いたほうが気持ちよく作業ができる気がします。

#### 長所
- 決められた実行ファイルをダウンロードして実行するだけで環境のセットアップが終わる
- 面倒な環境構築がお手軽に完了する

#### 短所
- セットアップの自動化によって細かい操作（ドライバの依存環境の解決など）の自由度が犠牲になっているため、ちょっと外れたこと（古いGPUを用いる等）をしようとすると躓く
- Windows10 Pro版で25000円程度とコストが高い

### Linux
　開発を行う上では、Linuxはかなり便利な環境です。
　コマンドライン上で直接PCに指示を与えることができるため、慣れてくればWindowsよりもかなり高い自由度で開発を行うことが可能になります。
　またUbuntuを例に挙げると、ドライバなどの依存関係解決にはかなりの手間とノウハウが必要でしたが、18.04以降からはそれらの作業がかなり省力化されており、**慣れてくれば**環境構築の難易度もぐっと下がってきます。
　細かい依存関係などがネックになってくるKerasやChainer、Tensorflowなどの開発環境は、Linuxに軍配が上がるでしょう。

#### 長所  
- 細かい動作環境などを手動で指定できるため、多少外れたこと（先述しましたが、古いGPUを用いる等）がやりやすい
- 無料。
- **無料。**

#### 短所  
- 設定作業の細かい部分まで自力で行う必要があるため、多少の手間と習熟が必要

### Mac
　残念ながら筆者はMacでの開発経験がないため、ここでは言及しません。

## CPUを考える
　**CPUにはお金をかけたほうがいい**です。

　CPUは主にデータの前処理（特徴量抽出など）や、データの読み込み作業などの速度に影響します。Deep learningはGPUで計算のほとんどを行いますが、そのGPUにデータを供給するとても重要な役割を担っています。また、買い替え＝マザーボードも買い替え、となるケースが多く、買い替えの際の、金銭的コスト、時間的コストが大きくなりやすいです。そのため、「とりあえずなんかDeep learningやってみたい」という場合であっても、CPUにはお金をかけましょう。

　ところで、CPUは、IntelとAMD、2つのサプライヤからそれぞれの製品が供給されています。つい最近まではIntelの独壇場でしたが、AMDのCPUもすさまじい勢いで追い上げを見せています。両社の争いは見ていて楽しいものですが、筆者としては、Deep learning目的のPCを組む上では、**両社の選択にそこまで深いこだわりは必要ない**と考えています。（ちなみに現在、筆者はIntelのCPUを使っています。）


### Intel
　CPU業界の古豪、最近はAMDの追い上げに危機感を覚えている。
　値段当たりの、コア1つあたりの性能が高い傾向がある。

　デスクトップで本格的なDeep learning用の環境を作るならCore i7、Core i9くらいは欲しいところです。

- ちょっと遊び程度で触る、継続してDeep learningをやるかはわからない　→　Core i5
- Deep learningをやってみて、楽しかったら続ける。本格的なものもやるかもしれない　→　Core i7
- 絶対にDeep learningを続ける、本格的なものもやる。　→　Core i7、Core i9
- 絶対にDeep learningを続ける、本格的なものもやる。複雑な前処理を各データに施す　→　Core i9

といった選び方がいいでしょう。

　また、ノートPCの場合は、ほとんどCore i7一択といっていいでしょう。
　（GPUを搭載したノートPCはほとんどがCore i7搭載モデルのため）
　そもそも、ノートPCでのDeep learningの性能は、搭載しているGPUのスペックが支配的に決定します。
　Deep learningを行うためのノートPCを選ぶ場合は搭載しているGPUを選んだ後に、予算に応じて一番いいCPUを搭載しているPCを選ぶようにしましょう。

#### 長所  
- コア1つ当たりの性能が高い
- 動作が安定している
- インターネット上に環境セットアップの先輩がたくさんいるため、文献を見つけやすい

#### 短所  
- 2020年3月下旬の現在では、一般ユーザー向けのCore iシリーズの発売からだいぶ時間が経過しており、コア1つあたりの性能がAMDの最新モデルに負けつつある
- 比較的値段設定が高め（今後のモデルは安くする方針らしい）

### AMD
　すさまじい追い上げを見せるIntelの古くからのライバル。
　値段当たりのコア数が多い傾向がある。

　AMDのCPUは近年、1年あたり1モデルが新しく発表されており、順調な成長を見せています。
　また、値段が比較的安価に設定されているのが魅力です。
　1年ごとに最新モデルが出る＝古いモデルになりやすい、という都合上、ひとつ前のRyzen7 2700などは30000円程度で入手が可能になっています。
　CPUの性能としては、値段当たりのコア数が多いことが特徴で、そのため、並列化された演算を行うときにその真価を発揮します。
　プログラミングの際にデータ処理を並列で行うように記述することが求められますが、特筆すべき魅力です。
　一部では、並列化をしても結局学習にかかる総時間は大差なかった、あるいは、もっと時間がかかった、などという報告も上がっていますが、気になるレベルではない、というのが筆者の認識です。

#### 長所  
- 値段当たりのコア数が多い
- 並列化したデータ処理が得意
- 最新モデルはコア1つあたりの性能もIntelに匹敵している
- 比較的安価

#### 短所  
- コア1つ当たりの性能はちょっと低め
- だんだん増えてきてはいるものの、インターネットの文献は少なめ

## マザーボードを考える
　**マザーボードはある程度の拡張性を確保した上で購入するようにしましょう。**
　Deep learningを問わず、何かをやろうとしたときに、あとから「ああすればよかったな」と思うことはよくあります。特にDeep learningの場合は、例えば、音声を扱う上ではデータ前処理の要求スペックが高い、画像を扱う上ではデータ当たりのメモリとストレージの要求容量が大きい、など分野をまたぐことで必要となる使用が大きく変化します。それらを見越したうえでの環境構築となるため、PCの根本となるマザーボードは拡張性を重視する必要があります。Deep learningを行う上では、以下の項目を念頭に選びましょう。

- CPUソケットが正しいものを選ぶ
    - これは当たり前のことです。購入するCPUが動作するものを選びましょう
    
- メモリスロットの数は4つ以上のものを選ぶようにする
- ATX、E-ATXマザーボードの場合、SLI対応のものを選ぶようにする
   - これは後の項でも触れますが、上記2点は、あとから拡張する可能性が高い部分です。多少割高に感じるかもしれませんが、マザーボードの買い直しを回避するためにも、あらかじめお金を払っておくことをお勧めします。
   
- Micro ATX、Mini ITXを選ぶときは、覚悟を固める
   - 後悔はしないな？


## メモリを考える
　**メモリを挿せる枚数は上限があるため、購入するメモリは1枚で16GBのもの(マザーボードが対応しているなら32GBのもの)を選ぶようにしましょう。**
　それ以外で、メモリに関してはあまり触れることはありません。
　16GBでそれなりに動いてくれます。32GBあると過剰なくらいです、ただし、Windowsの場合はOSのメモリ消費量が大きいため、32GB積むと安心です。
　メモリは主にデータの前処理を行う場合に使用する領域です。
　そのため、大容量のメモリを要求する前処理（音響分野の例ではDynamic Time Warpingなど）を行う場合は、メモリの買い足しが必要になるかもしれません。
　必要になったら買い足せばいい、の論理で動いてくれれば問題ないです。
　そのためにも、**いざというときは買い足せるようにマザーボードに空きを作っておく**ことが重要になります。

## GPUを考える

　筆者は**個人でDeep learningを行う分には十分なメモリを搭載しているGPUがあればいいと考えています。**個人でDeep learningを行う分には時間は無限にあります。そのため、計算能力についてはある程度妥協できます。ただし、GAN、CycleGANのようなGPUメモリの要求が大きくなりがちな手法を用いる場合や、本格的に画像を取り扱うDeep learningに挑戦するときには、GPUメモリが不足する、という事態が発生しうるので注意してください。**(NV-LINKを除いて)GPUメモリは後から増設できません。**

>筆者の経験的には、GPUメモリは最低限、4GBあれば何とかギリギリ学習を回せるorメモリが不足するくらいで、ちょっと遊んでみる程度のDeep learningであれば8GB以下で十分事足りるくらい、本格的にDeep learningを行うなら8GB以上必要、といった印象です。11GBは結構快適に学習を回せます。しかし、必要なGPUメモリの量はケースバイケースです。本格的にDeep learningをやりたい場合には、自分のやりたい手法がどれだけ計算コストが大きいのかをあらかじめ調査するようにしましょう。筆者が音声に対してCycleGANを用いたときは10GB近くのメモリが必要になった場合もありましたし、扱うデータの容量が大きい画像の分野では11GBでもメモリが足りなくなるケースがあります。

　GPUはDeep learningにおけるメインの学習部分を担う、最も重要な部品です。GPUの性能はCUDAコア（Tensorコア）と、搭載しているメモリの量によって決定します。
　CUDAコアとは、Deep learningの計算を行う演算処理ユニットのことで、これの数が多いほど計算能力が高いことになります。また、RTXシリーズからはDeep learning専用に最適化されたTensorコアというものが搭載され、これがあるとさらに計算能力が高い、というパラメータになります。
　メモリについては、学習時のデータの読み込み、および学習モデルの読み込みが行われます。Deep learningではバッチ学習といって、学習時に複数のモデルを並列に演算し、莫大な量のデータに対して複数のモデルが手分けして学習を行い、それらを統合することで効率的に学習を行う手法がとられます。そのため、最新の巨大なモデルを学習する際には、膨大な量のGPUメモリを必要とします。（バッチ数を減らすことでGPUメモリに乗るように調整する、という方法である程度対応は可能です。）

　また、Deep learningを語るうえで欠かせないのが、**SLI、およびNV-LINK**という機能です。
（SLIが以前の呼称、SLIの最新方式の名前がNV-LINKといいます。）SLIとは複数枚のGPUをそれぞれ専用のブリッジで接続することでGPUの性能を底上げする機能になります。マザーボードがSLI対応であれば、SLI、およびNV-LINK、どちらも行うことが可能です。ただし、どちらも同じGPUを用いないといけない(例：RTX2080×2は可能、RTX2080＋RTX2080Tiは不可能、など)、専用のブリッジが異なる、といった細かい条件があります。
　また、複数のGPUを一つのPCに収めるということは、大きな熱源を二つ抱える、ということになります。そのため**GPUを複数搭載する際には、それぞれケース外排気のものを選ぶなど、PCの排熱についても十分注意をしてGPUを選ぶようにしましょう。**

|項目|SLI |NV-LINK |
|:---------|----------|----------|
| 対応GPU|GTX1000シリーズ以前の対応GPU |RTX2080、RTX2080Ti、Titan RTX  |
| 演算能力|GPUの合計(2枚なら2倍、とはならないので注意) |　GPUの合計(こちらも単純に2倍にはならないが、SLIよりも劇的に性能が上がる) |
| メモリ|GPU1枚のメモリ |接続されたGPUすべてのメモリの合計 |
| 使用ブリッジ|各メーカーの出している**SLI専用ブリッジ** |各メーカーの出している**NV-LINK専用ブリッジ** |


　以上の話も踏まえたうえで、GPUの選択ですが、思ったより選択肢が広かったため、複数の項目に分けて解説します。**2020年下期にRTX3000系が控えている現在、GPUの選択は大きく分けて2通りあります。**

### 王道ルート①：RTX2000シリーズを選ぶ

　**RTX2000シリーズでやっていく**、或いは**RTX2000でお茶を濁してRTX3000シリーズを待つ**、というのがこの選択肢になります。
　一般ユーザーの選択肢としては、以下になります。（リストにはTitanRTXを記載しますが、今回は選択肢に含めないことにします。）

|GPU |メモリ|CUDAコア(Tensorコア)|価格 |備考 |
|:---------|----------|----------|----------|----------|
|Titan RTX　　|24GB|4608(576)|32万円程度|画像関連で本格的なことをやろうとするとお呼びがかかる。NV-LINKに対応しているが、ケース内排気モデルしか存在しない。そのため、NV-LINKの際には排熱問題が発生する。|
|RTX 2080Ti　　|11GB|4352(544)|15～20万円程度|NV-LINKに対応。|
|RTX 2080 SUPER|8GB|3072(384)|9～10万円程度|NV-LINKに対応。|
|RTX 2080 　　　|8GB|2944(368)|9～10万円程度|NV-LINKに対応。|
|RTX 2070 SUPER|8GB|2560(320)|6万円程度|NV-LINKに非対応。複数枚挿す際の旨味があまりない。|
|RTX 2070 　　　|8GB|2304(288)|5万円程度|NV-LINKに非対応。複数枚挿す際の旨味があまりない。|
|RTX 2060 SUPER|8GB|2176(272)|5万円程度|NV-LINKに非対応。複数枚挿す際の旨味があまりない。|
|RTX 2060 　　　|6GB|1920(240)|4万円程度|NV-LINKに非対応。複数枚挿す際の旨味があまりない。|

　RTX2060はやや力不足のきらいもありますが、いずれもDeep learningを行う上では十分な性能を持っています。
　メモリに対するコストの観点で見ると、RTX2060 SUPERが光りますが、計算能力に欠けるともいえます。本格的なDeep learningを行う上では計算能力に問題が出てくるでしょう。RTX2080SUPERでのNV-LINKはRTX2080Tiと同等の価格で16GBのメモリが得られるなど、NV-LINKの存在も考慮に入れると、RTX2080、RTX2080SUPER、RTX2080Tiに魅力が出てきます。
　以下は考え方の例になります。NV-LINKの存在も加味した上で、自分の今後の方針も踏まえつつ、適宜GPUを選ぶといいでしょう。

- 本格的なDeep learningを行うつもりはない、あるいはRTX3000シリーズが出るまでは本格的なことをしない
　→　RTX 2070 SUPERなどのNV-LINK非対応のものも含めて予算と相談
- RTX3000シリーズを視野に入れているが、本格的なDeep learningはやるかもしれないくらい
　→　RTX2080、RTX2080SUPERの中から選び、スペック不足を感じたら買い替えやNV-LINKを行う。
-  RTX3000シリーズを視野に入れているが、本格的なDeep learningはやるかもしれないくらい
　→　RTX2080、RTX2080SUPERの中から選び、最初からNV-LINKをする、あるいは、RTX2080Tiでスペック不足を感じたら買い替えやNV-LINKを行う。
-  RTX3000シリーズは視野に入れていないが、本格的なDeep learningをやるかもしれない
　→　RTX2080、RTX2080SUPER、RTX2080Tiの中から選び、スペック不足を感じたら買い替えやNV-LINKを行う。
-  RTX3000シリーズを視野に入れていないが、本格的なDeep learningをやる
　→　RTX2080、RTX2080SUPER、RTX2080Tiの中から選び、最初からNV-LINKをする、あるいはスペック不足を感じたら買い替えやNV-LINKを行う。

### 王道ルート②：GTX1000シリーズを選ぶ
　**本格的なDeep learningは行わない**、**既存のマシンでとりあえずDeep learningをやってみる**、或いは**GTX1000シリーズでお茶を濁してRTX3000シリーズを待つ**、というのがこの選択肢になります。

　一般ユーザーの選択肢としては、以下になります。

|GPU |メモリ|CUDAコア|価格 |備考 |
|:---------|----------|----------|----------|----------|
|GTX1080Ti|11GB|3584|8万円程度|SLI対応。新品は入手困難、中古市場は10数万円単位での取引が行われている。|
|GTX1080　|8GB|2560|7万円程度|SLI対応。|
|GTX1070Ti|8GB|2432|6万円程度|SLI対応。|
|GTX1070　|8GB|1920|6万円程度|SLI対応。|
|GTX1660Ti|6GB|1536|3万円程度|SLI非対応。|
|GTX1660　|6GB|1408|2.5万円程度|SLI非対応。|
|GTX1060　|6GB|1280|3万円程度|SLI非対応。|
|GTX1650　|4GB|896|2万円程度|SLI非対応。|
|GTX1050Ti|4GB|768|1.5万円程度|SLI非対応。|

これらのGPUはNV-LINKの時と異なり、複数枚の使用はSLIになります。そして、SLIではGPUメモリの増大が見込めないことがネックになってきます。
　それらも踏まえると、本格的なDeep learningをやるには、いずれのモデルもRTX2000シリーズと比べると力不足、魅力不足が否めません。どちらかといえば、既存のPC環境が、上記のようなGPUを使っている、という方が多いでしょう。GTX1080Ti、GTX1080、GTX1070Ti、GTX1070などはまだ実用に耐えるレベルで、まだまだ現役として活用していけます。それ以下のGPUも十分な戦力です。事実、負荷の軽い課題（手書き文字の認識や音の聞き分けなど）であれば、GTX1060を搭載したデスクトップPCや、GTX1650を搭載したノートPCで動かした経験があります。
　既存の環境が上記のようなGPUを用いているのであれば、そのままDeep learningの環境を設定するだけですぐにDeep learningをやってみることができます。

### 王道を外れたこと①：GTX900シリーズ以前を選ぶ(非推奨)

**考え直してください。**
今更このタイミングでGTX900シリーズ以前のものを選ぶのは、RTX3000シリーズを待つにしてもやめておいたほうがいいと思います。確かにPCを安価に組むことは可能ですが、それでもGTX1000シリーズで事足りるでしょう。

### 王道を外れたこと②：AMDのGPUを選ぶ

実はAMDのGPUでもDeep learningはできます。
RadeonOpenComputeというAMDのGPUでもCUDAの開発資源を活用できるプロジェクトが存在しています。
ただし、研究業界においてはまだまだ主流の手法としてカウントするには難しく、筆者も開発の経験がありません。
わざわざ新規の環境で変化球を投げる必要もないと考えるので、本記事では触れないこととします。

## ストレージを考える
**ストレージに関してはあまり触れることはありません。**
OSをインストールするシステム部分はSSDにして、データセットなどはHDDに配置するのがいいと思います。
HDDについては純粋に「データセットが入りきるか」で考えればいいです。
筆者の場合は240GBのSSDにOSをインストールし、HDDは1～2TBの空き容量があるものを用いています。
閑話ですが、SSD、HDDはPCのオープンベイに設置するようにし、適宜取り換えて使用する、という運用をすると、Deep learning生活のQOLが向上します。

## 電源装置を考える

**電源装置については、ざっくりとGPU以外の部品＋マージンも含めて500W、GPUが1枚当たりで250Wと計算すればいいです。**
GPU1枚なら750W、GPU2枚なら1000W、といった感じです。GPU1枚であっても、あとからGPU2枚にする可能性があるなら、あらかじめ1000Wの電源装置を買っておく、といったことも考えましょう。


## 最後に

　以上が、筆者が実際にDeep learningのためのPC環境を作った際の経験と検討内容をまとめたものになります。


　ちなみに筆者の新しく構築した環境は、Corei7-9700F、メモリ32GB、RTX2080SUPER(外排気)×1、1000W電源です。（ストレージは全部オープンベイにして、適宜差し替える方針）RTX3000シリーズの情報を待ちつつ、いざというときはGPUを増設する、という方針ですね。

　ちなみにRTX2080Tiを購入したものの、排熱を考慮せずケース内排気のものを選んだため、増設を断念した苦い経験があります。
　Deep learningに興味を持った方、これから何かやってみたい方などの参考になれば幸いです。