Transformerと聞くと、みんなまず attention を思い浮かべると思います。実際、巨大なモデルの心臓部です。でもこの論文が面白いのは、本丸そのものより“周辺の地味な処理”が意外と重いと指摘している点です。
Transformer training systems は、大きな行列同士を掛ける dense linear algebra を中心に作られています。ここで主役になるのが GEMM です。GEMM は General Matrix-Matrix Multiplication の略で、要するに「行列の掛け算」。GPUはこれがめちゃくちゃ得意です。
ただし現実のTransformerは、GEMMだけで終わりません。
その前後に、次のような処理が何度も入ります。
これらは1つ1つ見ると地味ですが、中間結果をいったんメモリに書いて、また読み直すことが多い。しかも計算そのものは軽い。
つまり、「計算」より「データ移動」がボトルネックになるわけです。ここ、かなり本質的です。GPUの世界では、演算器を速くするだけでは勝てない。メモリ往復が遅いと全部台無しになるんですよね。
そこで登場するのが CODA です。論文タイトルは
“Rewriting Transformer Blocks as GEMM-Epilogue Programs”。
直訳すると、「Transformer blockをGEMM epilogueプログラムとして書き換える」。
ここでの epilogue は、GEMMの最後に付く“おまけ処理”のことです。
たとえば、行列積の結果にスケールを掛けたり、別の値を足したり、簡単な変換をしたりする部分です。
CODAの考え方はかなり素直で、でも鋭いです。
「なら、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 のかなり広い範囲に使える、ということです。
ここはかなりインパクトがあります。
Transformer訓練の高速化というと、attention の改善ばかり注目されがちですが、実はこういう“周辺処理”をまとめて速くするだけでも、総合性能に効く可能性が高い。しかも training system 全体で見ると、こういう地味な改善が最後に効いてくることが多いです。
「1回1回は小さな最適化でも、積み重なると大きい」という、いかにも現場感のある話だと思います。
論文のもう1つのポイントは、human-authored と LLM-authored の両方の CODA kernels が高性能を出したと述べていることです。
これはかなり今っぽい話です。
つまり、CODA は「すごく難しい職人芸の kernel」を目指しただけではなく、人間にも、LLMにも書きやすい抽象化になっている可能性がある。
ここは個人的にかなり重要だと思います。
GPU最適化は、従来は「書ける人が限られる」世界でした。もし高性能と生産性を両立できるなら、研究や実装の速度が一段上がるかもしれません。もちろん、実際の運用では検証や保守の壁もあるはずですが、それでも方向性としてはかなり魅力的です。
CODAが示しているのは、Transformer最適化の見方が変わってきた、ということだと思います。
昔は「とにかく演算を速くすればいい」が中心でした。
でも今は違う。GPUは賢くなった一方で、メモリとのやり取りが相対的に重い。だから、性能を上げるには
という発想が大事になります。
CODAはその考えを、Transformer block に対してかなりきれいに形にしたもの、と言えそうです。
これはかなり良い研究だと思います。
理由は2つあります。
問題設定が現実的
速いけど使いにくい、ではなく、実際のTransformer training system のボトルネックをちゃんと見ている。
抽象化がうまい
ただの最適化テクニックではなく、GEMM epilogue という再利用しやすい形に落としている。
GPUの世界って、どうしても「超専門家だけが触れる職人領域」になりがちです。
でもこういう抽象化がうまくいくと、研究成果が実装に降りてきやすくなる。そこがすごく大事だと思います。
もちろん、実際の性能はワークロードや実装品質に大きく依存するので、「これで全部解決」とは言えません。ですが、Transformerの遅さの原因を“演算不足”ではなく“データ移動”として捉え直している点は、かなり筋がいいです。
CODAは、Transformerの周辺処理を「GEMMの後付け」ではなく、GEMMと一体化した epilogue program として扱う提案です。
地味な処理をまとめて片づけることで、メモリ往復を減らし、GPUの強みをより素直に引き出そうとしている。派手さはないけれど、実務的にはかなり効きそうなアイデアだと感じました。
参考: CODA: Rewriting Transformer Blocks as GEMM-Epilogue Programs