CPU or GPU

2011年の言語処理学会年次大会でGPUを使った言語処理の発表をした頃は、現在の深層学習ブームの前であったこともあり、言語処理におけるGPUの利用はあまり注目されていなかった。反対に、現在は「ちょっと偏り過ぎでは」と懸念するほど、GPUを使った深層学習+言語処理が研究の主流になっている。

とにかく、現在の深層学習はGPUなくては研究できない。GPUは本来は画像処理を高速に実施するための専用装置であったが、その並列計算機構を一般の計算にも利用するための開発環境が提供されたことで、大量の行列やテンソルの計算が必要となる深層学習の高速化になくてはならないものとなっている。たとえば、CPUで計算すると数日かかる学習がGPUを使えば数時間で終わるというぐらいの違いがある。これは、パラメータ探索のために学習を何度も行わなければならない深層学習の研究を実際に行う際には決定的な違いになる。

少し前置きが長くなったが、このことは今の深層学習に携わっている人にとっては常識なので目新しい情報ではない。ではここで、少しCPUの未来を見てみよう。もし、GPUではなくCPUのマルチコア化が究極的に進んだらどうなるか。CPUメーカーのAMDがEPYC 7702という新しいCPUの生産を始め、HPなどのサイトから搭載サーバを購入できる。7702は64コアのCPUで、普通のCPUの命令セットが64コア並列で動作する。実際にはさらに1つのコアで2つのスレッドを動かせるので、128並列の計算が可能。HPでは2wayのサーバーが購入できるので合計256スレッドの計算が1台のマシンで可能になる。現状ではサーバーの価格が800万円ぐらいになるためあまりお徳感はないが、CPUの値段が下がってくれば、GPUとの競合になりそうだ。

現在のGPUは数千個のセルが搭載されているので、並列度で言えばGPUが上回っているが、実際の処理速度はそう単純ではない。CPUと比べてGPUで計算する場合には次のような弱点がある。

  • GPUのクロック数(1~1.5GHz)がCPU(3~4GHz)より低い。つまり単純な処理速度が1/3程度。
  • GPU・CPU間のデータ転送はデータバスを通るため遅く、大量のデータ転送には向かない。
  • GPU側で並列処理の効果が出るのは、まったく同じコードをまったく同じ処理として大量に実行する場合のみ。コードが同じでも条件分岐があれば、分岐に相当する数だけ処理速度が低下する。たとえば、if (a>0) {処理1} else {処理2}のコードがあった場合は、処理1に分岐したセルが実行中は、処理2に分岐したセルが休んでいる。逆も同じ。つまり、並列度が半分になる。このように、GPU上のコードに条件分岐があるとその分実際の並列実行度は下がっていく。
  • GPU側のメモリは上位のV100でも32GBに限定される。大きなデータをランダムにアクセスするような処理をGPUにやらせるには、GPU側のメモリが不足する。
  • GPU上の並列計算が、少数のデータ(変数)を集中的に更新するようなコードになっていると、アクセス待ちが発生し並列度が上がらない。または、並列に書き込んでしまうと処理結果が想定した結果にならない。

もし、AMDから数百スレッドの計算ができるCPUが出れば、学習データのサイズやモデルの条件にはよるが、CPU側での計算がGPUより速くなるケースが増えて行く。さらにもっと先の未来では、数千コアのCPU(たぶん命令セットがRISCのように最小限)が深層学習用の計算資源の中心になっているかもしれない。