AIのGPU、増やしたのに速くならないことがあるのはなんで?

AIのGPU、増やしたのに速くならないことがあるのはなんで?

「GPUを増やしたのに、思ったほど速くならなかった」。AIの計算まわりで、こういう話を見聞きしたことはないでしょうか。演算する部品を倍にしたのだから、単純に倍速くなってほしい。でも現実はそうならないことがある。ここが、ちょっと不思議なところです。

以前、GPUが速いのは行列のかけ算が「独立」だからという話を書きました。あのときは「なぜ並列にできるのか」を見ました。今回は同じGPUを、「並列にできるのに、なぜ思ったほど速くならないことがあるのか」という別の角度から見てみます。

目次

計算が速い、だけでは足りない

GPUは、独立した小さな計算を大量に同時にこなせる部品です。だから行列のかけ算のような計算にめっぽう強い。ここまでは前回の話で、おおむねそのとおりです。

でも、ここで一つ引っかかります。計算する力がいくらあっても、その計算に使う数字が手元に届いていなければ、演算の担当者は手を止めて待つしかありません。GPUの本当のボトルネックは、演算そのものではなく、この「数字が届くまでの待ち」のほうにあることが少なくないのです。

たとえば、大きな表から数字を読み出して少しだけ加工する処理を考えます。数字を取りに行くたびに足し算を1回だけするなら、足し算の担当者を増やしても、読み出し待ちの列はあまり短くなりません。逆に、一度取り出した数字を何度も掛けたり足したりできる処理なら、数字を運ぶコストを計算で取り返せます。この差が、GPUを増やしたときの効き方を大きく変えます。

速さは、遅いほうで決まる

料理でたとえてみます。どれだけ腕の立つ料理人を何人そろえても、食材が冷蔵庫から運ばれてこなければ、みんな包丁を持ったまま待つことになります。料理の速さは、料理人の腕と、食材が届く速さの、遅いほうで頭打ちになる。

GPUの計算もこれと同じ構図です。「計算する速さ」と「メモリから数字を運んでくる速さ(これを帯域と呼びます)」の、遅いほうが全体の速さを決めます。演算する部品だけを増やしても、数字を運ぶ通り道が細いままなら、増えた部品はほとんど待ち時間を過ごすことになります。

同じ話は身近なところにもあります。速い回線を契約したのにサイトの表示が遅い、というとき、原因は回線ではなくサーバー側の応答だったりします。どこか一か所の細い通り道が、全体の速さを縛る。これも「遅いほうで決まる」の一例です。

数式で正面から見る

この「どちらが足を引っ張るか」を、一つの数で表す見方があります。計算強度と呼ばれる量で、こう書けます。

$$\text{計算強度} = \frac{\text{その処理でおこなう計算の回数}}{\text{そのために運ぶ数字の量}}$$

分子は「どれだけ計算するか」、分母は「そのためにどれだけ数字を運ぶ必要があるか」です。運ぶ数字1つあたり、どれだけ計算で元を取れるか、という比だと思ってください。

この比が小さいと、少ししか計算しないのに大量の数字を運ぶ必要がある、という状態です。演算する部品は暇で、通り道がずっと渋滞している。これがデータを運ぶ速さで頭打ちになる状態(帯域律速)です。逆にこの比が大きいと、一度運んだ数字を使い倒して長く計算できるので、今度は演算する力そのものが頭打ちになる(演算律速)。

この関係は、もう一歩だけ式にできます。

$$\text{出せる速さ} \le \min(\text{演算の上限}, \text{帯域} \times \text{計算強度})$$

右側の min は「小さいほうを選ぶ」という意味です。演算の上限は、GPUが理想的に計算だけを続けたときの天井です。帯域 × 計算強度は、数字を運ぶ速さから見た天井です。どちらか高いほうではなく、低いほうが実際の速さを止めます。

この2つの天井を1枚に描いたのが次の図です。斜めの線が「運ぶ速さの天井」、水平の線が「計算する力の天井」で、処理はそのときどきで低いほうの線にぶつかって止まります。

斜めの線=帯域×計算強度、水平の線=演算の上限。出せる速さは低いほうの天井で止まる。
斜めの線=帯域×計算強度、水平の線=演算の上限。出せる速さは低いほうの天井で止まる。

大事なのは、境目より左にいる処理は、演算する部品をどれだけ足しても水平の天井には届かない、という点です。斜めの線に張りついたまま、増やした部品は待つだけになる。

だから「増やせば速い」とは限らない

「GPUを増やす」は、この図でいえば水平の天井を上げる工事です。でも自分の処理が斜めの線の側にいるなら、上げるべきは天井ではなく、数字を運ぶ通り道のほうだった、ということになります。

しかも、GPUを複数枚に増やす場合は、カード同士で数字をやり取りする通信の通り道が新しく加わります。この道は1枚の中で数字を運ぶ道よりさらに細いことが多く、せっかく演算の天井を上げても、今度はカードの間の運搬が新しい詰まりどころになることがあります。

「増やしても速くならない」を、並列化の天井という別の数式から見た記事もあります。

次にAIの計算が「重い・足りない」という話を聞いたとき、それは計算する力が足りないのか、それとも数字が届くのを待っているのか。同じ「足りない」でも中身がまるで違うと分かると、GPUを増やすべき場面と、増やしてもあまり効かない場面を見分けられるかもしれませんね?

よかったらシェアしてね!
  • URLをコピーしました!
目次