Open yukarinoki opened 1 year ago
論文"Nimble: Lightweight and Parallel GPU Task Scheduling for Deep Learning"は、ディープラーニング(DL)のフレームワークがGPUを最大限に活用することにより、DLの推論と学習の速度を向上させることを目指しています。現状では、既存のDLフレームワークのGPUタスクスケジューリングには大きなオーバーヘッドが存在し、不必要なシリアル実行が発生していることが問題となっています。
この問題を解決するため、著者らは"Nimble"というDL実行エンジンを提案しています。Nimbleは「ahead-of-time (AoT) scheduling」という新たな技術を導入しています。この技術により、GPUカーネルの実行前にスケジューリング手順が完了するため、ランタイム中のスケジューリングオーバーヘッドがほとんど排除されます。
GPUがタスクを処理する前に、DLフレームワークは一連の準備ステップ(GPUタスクスケジューリング)を経て、タスクをGPUに提出(GPUタスク送信)しなければなりません。現在のDLフレームワークでは、実行時にGPUタスクスケジューリングを行っていることに注意が必要です。
idle time アイドル時間が60%を超えるのが普通らしい、そんなことあるかな? どうやって計測したんだろうか?
Latency ResNet50が通常が9msでcで書いたやつが、3msぐらい(2.37倍らしい) 多分V100、PyTorchでの結果らしい。TensorRTでもそんぐらいかな? あとちょっと早いなという印象がある。
実行とスケジュールの時間にGapがあるらしい
事前実行をしてトレースを取ることで、スケジューラに必要な情報を取得する。
実行トレースと一緒に、Nimbleの事前に時間を計算する(AoT)スケジューラーは、プレ実行のために割り当てられたメモリを予約し、それらをタスクスケジュールにパックします
Setting PyTorch as the baseline, Nimble’s inference speed outperforms PyTorch by up to 22.3 times, and TensorRT by up to 2.8 times.
でスケジュールを実現(まあ、できそうだな)
GPUタスクの情報をキャプチャするためにCUDA Stream Capture APIを使用します。その後、我々はキャプチャした情報からCUDA Graph [21](つまり、Nimbleにおける実行トレース表現)をインスタンス化します。ランタイムでは、新しい入力テンソルに対するリクエストがあるとき、Nimbleはスケジューリングオーバーヘッドを避けつつ、タスクスケジュールに基づいて記録されたGPUタスクを再生してニューラルネットワークを実行します。私たちはCUDA Graph Launch APIを使用してニューラルネットワークを実行します。このAPIは、CUDA Graph内の情報に基づいてGPUタスクを提出します。
ブログもあるよ https://medium.com/friendliai/nimble-lightweight-and-parallel-gpu-task-scheduling-for-deep-learning-b10ff1e7b0b