![見出し画像](https://assets.st-note.com/production/uploads/images/140805448/rectangle_large_type_2_ae5050ffd325218127ada70c4cea8da7.png?width=1200)
GPUで計算しよう
ここでは以下を説明します。
1.GPUとは何か?
2.GPUを計算に使うとどれぐらい速いのか?
3.GPUを計算に使う簡単な方法
さっそくGPUの説明からいきましょう。
0.その前にCPU、メモリ、ストレージとGPU
その前に、PCの他のパーツから説明します。
PCはざっくり、CPU、メモリ(RAM)、ストレージ(HDDとかSSDとか)、の3つから構成されると説明されます。
PCを擬人化して、人間がデスクで仕事や勉強をすることを考えると、CPUは人間(頭)、メモリはデスク上、ストレージは棚だといわれます。
それに加えて、GPUは元来、画面に映し出すための役割を担っていました。
GPUは大概の場合、CPUの中に入っているか、マザーボードに乗っているか、グラフィックボードとして独立してその中に入っているかのどれかです(なかったらディスプレイに表示できない)。高画質動画や3Dを扱うゲームやデザインなどをする場合、多数のディスプレイを使う場合などには高性能のGPUが必要で、その場合はCPU内臓では対応できません。
ということで、これら4つの性能が高いと、以下のように良いことがありますので、PCを購入するときには参考にしてください。
CPUが速い、CPUコア数が多い:頭の回転が速い方が計算が速いです。また人が複数人いれば(頭が複数あれば)、いろんなものを並列にしょりできます。
メモリが大きい:頭が処理するためには、棚にあるものをデスクに出さないと見えないので、デスクが大きい方が一度にたくさんの事を扱えます。
ストレージが大きい:棚が大きい方がたくさんの情報を保存しておけます。
GPUが凄い:後で説明しますが、この元来の用途では、GPUが凄い(?)ほど、多数のディスプレイや高画質動画などを扱うことができます。
ということで、GPUは、そもそもは画面表示でした。が、その役割に加えて、CPUの役割をするようにもなってきました。これがここでの説明です。
1.GPUとは何か?
上記のように、GPUには二つの役割があります。
・画面表示の役割(画面表示に特化した特殊な役割)
・CPUのような役割(いろんな計算に使える汎用的な役割)
この二つ目の役割がここでのメインです。
これは汎用的な役割なので、GPGPU(General-purpose computing on graphics processing units)と呼ばれます。
(追記)ちなみにGPGPUは計算行為自体やその技術のことを指すのであって、モノを指しているのではありません。「わしのPCにはGPGPUはない」みたいな話ではありません。ディスプレイに表示できるPCにはすべてGPUはあるので、原理的にはGPGPUを利用できます。ただし実際には、GPGPUを利用しやすくしてあるGPUは限られているので、購入時にはそれを考えてください。どうやって選ぶかは下記参照。
さて、なぜCPUがあるのに、GPUに計算をさせるのでしょうか?
それは、GPUのほうが良いことがあるからですが、慣れているCPUのほうを考えてから、GPUをみてみます。
CPUは、あらゆる計算処理ができる万能選手です。
また、今のCPUはほとんどマルチコアで、たとえば8コアといえば、8個の独立した万能選手が働いてくれるみたいなもんです。
一方、CPUと比較すると、GPUは単純な計算処理しかできません。
しかし、一般的なものでも1000コアとかあります。これがメリットとデメリットです。そもそも、大きな画面を分割担当して多コア皆で表示するだけの機能だったものなので、大きくて単純な計算を分割担当して処理するように使われた、ということです。すなわち、簡単な並列計算が得意で、これがいわゆるAIとして流行っている深層学習と相性が良いです(深層学習が流行っている原因とも言えます)。
で、GPUのスペックはどのように見ればよいのか、そして、要するに何を買えば良いのか、という話があります。
先に結論から言いますと、ゲームではなくGPGPUの用途としては、以下になると思います。
できるだけメモリの大きいNVIDIAのGeForceを買うと良い
以上です。以下を読む前に(または意味不明でもさらっと読む程度にしておいて)、先に「3」や「4」に行ってしまってよいと思います。やるのが一番わかりやすいからです。
一応、スペックというか指標について書きます。
CPUでは、速さである「クロック数」と、何人かという「コア数」で見ます。
GPUでも同様に、「クロック数」と「コア数」があります。
さらにGPUではそれらに加えて、「メモリ」があります(ビデオメモリ:VRAMといいます)。
正直言って、ここでの用途を考えると、メモリ容量が一番大事だと思います。それは、このnoteの「3」で使ってみるとよくわかります。
しかしスペックよりも大事なのはGPGPUが簡単に動くことです。
例えば、深層学習を使うために、「TensorFlowを使いたい(別のnote参照)」のであれば、TensorFlowが使えるGPUを購入しなければなりません。
例えばこの場合は、以下に記載があります。
https://www.tensorflow.org/install/gpu
この記事を書いている時点では、「ハードウェア要件」として、「CUDAを使用できるNVIDIAのGPU」だと書いてあります。
ここで、NVIDIAとは、GPGPU分野をほぼ独占しているアメリカ(シリコンバレー)の会社の名前です。CUDAは、このNVIDIA社が提供する、GPGPUのプログラム開発環境で、要するに、プログラミングで計算を指定すると、それをCPUではなくてGPUでやるようにしてくれるヤツです。これが使えないGPUではGPGPUは難しいです。
次に、「CUDA® アーキテクチャ 3.5、5.0、6.0、7.0、7.5、8.0 以降」とあります。
なんだそれ?という話ですが、以下のリンクに行って、例えば「CUDA-Enabled GeForce and TITAN Products」とかをクリックすると、各GPUに指定されている「Compute Capability」のことです。まあ、バージョンみたいなもので、新しければ大丈夫、と捉えてよいと思います。
※Compute Capabilityが高いほど速いとか、そういうのではないです。
https://developer.nvidia.com/cuda-gpus
逆に言えば、この上記の一覧に該当しないものは買ってはいけません。
一覧にあるものの中から、できる限りメモリの大きいものを買うと良いと思います。
2.GPUを計算に使うとどれぐらい速いのか?
これは、具体的な計算をして結果を見てみるのが一番いいです。
試しに、以下のようなN個のノードのネットワークの相互作用を計算したいとします。(これを「3」でやります)
![](https://assets.st-note.com/img/1660042000945-xLeLD2O7vC.png)
ここでの相互作用を計算してみます。
この時、相互作用の数(線の数)は、例えば1→5と5→1の影響が異なるとき、NxN=N²になります。Nが10だったらいいですが、Nが10,000とかだと、相互作用は100,000,000個も計算しないといけないので、大変ですよね。
これを、CPUとGPUで比較してみたいと思います。
で、いきなりですが結果はこうなります↓↓↓
![](https://assets.st-note.com/img/1660042272276-QzOcRC8VPy.png)
図では、横軸がNで、縦軸が計算にかかった時間です。
0.001秒以下、および100秒以上のデータは消しています。もちろん、低い方が良いです。※CPUはインテルCore i7-8700K(つまり結構良い)、GPUはNVIDIA GeForce GTX 1050 Ti 4GB(グラフィックボードという意味では必要最低限の性能らしい)を使いました。
まずは、CPUというよりも、ForLoop(青色)を見てください。
これは、N²個の一個一個をまじめに計算した結果です。Nが10倍増えると、計算時間がその2乗の100倍増えていることがわかります。N=100と1000の違いは0.3秒と30秒の違いなので、なんとなく待てる気もしますが、N=10,000になった途端に、3000秒=50分となり、待つ気が失せます。実際にはこの計算を何十万回もやることになるので、人生が足りません。
一方で、CPU_matrix(オレンジ)を見てみます。
なおmatrixは行列という意味です。これは、まだCPUを使っているのですが、行列計算の数学を使うことで、計算を速くしています。1000倍ぐらい速くなっていることがわかります。同じCPUで計算結果を得るにも、プログラミングの書き方だけで1000倍も違うというのは凄いですよね。こういった違いがプログラマと素人の違いになってきたりもします。
そして恐ろしいことに、GPU(緑)は常に0.01秒以下です。
面白いのは、Nによらないところです。つまり、N=10000の時にはForLoopの100万倍速いのですが、N=1の時にはForLoopよりも100倍ぐらい遅い、ということです。これなら10万回やっても20分ですね。
もう一点GPUの特徴があります。
それは、Nをどこまで大きくできるのか、ということです。実はこのGPUでは、N=20,000は同じ時間で計算できますが、N=30,000は「そもそも計算できない」ということが起こります。これは、GPUのメモリによるものです(ここで使ったやつは4GB)。
GPUは並列計算を得意とするので、同じような計算を一気にやるのは得意です。でも、その「一気」がGPUメモリに乗り切らないと、全く計算できません。
これが、上記でGPUではメモリが重要だ、という理由です。
速い遅いではなくて、計算できるかできないかの問題になってきます。深層学習を扱うときにはこれがかなり効いてきます。なお、複数のGPUを用いて計算することもできますが、それはそれでまたややこしいので(特に、複雑な深層学習モデルでは難しい場合がある)、一枚でデカいメモリがあるのは、扱える計算の幅を広げるという意味で、とても良いことになります。
追記ですが、GPUでメモリオーバーすると、「メモリオーバーですよ」といわれて終わるのですが、CPUでメモリオーバーすると、パソコンがフリーズします。最悪です。
以上から、GPUを計算に使うと、どんな時にはどれぐらい速いのか、がだいたい分かったと思います。
3.GPUを計算に使う簡単な方法
これはGoogle colabを使えば簡単です。
上記の計算をしてみましょう。やり方は以下です。
Googleアカウントにログイン
下記のURLに行く
Google colabにはいったら、上のメニューから「ランタイム」→「ランタイムのタイプを変更」→「ハードウェアアクセラレータ」をGPUにする→保存、をしてください。これでGPUが使えるようになります。
あとは、一番上のセルにカーソルを当て、Shift+Enterを連打。
これで全部実行できます。ただし、どうやらGPUは一回目の起動時は遅いみたいですので、株の# Calculationのところはもう一度実行したほうがきれいな結果が出るかもです(そのセルにカーソルをあてて、Ctrl+Enter)。
https://colab.research.google.com/github/hosodakazufumi/note/blob/main/ipynb/GPU_CPU_compare.ipynb
以上です。適当に変更したり、気になるところをググって調べてみると理解が深まります。