Aidemy Tech Blog

機械学習・ディープラーニング関連技術の活用事例や実装方法をまとめる、株式会社アイデミーの技術ブログです。

説明できますか?CPUとGPUの違い

こんにちは。たくやです。

今週はリクエストがありました、GPUとCPUの違いについて説明したいと思います。

目次

GPUとCPUの違い

GPUの起源とディープラーニングのボトルネック

現在、世界一強力なクラウドで使えるGPUインスタンスの性能

おまけ 浮動小数点演算とは

 

                                  

GPUとCPUの違い

GPUとCPUの違いはなんなのか。

みなさんは答えることができますか?

 

 

 

 

 

答え合わせです。

GPUもCPUも本質的には計算をするという点で同じです。

ただ、GPUとCPUはその構造が全く違っているのです。

GPUはCPUよりもはるかに多くのコアを搭載しており、コアの数は同時に対応できる

処理の多さを表しています。

GPUは同じ処理を同時に複数のコアに投げることができるのです。

一方でCPUは一つ一つの処理を一つずつ行うような作業に強いです。

このGPUとCPUの違いを視覚的、感覚的に理解できる有名な動画が存在するので載せておきます。

www.youtube.com

この動画は前者のスプレーガンをCPU、後者のスプレーガンをGPUに見立てています。

前者のスプレーガンが一つ一つ、丁寧に処理をするのに対し、後者のスプレーガンを一気に同じ処理を並列して行います。

 

もう少し詳しく具体的な例をあげて説明したいと思います。

Xeon E5-2680 v2 CPUは10コアで、各コアでAVX2を使えば、単精度浮動小数点の積和演算を8個並列に実行でき、2演算(積と和)×8並列×8コア=128演算を実行できます。一方、NVIDIAのK20x GPUは2演算×192並列×14コア=5376演算を並列に実行できます。Xeon E5-2680 v2のクロックは2.8GHzであるのに対して、K20x GPUは0.732GHzであり、CPUの方が3.825倍のクロックであることを考慮しても、5376/(128×3.825倍クロック)=10.98で、ピーク演算性能でいうと、Kepler GPUの方が11倍以上速いということになります。

浮動小数点とは何かは下に解説があります↓

おまけ 浮動小数点演算とは

 

これだけでも違いはわかると思いますが、

2017年のmac proでも最大でCPUのコア数が8なのに対し、Tesla V100 GPUにはなんと5000コア以上が詰まっています。

どうでしょうか。

GPUとCPUのコア数が文字通り桁違いに違うのを感じていただけましたか?

その計算速度の違いは火を見るより明らかでしょう。

しかし、一方でCPUは連続的で複雑な処理を得意とします。

分岐予測機構や、スーパースカラ(スーパースケーラ)という、命令処理を実行する回路を複数持つことで、複数の命令処理を同時に実行する仕組みや、Out-of-order実行という機械語プログラム中の命令の並び順に依らず、データなどの依存関係から見て処理可能な命令について逐次開始・実行・完了させる機構を兼ね備えたCPUは1サイクルに1.5命令程度は実行できると考えられますが、そのような機構を持たないGPUコアは、条件分岐が多い複雑な処理をする場合には、1サイクルに0.1~0.2命令しか実行できないと思われます。

これだけ見ても10倍程度の差がありますが、クロックという1サイクルを回すための時間がCPUの方がGPUよりも4倍速いので(GPUの具体例を参照して)その差は40倍にもなり、CPUの処理の方がGPUよりも圧倒的に速いことが伺えます。

*サイクル(クロックサイクル)とは CPUはクロックという基準の信号にテンポをあわせて動作します。ただし、ひとつの命令が1クロックで終わるわけではありません。
命令の実行には、1)メモリからの命令取り出し、2)解釈、3)実行、4)結果のメモリーへの書き戻し、と4ステップで行われます。各ステップには数クロックから数十クロックが必要です。そして、1命令を完了するのにかかるクロック数をクロックサイクルといいます。

まとめると

GPU 大量の単純な計算をするのに優れている。

CPU 複雑な処理をするのに優れている。

という違いがあります。

なのでGPUはゲームなどのグラフィックに使われることが多いです。

(たとえば「アイテムを落としたら、落ちる」とか「服に風があたったらなびく」といったような、つねに答えが同じになるような単純な処理の高速の繰り返しであるためです。そもそもGPUはGraphics Processing Unit の略なのです。)

 

これまで説明してきたGPUとCPUの違いをプログラミング言語を用いて例えると

GPU  『for』が得意

GPUは、難しい処理ができる大きいものではなく、演算器だけ取り出したものを何百個と並べ、1度に処理するものです。

もしfor文のループを100万回繰り返すなら、それを10000個の演算器で等分して処理してやれば処理速度は大幅に上がります。

 

CPU 『if~else~』が得意

CPUは、OSのように複雑なプログラムを動かすことを念頭において作られてきました。従ってフレキシブルにプログラムを動かせますが、演算器の間でメモリをシェアする仕組みなので、コアの増加に伴い性能が頭打ちになってしまうことが欠点です。

メモリを階層化するなど、互いに邪魔せずに処理できるよう工夫はされていますが、それでも限界はあります。

連続的な細かく条件をとって処理していく問題を得意としています。

 

次にGPUとディープラーニングの関係性を探るために

GPUの起源とディープラーニングのボトルネックをみていきたいと思います。

 

 

                                  

GPUの起源とディープラーニングのボトルネック

GPU はNVIDIAという会社によって開発された、ゲームを快適に行うため、CPUの演算を補助するための装置で、FPUという浮動小数演算処理装置に、画像表示装置をくっつけたものでした。

なぜ、整数ではなく浮動小数なのでしょうか。

なぜなら、ゲームではグラフィックの大量の演算を処理する際、座標は小さなものはミリ以下の単位から広いシーンはキロメートル単位までの値が混在し、ピクセルの明るさは6桁程度は優に変わるので、固定小数点の数字の範囲にうまく収まるように注意して計算する必要があり、面倒だったからです。その手間を省けるのが浮動小数点演算という手法であり、それを扱うためにさらに膨大な計算を瞬時に行えるGPUの開発が進んでいったのです。

当初、ビデオボードと呼ばれていたGPUはその名の通り、ゲーマーしか手を出さないニッチを狙った商品で、今日のように科学計算に使われてはいませんでした。それには理由があり、GPUはその単純な仕組みにより、全ての計算を正確に行う訳ではなかったのです。当時、GPUはあくまでゲームのグラフィックのために使われていたため、ピクセル数が少しずれていても大して問題ではないため、わざわざ全ての計算を正確に行う必要もありませんでした。

その一方でCPUは正確な値を返してくれるため、科学計算の中心は当時、まだまだCPUでした。

しかし、ここでNVIDIAが動きました。市場拡大を狙って、ECC(Error Correction Code) という計算エラーを自動で検知し、修正する機能などの充実させその計算精度を科学計算にも使えるレベルにまで引き上げたのです。その圧倒的な演算処理能力により科学計算の中心はGPUに移っていきました。

そのころ、ディープラーニングは特徴量の抽出に際して必要になる膨大な計算処理によって学習にとても多くの時間がかかり、モデルの構築→学習→調節→学習のサイクルが高速で回せないことがディープラーニング発達のボトルネックとなっていました。

しかし、GPUの一度に同じ処理を行うことができる仕組みが、ディープラーニングの膨大な行列演算の処理と非常に相性がよく、ディープラーニングにGPUが使われだした頃からディープラーニングは大きな発展を遂げることになります。

今でも複雑なモデルの学習をする時は膨大な計算処理がボトルネックとなりますが、GPUの登場がディープラーニングの発達に大きく貢献したのは疑いようがありません。

 

最後に、今、機械学習の学習速度にお悩みの人には朗報かもしれないニュースを紹介します。

 

                                  

現在、世界一強力なクラウドで使えるGPUインスタンスの性能

今週のニュース

AWS(Amazon  Web Service) が強力な新インスタンスをリリースです。

*インスタンス  物理的な一台のコンピュータ上で、ソフトウェアとして実装された仮想的なコンピュータを起動したもの。

ニュース概要

  1. アマゾンはクラウドコンピューティングサービスE3で、新しいインスタンスP3の提供を開始。
  2. このインスタンスは、NVIDIAの「Tesla Volta」アーキテクチャに基づく GPU「Tesla V100」を使用しており、機械学習モデルのトレーニングを劇的に高速化できる。
  3. 利用できるインスタンスは、使用されるTesla V100 GPUの数が1基のもの、4基のもの、8基のものの3種類で、それぞれ「Intel Xeon E5 Broadwell」ベースのカスタムCPUを8基、32基、64基搭載している。
  4. 新インスタンスは、米国東部(バージニア北部)、米国西部(オレゴン)、欧州(アイルランド)、アジアパシフィック(東京)の各リージョンで利用できる。

この新インスタンス、GPUの搭載数によって

1基  p3.2xlarge

4基  p3.8xlarge

8基  p3.16xlarge

という名前をつけているのですが、それぞれ

Instance Size GPUs - Tesla V100 GPU Peer to Peer GPU Memory (GB) vCPUs Memory (GB) Network Bandwidth EBS Bandwidth
p3.2xlarge 1 N/A 16 8 61 Up to 10Gbps 1.5Gbps
p3.8xlarge 4 NVLink 64 32 244 10Gbps 7Gbps
p3.16xlarge 8 NVLi 128 64 488 25Gbps 14Gbps

https://aws.amazon.com/jp/ec2/instance-types/p3/

上記のような性能の違いがあります。

料金は一番性能のいいp3.16xlarge で一時間あたり41.94ドルで1ドル114円で換算すると一時間あたり約4781円と高額になっております。(東京での使用を想定)

 

少し前のインスタンスである、16 個の NVIDIA K80 GPU、64 個の vCPUを搭載したp2.16xlargeのインスタンスのオンデマンド利用料が1時間当たり24.67ドル=2812円なのを考えるとその値段はおよそ倍。

p3.16xlargeを一日つけたままにすると約11万5千円

一ヶ月付けっ放しにすると約350万!

この先はちょっと考えたくありませんね・・・・。

 

ちなみにp3.2xlargeは5.24ドルで597円/時、p3.8xlargeは20.97ドルで2390円/時です。

そんな半沢直樹ばりの料金をとる今回のp3.16xlargeの性能はいかほどのものなのでしょうか。

p2.16xlarge が単精度浮動小数点演算を一秒間に70兆回できるのに対し、

p3.16xlargeでは、なんと単精度浮動小数点演算を125兆回できます。

値段が倍になった分、ちゃんと処理速度も倍になっているんですね。

 

とはいえ、値が大きすぎてGPUが過去と比べてどれだけ成長したのかわかりにくいと思います。

そこでマイクロプロセッサの歴史を振り返って、1977年に発売していたIntel 8080Aチップを搭載したMITS Altairを考えてみます。2MHzクロックで秒間832回の乗算が可能でした。しかし、それから40年がたちました。p3.16xlargeは約1500億倍も高速です。言い換えると、過去40年かけてAltairが行なった計算に比べ、100倍以上の計算を1秒に実行することが可能となっているのです!

この計算処理速度の爆発的増加がディープラーニングのこれまでの発達の屋台骨となっていた訳です。

 

 

                                  

おまけ 浮動小数点演算とは

ところで浮動小数点演算ってなんなんだ、というツッコミが入りそうなので、

そこも最後に解説していきたいと思います。

浮動小数点数から解説していきます。

浮動小数点数とは指数形式で表された数字のことです。

例えば1230であれば浮動小数点数で1.23×10^3で表されます。

昔はコンピュータごとに処理の仕方が異なりましたが、それでは不便なので共通のルールがIEEE754という組織によって作成されました。

それがIEEE規格で状況によって求められる精度が違うことを考慮して、

32桁バージョン(単精度)と

64桁バージョン(倍精度)があります。

この浮動小数点数の状態で演算を行うと通常の演算に比べて処理に時間がかかる上にコンピュータにとって都合がいいので、コンピューターの性能を評価するベンチマークに使われることが多いのです。

つまり今回行われた単精度浮動小数点演算は

32桁の浮動小数点数の演算だったということがわかりました。

 

 参照

https://japan.zdnet.com/article/35109459/

https://aws.amazon.com/jp/ec2/pricing/on-demand/

https://aws.amazon.com/jp/blogs/news/new_amazon_ec2_instances_with_up_to_8_nvidia_tesla_v100_gpu_p3/

http://wa3.i-3-i.info/word15851.html

https://www.gizmodo.jp/2016/06/cpugpu.html

https://bita.jp/dml/sony-neural-network-console-interview