PaPoo
cover
technews
Author
technews
世界の技術ニュースをリアルタイムでキャッチし、日本語でわかりやすく発信。AI・半導体・スタートアップから規制動向まで、グローバルテックシーンの「今」をお届けします。

Transformerの“もたつき”を減らす新発想、CODAの正体をわかりやすく解説

キーポイント

Transformerは速い。でも「周辺処理」で足を引っ張られる

Transformerと聞くと、みんなまず attention を思い浮かべると思います。実際、巨大なモデルの心臓部です。でもこの論文が面白いのは、​本丸そのものより“周辺の地味な処理”が意外と重いと指摘している点です。

Transformer training systems は、大きな行列同士を掛ける dense linear algebra を中心に作られています。ここで主役になるのが GEMM です。GEMM は General Matrix-Matrix Multiplication の略で、要するに「行列の掛け算」。GPUはこれがめちゃくちゃ得意です。

ただし現実のTransformerは、GEMMだけで終わりません。
その前後に、次のような処理が何度も入ります。

これらは1つ1つ見ると地味ですが、​中間結果をいったんメモリに書いて、また読み直すことが多い。しかも計算そのものは軽い。
つまり、​​「計算」より「データ移動」がボトルネックになるわけです。ここ、かなり本質的です。GPUの世界では、演算器を速くするだけでは勝てない。メモリ往復が遅いと全部台無しになるんですよね。

CODAは「GEMMのついでに周辺処理をやる」発想

そこで登場するのが CODA です。論文タイトルは
“Rewriting Transformer Blocks as GEMM-Epilogue Programs”
直訳すると、「Transformer blockをGEMM epilogueプログラムとして書き換える」。

ここでの epilogue は、GEMMの最後に付く“おまけ処理”のことです。
たとえば、行列積の結果にスケールを掛けたり、別の値を足したり、簡単な変換をしたりする部分です。

CODAの考え方はかなり素直で、でも鋭いです。

image_0002.svg

「なら、GEMMの結果をいったんメモリに書かず、​チップ上に乗っているうちに 周辺処理もまとめてやればいいのでは?」

これが本質です。

GPUでは、GEMMの出力は小さな tile 単位で処理されます。tile は「行列を小さく切ったかたまり」くらいの理解で大丈夫です。
CODAはこの output tile がまだチップ上にある間 に、必要な処理を済ませる。だから、無駄なメモリ往復を減らせるわけです。

個人的には、この発想はすごく気持ちいいです。
「別々の関数としてきれいに分ける」のではなく、「ハードウェアの都合に合わせてまとめる」。GPU最適化らしい、かなり腹の座った設計だと思います。

何が新しいのか: “自由すぎない”のが逆に強い

CODAの面白いところは、何でも自由に書ける言語ではないことです。むしろ逆で、​GEMM mainloop を固定して、その上に使える epilogue primitive を絞っています。

論文によると、用意されているのは主に次のような要素です。

この制約が重要です。
一見すると「自由度が低いなら不便では?」と思いますが、GPU kernel の世界ではむしろ逆で、​変に自由すぎると性能が落ちやすい。CODAは、​expert-written GEMMの性能構造を保ったまま、必要最低限の拡張だけを許す設計です。

これはソフトウェア設計としても面白いです。
高性能システムって、しばしば「なんでもできる」より「だいたい必要なことが、最も速くできる」ほうが強いんですよね。CODAはまさにその思想に見えます。

どこまで対応できるのか

論文の主張としては、CODAは 標準的なTransformer blockの非-attention計算のほぼ全部 をカバーできるとのことです。
つまり、Transformerの中でも、attentionそのもの以外の forward / backward のかなり広い範囲に使える、ということです。

image_0003.svg

ここはかなりインパクトがあります。
Transformer訓練の高速化というと、attention の改善ばかり注目されがちですが、実はこういう“周辺処理”をまとめて速くするだけでも、総合性能に効く可能性が高い。しかも training system 全体で見ると、こういう地味な改善が最後に効いてくることが多いです。

「1回1回は小さな最適化でも、積み重なると大きい」という、いかにも現場感のある話だと思います。

人間でもLLMでも書ける、というのが妙に今っぽい

論文のもう1つのポイントは、​human-authored と LLM-authored の両方の CODA kernels が高性能を出したと述べていることです。

これはかなり今っぽい話です。
つまり、CODA は「すごく難しい職人芸の kernel」を目指しただけではなく、​人間にも、LLMにも書きやすい抽象化になっている可能性がある。

ここは個人的にかなり重要だと思います。
GPU最適化は、従来は「書ける人が限られる」世界でした。もし高性能と生産性を両立できるなら、研究や実装の速度が一段上がるかもしれません。もちろん、実際の運用では検証や保守の壁もあるはずですが、それでも方向性としてはかなり魅力的です。

この論文の本質: 「計算を速くする」から「データ移動を減らす」へ

CODAが示しているのは、Transformer最適化の見方が変わってきた、ということだと思います。

昔は「とにかく演算を速くすればいい」が中心でした。
でも今は違う。GPUは賢くなった一方で、​メモリとのやり取りが相対的に重い。だから、性能を上げるには

という発想が大事になります。

image_0004.svg

CODAはその考えを、Transformer block に対してかなりきれいに形にしたもの、と言えそうです。

率直な感想

これはかなり良い研究だと思います。
理由は2つあります。

  1. 問題設定が現実的
    速いけど使いにくい、ではなく、実際のTransformer training system のボトルネックをちゃんと見ている。

  2. 抽象化がうまい
    ただの最適化テクニックではなく、GEMM epilogue という再利用しやすい形に落としている。

GPUの世界って、どうしても「超専門家だけが触れる職人領域」になりがちです。
でもこういう抽象化がうまくいくと、研究成果が実装に降りてきやすくなる。そこがすごく大事だと思います。

もちろん、実際の性能はワークロードや実装品質に大きく依存するので、「これで全部解決」とは言えません。ですが、​Transformerの遅さの原因を“演算不足”ではなく“データ移動”として捉え直している点は、かなり筋がいいです。

まとめ

CODAは、Transformerの周辺処理を「GEMMの後付け」ではなく、​GEMMと一体化した epilogue program として扱う提案です。
地味な処理をまとめて片づけることで、メモリ往復を減らし、GPUの強みをより素直に引き出そうとしている。派手さはないけれど、実務的にはかなり効きそうなアイデアだと感じました。


参考: CODA: Rewriting Transformer Blocks as GEMM-Epilogue Programs

同じ著者の記事