PyTorch:torch.compileがカーネルフュージョンにより最大10倍の高速化を実現する仕組み
PyTorchコンパイラのtorch.compileは、カーネルフュージョンによってグローバルメモリへの冗長な書き込みを排除することでGPU上で最大10倍の高速化を実現します。各演算に個別のGPUカーネルを使用する代わりに、Inductorコンパイラはプロセッサのレジスタに中間値を保持する単一カーネルに依存関係のある演算を自動的にマージします。
この記事はAIにより一次情報源から生成されました。
PyTorchのコンパイラtorch.compileはモデルコードを1行も変更せずに最大10倍の高速化を実現します。
GPUメモリがモデルのトレーニングを遅くする理由
GPUカーネルの実行には固定のオーバーヘッドが伴います。フュージョンなしで3つの連続したポイントワイズ演算を行うには8つのテンソルI/O操作が必要です。カーネルフュージョン後は4つの操作で済み、メモリトラフィックを50%削減できます。
torch.compileが自動的にカーネルをマージする仕組み
Inductorコンパイラは以下を適用します:
- 垂直フュージョン:依存演算をマージし、中間値をGPUレジスタに保持
- ポイントワイズフュージョン:
multiply → add → sigmoidを1つのTritonカーネルに - リダクションフュージョン:バッチ正規化向け
- GEMM + エピローグフュージョン:行列乗算の終わりに直接バイアスと活性化関数を適用
- 水平フュージョン:独立した演算を並列実行
実際のカーネルで起こること
Tritonカーネルは中間値をGPUレジスタに保持し、最後にのみ結果を書き込みます。カーネルはtriton_poi_fused_*およびtriton_per_fused_*という名前です。
結果と適用
実際のモデルで最大10倍の高速化。必要なのは以下の1行だけです:
model = torch.compile(model) よくある質問
- torch.compileはどのように自動的にカーネルをマージしますか?
- Inductorコンパイラは垂直フュージョン(依存演算のマージ、中間値をGPUレジスタに保持)、ポイントワイズフュージョン、リダクションフュージョン、GEMMとエピローグのフュージョン、水平フュージョンを適用します。
- 実際のモデルでどのような高速化が得られますか?
- 実際のモデルで最大10倍の高速化が得られます。model = torch.compile(model)の1行で十分です。
📬 AIニュースをあなたの受信箱へ
毎日のダイジェストを自分仕様に——トピック、ソース、頻度を選べます。ワンクリックで解除。