Muse Spark Openが超高速ブレークスルー:シングルリクエストで1000 tokens/s超を達成

Muse Spark Openが超高速ブレークスルー:シングルリクエストで1000 tokens/s超を達成

SGLangとMLインフラは、より大規模なGPUカーネルであるメガカーネルへの移行を進めている。本稿では、CUDA C++とPTXをゼロから用いてMuse Spark Open向けにメガカーネルを構築し、Blackwell GPUにおけるシングルリクエストのデコード速度を517 tok/sから1109 tok/sへと向上させた取り組みを紹介する。

シングルリクエストのデコードtokens per second:ベースライン517、メガカーネル1,109、2.1倍の高速化

Muse Spark Openは従来型のMoE構造を採用しており、各トークンは256個のエキスパートのうち8個にルーティングされる。エキスパートの重みは4ビットNVFP4形式で保存され、62個のデコード層を持つ。

メガカーネルとは何か?

通常のGPUカーネルは単一の演算のみを実行するため、サービスエンジンは1回のデコードステップを完了するために約1450個のカーネルを発行する必要がある。十分に最適化されていない場合、カーネル間でGPUがアイドル状態になる。メガカーネルでは、単一のカーネルがすべてのSM(ストリーミングマルチプロセッサ)に常駐し、複数の処理を同時に実行することで、テンソルコア・TMA・NVLinkなどのエンジンを全速で稼働させ続ける。

CPUがバッチジョブから多重プログラミング、オペレーティングシステムへと進化したように、GPUも1操作あたり1カーネルからメガカーネルへと移行した

モデルと新たなテンソル並列処理

モデルは8枚のGPU上でTP8として分割される。従来のTPでは2つのMoE GEMM間でall-reduceを1回のみ行うが、新方式ではN次元で2つのGEMMを分割し、fp4 all-gatherとbf16 all-gatherを導入する。通信ステップは1つ増えるものの、全体的な通信量は低減され、スケーラビリティが向上する。

6ステップからなる1つのデコーダー層。他のGPUを待つ5か所の同期ポイントがあり、エキスパートのステップはルーターが実行されてから初めて確定する8枚のGPU間のエキスパートGEMM:従来のTPはGEMM 1をN方向、GEMM 2をK方向に分割して最後にbf16 all-reduceを行う。新方式は両方をN方向に分割し、GEMM 1の後にfp4 all-gather、GEMM 2の後にbf16 all-gatherを行う

メガカーネルの実装

各層に対してカーネルを1回だけ発行し、現在の層のアテンションから次の層のQKV投影とKV書き込みまでをカバーする。各カーネルは144個のSMに12個のワープを配置し、異なるワープがKVロード・重みプリフェッチ・テンソルコア計算・SwiGLU・all-gather/reduceをそれぞれ担当する。

受信バッファの4スロット:ストア前はすべて空。2つの値が到着しリーダーはポーリングを継続。4つすべてが到着しリーダーが処理を開始

パフォーマンスと投機的デコード

1ステップのデコード時間は12.9ミリ秒から5.9ミリ秒へと短縮され、カーネル数は1450個から97個へと削減された。DFlash V2ドラフトモデルと組み合わせることで、1ステップあたり16トークンを検証し、平均6.6トークンが受理され、1109 tok/sを達成した。

1デコードステップ:ベースラインは12.9ミリ秒(ドラフト1.16、検証10.9)でカーネル数1450。メガカーネルは5.9ミリ秒(ドラフト0.44、検証5.3)でカーネル数97

メガカーネル内部の最適化

重みの完全キャッシュプリフェッチ、命令キャッシュ管理、多段階同期(共有メモリのmbarrier、HBMフラグ、NVLinkによるダイレクトストア)、フェンスレスデータ同期を組み合わせることで、ほぼ完全な処理のオーバーラップを実現している。

プリフェッチされた重みが待機できる3か所:現在の演算実行中に共有メモリのリングバッファへ直接投入、スペキュラティブにプリフェッチされたエキスパートのようにL2に待機、またはその両方でL2からHBMの代わりにリングを補充連続して実行される2つのコードブロック:20 KB+100 KBはSMの命令キャッシュ約128 KBに収まり、100 KBブロックは単独時の12.4μsで実行。100 KB+100 KBは収まらず、毎パス19.5μsを要するスレッドが同期する場所:同一SM内の2つのワープは共有メモリ上のmbarrierで待機。1つのGPU上の2つのSMのワープはHBM上のフラグでポーリング。別のGPUのワープがNVLink経由でこのGPUのHBMに直接ストアし、リーダーがデータをポーリングフェンスレスデータ同期:重みストリームが転送中の場合、フラグ前のフェンスに3.6〜4.0μsを要する。データ自体がフラグを兼ねる場合、リーダーはデータ到着と同時に処理を開始できる

今後の展望

今後はより大きなバッチサイズへの対応を進めるとともに、GPUオペレーティングシステムの方向へと発展させていく予定である。