ニュースマクロTileLangで高性能GPUカーネルを設計する:Tensor Core GEMM、Fused Softmax、FlashAttention、自動チューニング

TileLangで高性能GPUカーネルを設計する:Tensor Core GEMM、Fused Softmax、FlashAttention、自動チューニング

著者: MarkTechPost·

重要ポイント

  • TileLangにより、開発者はPythonでタイルレベルの最適化されたGPUカーネルを作成でき、コンパイラがスレッドマッピング、メモリレイアウト、同期、CUDA命令生成を自動的に処理します。
  • チュートリアルでは、ベクトル加算、テンソルコア行列乗算、バイアス・GELU付きfused GEMMエピローグ、行方向softmax、FlashAttentionのカーネルを段階的に実装し、PyTorchベースラインに対して検証しています。
  • TileLangの自動チューニングデコレータは、タイルサイズ、パイプライン深さ、スレッド数にわたって検索を行い、最適なアーキテクチャ依存設定を自動的に特定します。これにより、理想パラメータがAmpereやHopperなどのGPU世代間で異なるという課題に対処します。
  • チュートリアルで実証されたカーネル融合技術は、バイアス加算やGELU活性化などの操作をレジスタ常駐アキュムレータ内で完了させてから最終出力を書き込むことで、中間のグローバルメモリトラフィックを削減します。
  • FlashAttentionの実装は、完全なアテンションスコア行列をメモリ上に実体化することなくクエリ、キー、バリュータイルを処理し、オンラインsoftmax更新を使用してメモリフットプリントを二次空間から線形空間に削減します。
  • 生成ソース検査、デバイス側印刷、組み込みプロファイラが一体となり、コンパイラが生成したテンソルコア操作、非同期コピー、同期バリアの可視性を開発者に提供し、デバッグと最適化を支援します。
TileLangで高性能GPUカーネルを設計する:Tensor Core GEMM、Fused Softmax、FlashAttention、自動チューニング

TileLangは、TVMを通じて高性能指向のGPUカーネルを設計・コンパイルするための高レベルPythonドメイン固有言語(DSL)です。大規模言語モデルやその他のトランスフォーマーアーキテクチャが計算要件を高める中、テンソルコア(NVIDIAの専用行列乗算アクセラレータ)を完全に活用するカスタムGPUカーネルを作成する能力は、トレーニングと推論の効率にとってますます重要になっています。しかし、こうしたカーネルの作成は伝統的にCUDA C++、ワープレベルプログラミング、ハードウェア固有のメモリ階層に関する深い専門知識を必要としてきました。TileLangは、開発者がタイルレベルで計算を表現し、低レベルの詳細をコンパイラに任せることでこのギャップを埋めます。本チュートリアルでは、TileLangの機能包括的な解説を提供し、環境検証と再利用可能なベンチマーク・数値検証ユーティリティの確立から始めます。そこから、ベクトル加算、タイル化されたテンソルコア行列乗算、スケジュール探索、fused GEMMエピローグ、行方向softmax、FlashAttentionを段階的に実装していきます。

チュートリアル全体を通じて、開発者はTileLangの共有メモリタイル、レジスタフラグメント、パイプライン化されたループ、並列反復プリミティブ、リダクション、テンソルコアGEMM演算子を直接操作します。コンパイラはスレッドマッピング、メモリレイアウト、同期、ベクトル化、低レベルCUDA命令生成を自動的に処理します。カーネルはPyTorchおよびcuBLASベースラインとベンチマーク比較され、生成されたCUDAソースの検査、メモリおよび計算スループットの評価、アーキテクチャ依存のカーネル設定を特定するための自動チューニングが行われます。TileLangはGitHubで利用可能です。

チュートリアルは、Google Colab CUDA環境の設定から始まり、TileLangをナイトリーフォールバック付きでインストールし、必要なPyTorchおよびTileLangモジュールをインポートします。カーネルレイテンシを測定し、相対誤差を使用して数値出力を比較するための再利用可能なベンチマーク、検証、レポートユーティリティが定義されます。その後、TileLangベクトル加算カーネルが実装され、GPU上で実行され、PyTorchの帯域幅と比較され、コンパイラが生成したCUDAソースが検査されます。

次に、タイル化されたテンソルコア行列乗算カーネルが実装され、入力タイルがグローバルメモリ、共有メモリ、レジスタフラグメントを通じて移動されます。タイル寸法、パイプラインステージ、スレッド数、L2スウィズリングは手動で制御され、TileLangはテンソルコア命令、同期、メモリ転送ロジックを生成します。複数のスケジュール設定がベンチマークされ、数値精度が検証され、最高性能のアーキテクチャ依存カーネル設定が特定されます。完全なチュートリアルコードはこちらで利用可能です。

行列乗算カーネルは、バイアス加算とGELU活性化関数をレジスタ常駐のアキュムレータに直接融合させることで拡張されます。このアプローチは、エピローグを完了してから最終出力テンソルを書き込むことで、中間のグローバルメモリトラフィックを削減します。このようなカーネル融合は、大規模なニューラルネットワークワークロードにおいてレイテンシを支配することが多いメモリ帯域幅のボトルネックを削減するための確立された技術です。融合実装はPyTorchのイーガー実行と比較されます。さらに、行方向のsoftmaxカーネルが、フラグメントレベルの最大値・合計リダクションを使用して実装され、正規化プロセスの大部分をレジスタ内に保持します。

融合FlashAttentionフォワードカーネルが実装され、完全なアテンションスコア行列をグローバルメモリに実体化することなく、クエリ、キー、バリュータイルを処理します。オンラインsoftmax更新が、実行中の最大値、正規化合計、再スケーリング係数、タイル化されたテンソルコア行列乗算を使用して適用されます。スタンフォード大学の研究者によって最初に導入されたFlashAttentionは、自己アテンションのメモリフットプリントを二次空間から線形空間に削減する広く採用されている技術となり、PyTorchのスケールドドットプロダクトアテンションAPIを含む主要なフレームワークに統合されています。因果的・非因果的アテンションの両方がPyTorchのスケールドドットプロダクトアテンションに対して検証され、レイテンシと計算スループットが比較されます。

自動チューニング検索空間が、行列タイルサイズ、Kブロック寸法、パイプライン深さ、スレッド数にわたって定義され、共有メモリ予算を超える設定はフィルタリングされます。TileLangの自動チューニングデコレータを使用して、同じ行列乗算ワークロードに対する複数のカーネルスケジュールがコンパイル、ベンチマーク、検証、キャッシュされます。選択されたカーネルが実行され、PyTorchに対して検証され、達成されたレイテンシとテンソルコアスループットが評価されます。この自動化された検索は、GPUカーネル開発における実用的な課題に対処します。最適なタイルサイズとパイプライン深さはAmpereやHopperなどのGPUアーキテクチャ間で異なり、複数のハードウェア世代をターゲットにする場合の手動チューニングは脆弱になります。

TileLangのデバッグおよびイントロスペクションワークフローが、デバイス側印刷、生成CUDA検査、組み込みのカーネルプロファイラを通じて紹介されます。テンソルコア操作、非同期コピー、同期バリア、行列ロード命令など、コンパイラが生成したランドマークが検査されます。すべてのチュートリアルセクションは、実行ステータスを記録し、タイミング情報を報告し、コンパクトなTileLangプログラミングリファレンスを出力するフォールトトレラントランナーにまとめられます。

このチュートリアルは、TileLangがタイルレベルのPythonプログラムを、スレッドインデックス、ワープレベルのデータレイアウト、テンソルコア命令、非同期メモリバリアの手動管理を必要とせずに最適化されたGPUカーネルに変換する方法を示しています。実装・検証されたカーネルは、帯域幅制約の要素ごと演算、計算集約型のGEMMワークロード、融合ニューラルネットワークエピローグ、レジスタ常駐リダクション、オンラインsoftmaxアテンションをカバーしています。この探索では、ブロック寸法、共有メモリ消費量、パイプライン深さ、スレッド数、タイル形状、L2スウィズリングが異なるGPUアーキテクチャ間でパフォーマンスにどう影響するかも示しています。生成ソース検査、デバイス側デバッグ、プロファイリング、自動化されたスケジュール検索が一体となって、カスタムTileLangカーネルの開発、検証、ベンチマーク、改良のための完全なワークフローを確立しています。