ニューラルネットワークのGPU利用最適化
新しいフレームワークが深層学習タスクのためのGPU性能を向上させる。
― 1 分で読む
目次
最近のグラフィックス処理ユニット(GPU)は、今の大事なタスクを速くするのに大きな役割を果たしてるよね。でも、深層強化学習のシミュレーションエンジンとか、ダイナミックニューラルネットワークみたいな新しいタイプのアプリケーションは、GPUをフルに活用できてないことが多いんだ。これは、こういうアプリが小さなタスク(カーネル)をたくさん持っていて、GPUを十分に動かせないからなんだ。一つ一つの小さなタスクが順番に実行されると、結構な計算能力を無駄にしてしまう。いい解決策は、独立したタスクを同時に実行することなんだけど、これは入力によってタスク間の依存関係が変わるから難しいんだよね。
私たちの研究では、ランタイムでタスク間の依存関係を簡単にチェックして、遅延なくスケジュールできるフレームワークを紹介します。主なアイデアは、一度に少数のタスクを見て、その依存関係をチェックするってこと。これは、現代のプロセッサが命令を扱う方法に似てるんだ。これにより、タスクの実行順が固定されてなくて、慎重なスケジュールが必要なアプリケーションでタスクを同時に実行できるようになるんだ。私たちは、ソフトウェアだけで動くものと、ソフトウェアとハードウェアのサポートを組み合わせて、CPUとGPU間の通信による遅延をさらに減らす2つのバージョンのフレームワークを作ったんだ。
私たちは、深層強化学習やさまざまなタイプのニューラルネットワークを使って、フレームワークをテストしたんだけど、結果は良好で、GPUをより良く活用しながら処理をかなり速くできることが分かったよ。
なぜいくつかのアプリケーションがGPUを活用できていないのか理解する
GPUは、深層ニューラルネットワークの処理、科学計算、グラフィックスレンダリング、暗号化などを加速するために頻繁に使われてるよね。GPUの並列能力のおかげで、大量のデータを迅速に処理できるんだ。でも、特に深層強化学習やダイナミックニューラルネットワークの分野において、GPUの能力を最大限に活用できていないアプリケーションもあるんだ。
その理由の一つは、こういうアプリが多くの小さなタスクに依存していて、GPUの処理能力を十分に引き出せてないからなんだ。私たちは、この問題を解決するために二つのアプリケーショングループを調べたよ。
深層強化学習シミュレーションエンジン
深層強化学習では、ロボットみたいなエージェントが環境と対話しながら、試行錯誤でタスクを完了する方法を学ぶんだ。エージェントをトレーニングするには、深層ニューラルネットワーク(DNN)を使って、シミュレーションされた環境から集めたデータに基づいて報酬を最大化する戦略を開発するんだ。
DNNはGPUの力を活用できるけど、深層強化学習のランタイムのかなりの部分はデータ収集に使われてて、それが時には全体の90%にもなるんだ。このフェーズでは、物理シミュレーションがトレーニングデータを生成してるんだけど、こういうシミュレーションはGPUを効率的に使ってなくて、平均してわずか30%のフルキャパシティしか達成してないんだ。この非効率は、シミュレーションの中の小さなカーネルがGPUのリソースを十分に活用できていないことから来てるから、大きなカーネルを作るのは実用的じゃないんだよね。
ダイナミックニューラルネットワーク
最近のダイナミックニューラルネットワークの進展は、限られた電力のデバイスで予測するのにかかる時間を短縮する可能性を示してるんだ。これらのネットワークは、受け取る入力に基づいて構造を調整できるんだ。例えば、あるモデルは入力された画像に基づいてリアルタイムでアーキテクチャを変更することができる。
私たちは、これらのダイナミックネットワークが浮動小数点演算を少なく使い、予測時間が短いにもかかわらず、GPUリソースを効果的に活用していないことを発見したんだ。平均的な占有率はたった39%だった。シミュレーションエンジンと同じように、この非効率もGPUコアを十分に活用できない小さなカーネルに起因するんだ。
両方のタイプのアプリケーションからのGPUカーネルは通常、シーケンシャルに実行されてて、つまり、GPUの能力は各カーネルのサイズとスレッド数によって制限されてるんだ。でも、こういうカーネルの多くは独立してるから、同時に実行することができる。独立したカーネルを同時に実行することで、GPUの活用を高めてパフォーマンスを向上させることができるんだ。
同時カーネル実行の課題
独立したカーネルを同時に実行するのはパフォーマンスを向上させるためのいい解決策だけど、いくつかの理由で実装は簡単じゃないんだ。
課題1: 入力依存の計算グラフ
多くのアプリケーションでは、カーネル間の依存関係は実行時に入力データに基づいて決まるんだ。つまり、どの入力やセットの入力も、実行する必要があるカーネルの異なる配置につながることがある。この場合、カーネル間の依存関係をチェックする必要があるけど、それは時間がかかるんだよね。多くのタスクは短い実行時間を持ってるから余計に。
既存のツールは依存関係を定義して、有向非循環グラフを作る手助けをしてくれるけど、これらのツールはアプリケーションの各実行のために依存関係グラフを準備するのにかなりの時間がかかることが多くて、全体の処理が遅くなっちゃう。
課題2: 不規則なカーネル間依存関係
もう一つの問題は、計算グラフが予測できないことだ。これが理由で、並列実行のために独立したグループに分けるのが難しいんだ。細かいスケジューリングがカーネル間の並列性を明らかにするために重要なんだけど、頻繁な同期が必要で、これがCPUとの通信によるかなりのオーバーヘッドを生むことになるんだ。
私たちの解決策: 新しいフレームワーク
これらの課題を克服するために、依存関係を追跡するのに最低限のオーバーヘッドで同時カーネルスケジューリングを自動化する新しいフレームワークを提案するよ。このフレームワークには、ソフトウェアだけで動作するものと、ハードウェアの能力を活用してオーバーヘッドをさらに減らすものの2つの実装があるんだ。
私たちのフレームワークの主な特徴
- フレームワークは、カーネルの依存関係をランタイムで限られたグループ内でチェックする。これは、順序を無視した命令スケジューリングに似た方法を使うんだ。
- カーネルがスケジューリングウィンドウに入ると、自動的にどのカーネルに依存しているかを特定する。カーネルが実行を終えたら、残りの依存関係がなければ、依存するカーネルを同時に実行できるんだ。
- アプリケーションが提供するアノテーションは、各カーネルが読み書きするメモリアドレス範囲を特定するのを助けて、これがランタイムでの依存関係チェックに使われるんだ。
ソフトウェアのみのアプローチ (-SW)
-SW実装は、既存のCUDAストリームを使って独立したカーネルを同時にスケジュールするランタイムシステムとして動作する。効率はいいけど、CPUとの通信で少しの同期オーバーヘッドが発生することがあるんだ。
ハードウェア-ソフトウェア協調アプローチ (-HW)
-HW実装は、ソフトウェアとハードウェアの要素を組み合わせてる。ハードウェアを使用してスケジューリングウィンドウを管理することで、CPUとの通信を大幅に減らすのを助けるんだ。このハードウェアモデルは、効率的に依存関係を追跡して、カーネルのスケジューリングと実行をスムーズにするんだ。
フレームワークの評価
私たちは、フレームワークをさまざまなアプリケーションでテストして、GPUの活用と全体的なパフォーマンスの改善を測定したんだ。
1. 深層強化学習シミュレーション
深層強化学習のためのいくつかの物理シミュレーション環境を調べたよ。Ant、Grasp、Humanoid、Cheetah、Walker2dなどがある。これらのシミュレーションは、何千もの実行からのデータを必要とするから、私たちはさまざまなモデルのパフォーマンスを観察したんだ。
結果は、私たちのフレームワークがGPUの活用を増やしてパフォーマンスを向上させ、基準となる方法と比べて最大4.5倍のスピードアップを達成できることを示してたよ。
2. ダイナミックニューラルネットワーク
次に、ダイナミックニューラルネットワークについて、InstaNAS、Dynamic Routing、Conditional Convolutionの3つの特定のワークロードを使ってフレームワークを評価したんだ。これらのモデルは、受け取る入力に基づいて調整されるように設計されてるから、テストにぴったりなんだ。
また、私たちのフレームワークも驚くべき結果を提供して、さまざまな繰り返しでの基準モデルに対して2倍から3倍のスピードアップを達成したよ。
3. 静的ニューラルネットワーク
静的ニューラルネットワークについては、固定構造を持つ人気のアーキテクチャをいくつかテストしたんだけど、私たちのフレームワークもパフォーマンスの改善をもたらして、従来の方法に対して約1.5倍から2倍のスピードアップを達成したんだ。
結論
結論として、私たちのフレームワークは、不規則な計算グラフを持つアプリケーションで独立したカーネルを同時に実行する課題に対する実用的な解決策を提供します。ランタイムで効率的なスケジューリングと依存関係チェックを可能にすることで、深層強化学習やダイナミックニューラルネットワークアプリケーションでのGPU活用と全体的なパフォーマンスを大幅に改善できるんだ。
この研究は、動的な入力条件に依存するタスクを管理するためのより良いアプローチの必要性を強調していて、将来の効率的なコンピューティングに向けた道を切り開いてるよ。私たちのソフトウェアのみとハードウェア-ソフトウェア協調の実装によって達成された結果は、実際のアプリケーションでの大幅なスピードアップの可能性を示してるんだ。この進展は、さまざまなアプリケーションのためのGPUリソースを最適化するための一歩だと言えるね。
タイトル: ACS: Concurrent Kernel Execution on Irregular, Input-Dependent Computational Graphs
概要: GPUs are widely used to accelerate many important classes of workloads today. However, we observe that several important emerging classes of workloads, including simulation engines for deep reinforcement learning and dynamic neural networks, are unable to fully utilize the massive parallelism that GPUs offer. These applications tend to have kernels that are small in size, i.e., have few thread blocks that do not saturate compute resources. Executing independent kernels concurrently is a promising approach to improve parallelism and utilization. However, this inter-kernel concurrency is difficult to leverage in such workloads with existing approaches: First, the inter-kernel dependencies and computational graph are input-dependent and vary each time the application is executed. Second, the computational graphs tend to be irregular, requiring fine-grain scheduling and synchronization; thus incurring significant synchronization overheads if kernel execution is parallelized. In this work, we propose ACS, a framework that enables lightweight detection of inter-kernel dependencies and low overhead kernel scheduling at runtime. The key idea behind ACS is to perform inter-kernel dependency checks for a small window of kernels at runtime, similar to out-of order instruction scheduling. This enables concurrent execution of kernels in applications whose computational graphs are input dependent and require fine-grained scheduling. We propose ACS-SW, a software-only open-source implementation of ACS and ACS-HW, a hardware-software cooperative implementation. ACS-HW further reduces synchronization overheads by reducing communication between the CPU and GPU. We evaluate ACS for deep RL simulation and dynamic DNNs on both real hardware and a GPU simulator. We demonstrate speedups of up to 2.19x (1.56x on average) by improving GPU utilization with concurrent kernel execution.
著者: Sankeerth Durvasula, Adrian Zhao, Raymond Kiguru, Yushi Guan, Zhonghan Chen, Nandita Vijaykumar
最終更新: 2024-01-22 00:00:00
言語: English
ソースURL: https://arxiv.org/abs/2401.12377
ソースPDF: https://arxiv.org/pdf/2401.12377
ライセンス: https://creativecommons.org/licenses/by/4.0/
変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。
オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。