概要
CUDAバックエンドの最適化によって、トレーニング速度が大幅に向上。 cudaEventやprefetchコール削減、cudaLaunchHostFuncの呼び出し最適化を実施。 prefetchの削除により、カーネル実行の遅延が解消し、さらなる高速化を実現。 今後はバッファキャッシュやカーネル最適化などが課題。 現状でPyTorchを超える性能を達成。
CUDAバックエンド最適化の経緯
- Event実装 をcuda::std::atomicから cudaEvent へ切り替え、トレーニング速度が 500 it/sから900 it/s に向上
- prefetchコール の削減で、速度が 900 it/sから1100 it/s へ
- Metalバックエンドでは、各op評価後に オペランドや一時変数 をカーネル終了まで保持
- コマンドバッファの必要時にcommitし、完了ハンドラで解放・エラーチェック
- CUDAではcudaLaunchHostFunc を用いて類似実装
- ただし、 20µs以上のストリーム遅延 が発生し、各カーネルが待たされる課題
- 対策として、 mx::eval_impl()完了時 までオペランド・一時変数を保持
- これにより cudaLaunchHostFuncの呼び出し回数を大幅削減
- 2カーネル間の遅延が 1µs未満 となり、PyTorch以上のパフォーマンス
- デメリットは 配列の解放遅延によるメモリ使用量増加
- MAX_ACTIVE_TASKSを超えるタスク時の待機も廃止
- この最適化で速度が 1100 it/sから1600 it/s へ
カーネル遅延の原因と解決
- 一部カーネルの 遅延共通点 は、実行前に cudaMemPrefetch API を呼んでいた点
- CUDAバックエンドは Unified Memory API を利用し、自動でデータ転送
- 明示的な cudaMemPrefetch でデバイス側に転送指示をしていた
- プロファイリングで prefetchがカーネル実行を大幅遅延 させていることを発見
- prefetch削除 により、速度が 1600 it/sから2100 it/s に向上
- プロファイラのタイムラインも大幅に改善
今後の最適化課題
- バッファキャッシュ の実装
- 主要opの実装とサードパーティライブラリ統合後に着手予定
- 残る課題は主に カーネル最適化 と CPUコードの高速化
- すべてのop実装完了後に本格対応予定
まとめ
- CUDAバックエンドの最適化により、 PyTorchを超える性能 を実現
- 今後は バッファキャッシュ・カーネル最適化・CPU高速化 が焦点
- 継続的なプロファイリングとボトルネック解消が重要