低スペックPCで機械学習を行った人間の末路

<a id="#はじめに"></a>
#はじめに
　この記事は、まだ私が学生の頃、クラウドサービスも知らずに、低スペックPCで機械学習の勉強をしていたころに経験した様々なことをまとめ、同じ過ちを繰り返す人をできるだけ減らすことを目的に作成しました。
　低スペックPCを使うことで苦労すること、何も考えずスペックをあげればいいというわけではないことなどをまとめました。
　始めに、結論を言うと、「仕事道具をケチるな、ちゃんと調べてから買え」です。

(追記)この記事の「機械学習」がさす意味は、おもに、ニューラルネットワークを用いた技術のことです。
<a id="#目次"></a>
#目次
1. [初代PCの購入と失敗](#初代pcの購入と失敗)
1. [何も考えないアップグレード](#何も考えないアップグレード)
1. [現在私が持っているPC](#現在私が持っているpc)
1. [まとめ](#まとめ)



<a id="#初代pcの購入と失敗"></a>
#初代PCの購入と失敗
（自分）「はじめてPCを買うぞ、お金があまりないから、最初に安いやつを買って、後でアップグレードするぞ。」
　ということで、以下のようなスペックのPCを購入しました。
　これくらいあれば、一般的な用途であれば問題なく使えるスペックですが、機械学習なんて膨大なリソースを必要とすることをするならスペック不足です。
　当時、自分は機械学習やハードウェアに関する知識が乏しかったことから、この程度でも試しに機械学習を行うくらいできるだろうと考えていました。

|CPU|[intel-core-i3-8100](https://ark.intel.com/content/www/jp/ja/ark/products/126688/intel-core-i3-8100-processor-6m-cache-3-60-ghz.html)|
|---|---|---|
|GPU|[GT1030 GDDR5](https://www.nvidia.com/en-us/geforce/graphics-cards/gt-1030/specifications/)|
|メモリ|8GB(シングルチャネル)|
|SSD|250GB|
|HDD|1TB|


<a id="##低スペックpcはgpuメモリとの戦い"></a>
###低スペックPCはGPUメモリとの戦い
　機械学習の勉強を始めて、最初に問題になったのは、作成したモデルがGPUメモリを超えるサイズだった時に起こるエラー「CUDA out of memory.」です。
　これは当たり前ですが、GT1030が2GBしかGPUメモリが搭載されていないので、2GBしかないなど知らない教科書やネットに上がっているPythonのコードをそのまま実行することはできません。
　バッチサイズを小さくすることや、モデルを小さくするなどの対応で、エラーを回避する方法はあります、ただし、調べるのにかなりの時間を消費した上に、デフォルトの設定を変えることになるので、想定した結果にならず、また設定を変えて、「CUDA out of memory.」を出すということを、永遠に繰り返すという無駄なことまでしました。
　教科書やサイトが悪いわけではなく、無知な私が悪いのですが、初心者は教科書通りにやって、まったく同じ結果が出ないと混乱するので、関係のないところで問題が起きないように、環境を整えることが重要だと感じました。

<a id="##メインメモリや補助記憶装置は多ければいいのか"></a>
###メインメモリや補助記憶装置は多ければいいのか
　まず本題に入る前に、私が考える機械学習のデータの読み込み方を説明するのですが、大雑把に「すべての学習データをメモリに保存する方法」と「学習を行っている間に補助記憶装置(HDDまたはSSD）から読み込んでくる方法」の2種類あります。（Tensorflowは前者、pytorchは後者がよくつかわれているように感じます。）
　前者は処理速度が速い代わりに、大きな学習データを読み込むことができないという欠点があり、後者は大きな学習データを読み込むことができる代わりに、処理速度が遅くなる欠点があります。
　ただ、「処理速度が速い」とは言いましたが、学校から帰ってきたら結果を見るというライフサイクルから考えると、例えば1割くらい早くなったからと言ってデータを確認する時間が速くなるわけでもなかったので、すぐにメモリの容量を大きくする理由はありませんでした。
　ただし、後者をHDDで行うと、寝れないくらいの騒音が発生するので、HDDを選ばずに、容量が小さくなってもいいのでSSDを選ぶべきでした。
　このあたりの選び方は、大容量を選ぶか、全体的に速度が速くなる構成にするかは、財布と相談しながら、自分のライフスタイルに合った方法を選ぶといいでしょう。

<a id="#何も考えないアップグレード"></a>
#何も考えないアップグレード
　社会人になり、お金も入ってきたので、最初の失敗を糧に、PCを以下のようにアップグレードしました。
　まだ無知な私は、ここでも失敗していることに気づいていません。

|CPU|[intel-core-i3-8100](https://ark.intel.com/content/www/jp/ja/ark/products/126688/intel-core-i3-8100-processor-6m-cache-3-60-ghz.html)|
|---|---|---|
|GPU|[GTX1650 GDDR5](https://www.nvidia.com/ja-jp/geforce/graphics-cards/gtx-1650/)|
|メモリ|16GB(デュアルチャンネル)|
|SSD|2TB|

<a id="##cpuは適当でいい"></a>
###CPUは適当でいい?
　「機械学習にCPUは重要じゃない」とか「4コアあれば十分」とか、なぜそう書かれることが多いのかというと、Tensorflowは本当にCPUをほとんど使わないからです。
　でも、pytorchはCPUをフルに使うコードがあるんですよね、なぜかはわからないので、ご存じの方がいればコメントで教えていただけないでしょうか。
　なので、pytorchを[intel-core-i3-8100](https://ark.intel.com/content/www/jp/ja/ark/products/126688/intel-core-i3-8100-processor-6m-cache-3-60-ghz.html)の4コアで機械学習を動かすと、そのパソコンは、ほかの動作がカクカクになり、何もできなくなります、暖房器具にしかなりません。
　しかも、[GT1030 GDDR5](https://www.nvidia.com/en-us/geforce/graphics-cards/gt-1030/specifications/)が乗っていた時はこんなことはなかったと考えると、GPUのスペックが上がれば、必要なCPUのスペックも上がる可能性があります。
　予算にあまりがあるのであれば、CPUは6コア（12スレッド）くらいあるものを選ぶ方がよいでしょう。

<a id="##gpu選びの根本的な間違い"></a>
###GPU選びの根本的な間違い
　[GTX1650 GDDR5](https://www.nvidia.com/ja-jp/geforce/graphics-cards/gtx-1650/)が発売された時期と同じころに[GeForce RTX](https://www.nvidia.com/ja-jp/geforce/rtx/)というあたらしいGPUの種類がでたのですが、機械学習をするのであればRTXを選んでおくべきでした。（2021年現在はRTXしか販売されていないはずです。）
　なぜかというと、[GeForce RTX](https://www.nvidia.com/ja-jp/geforce/rtx/)にはTensorコアというものが存在し、これを用いることで機械学習のモデルをFP16に変換し、高速な学習と推論が可能になります。（https://qiita.com/arutema47/items/a507a3a8ee10654d5d1f)
　なので、Tensorコアのない[GTX1650 GDDR5](https://www.nvidia.com/ja-jp/geforce/graphics-cards/gtx-1650/)はFP16のモデルを高速で処理できませんし、GPUメモリーが増えたからと言って、たかが4GB程度なので、「CUDA out of memory.」との戦いはその後も続いてしまいました。

<a id="#現在私が持っているpc"></a>
#現在私が持っているPC
　それからいろいろあり、現在は以下のようなスペックのPCを使用して、機械学習のコードを動かしています。
　まず、[RTX2060 SUPER](https://www.nvidia.com/ja-jp/geforce/graphics-cards/rtx-2060-super/#specs)に変えた結果、GPUメモリが8GBあり、TensorコアがあるGPUのため、「CUDA out of memory.」との戦いは終わり、大抵のコードはデフォルトの設定で動かせるようになりました。(でも、このRTX2060 SUPER、めちゃくちゃ安い時に買ったからか、コイル鳴きの音がうるさいです。)
　ただし、[intel-core-i3-8100](https://ark.intel.com/content/www/jp/ja/ark/products/126688/intel-core-i3-8100-processor-6m-cache-3-60-ghz.html)が処理能力不足でボトルネックになっているように見えたので、[intel-core-i7-8700](https://ark.intel.com/content/www/jp/ja/ark/products/126686/intel-core-i7-8700-processor-12m-cache-up-to-4-60-ghz.html)に変更し、処理能力に余裕を持たせることで、機械学習が動いているときも、ネットサーフィンくらいならできるようになりました。
　メモリを32GBに増やしたのは、前に16GBの領域をすべて占有するほどのデータを使うプログラムを動かしたときに、ブルースクリーンになったことがトラウマで増設しました。

　


|CPU|[intel-core-i7-8700](https://ark.intel.com/content/www/jp/ja/ark/products/126686/intel-core-i7-8700-processor-12m-cache-up-to-4-60-ghz.html)|
|---|---|---|
|GPU|[RTX2060 SUPER](https://www.nvidia.com/ja-jp/geforce/graphics-cards/rtx-2060-super/#specs)|
|メモリ|32GB(デュアルチャンネル)|
|SSD|2TB|

<a id="#まとめ"></a>
#まとめ
　ざっくりと、各GPUで動かすことができた機械学習を、技術ごとに分けたものが以下の表になります。
　〇は動作が可能だったもの、△は設定を変えることで動作が可能だったもの、✕は動作不可能だったものです。（-は未検証。ですがおそらく動きません。）
　機械学習を学んでいけば、これらの技術には一度は触れる機会があるので、その時のためにも、GT1030 GDDR5を機械学習に使うために買うことは避けるべきです。（というより、機械学習のために高性能PCを買う必要性自体が低いです。）

||GT1030 GDDR5|GTX1650 GDDR5|RTX2060 SUPER|
|---|---|---|---|
|Image Classification|〇|〇|〇|
|Object Detection|△|〇|〇|
|Semantic Segmentation|✕|△|〇|
|Image Generation|-|✕|〇|

　[Google Colaboratory](https://aizine.ai/google-colaboratory-0307/)とか[Kaggle](https://ikesala.com/kaggle_gpu/)では、無料でGPUを用いた機械学習ができる環境がある上に、2021年初めごろからのGPUの価格高騰が起きているし、さらに、安価といわれているGeForceもTensorコアの数が少なくなってゲーム用にシフトしている感があるので、高性能PCを買う必要性は日に日に低下しているように感じます。
　それでも、機械学習用のPCが買いたいという場合は、[rtx-a4000](https://www.nvidia.com/ja-jp/design-visualization/rtx-a4000/)くらいは買う覚悟で、PCを選ばないと、機械学習以外のところで時間を取られるでしょうし、GPUの足を引っ張らないように、GPU以外のCPU,メモリ,SSDもよく調べて選ぶべきです。(HDD？知らない子ですね)
　ちなみに、初期PCの価格とアップグレードにかかった価格の合計は約239000円で、2021年の今同じ金額だと同じスペックは買えないと自分に言い聞かせて、散財をなかったことにしています。
　ただ、このように自分で試行錯誤しながら機械学習用のPCを作っていくと、ハードに関する知識がかなり入ってきたり問題を解決する能力が鍛えられたりするので、皆さんも散財する勇気があれば、ぜひ、自分の機械学習用PCを作ってみてください。

||金額|
|---|---|---|
|メモリ16GB分|14000円|
|GT1030|12000円|
|GTX1650|25000円|
|SSD|25000円|
|RTX2060 SUPER|35000円|
|intel-core-i7-8700|40000円|
|初期PC|90000円|