
2026/06/16 0:49
Show HN:Nvidia CUDA パソコン向け連続サンプリングプロファイラー
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
NVIDIA は、Volta アーキテクチャの GPU におけるプログラムカウンター(PC)サンプリングによる微細なパフォーマンス分析を可能にし、CUDA Profiling Tools Interface (CUPTI) に重要な機能を追加しました。Maxwell の単純な API を基盤とし、Volta は専用ワープごとのハードウェアサンプリングメカニズムを追加し、2^SAMPLING_FACTOR GPU クロックサイクル(係数 5〜31)ごとの間隔で PC オフセットと停滞理由「バケット」を記録します。この低オーバーヘッドアプローチは、生データとしてのサンプリング速度を 2k サンプル/秒以上達成でき、実際の収集量はワークロードに依存します。该系统では、コールスタックやタイムスタンプなどの重いメタデータを生サンプルから除外し、プロダクション利用を最適化しています。捕捉される停滞理由には、長尺のスコアボードメモリエイラウンシー、共有メモリの停滞、機能ユニットキューイング、同期バリア、メモリフェンスが含まれます。収集モードは 2 つあり、「continuous」モードは低オーバーヘッドですが、積極的なスケジュールリングによりカーネル帰属が困難になり、「kernel-serialized」モードはパフォーマンスコストの支払い代わり、精度の高いカーネル起動の帰属を可能にします。プロダクションでのオーバーヘッドを削減するために、新しい動的アルゴリズムは PC データを短い間隔(〜50ms)でサンプリングし、デフォルトでは約 100 つの pc/停滞理由ペア/秒を目指します。統合は、Kubernetes 向けオープンソースのパルカエージェントの v0.48.0 リリースを通じて利用可能であり(今日から 14 日間の無料トライアル付き)、データを Polar Signals または MCP サポートを持つ LLM モデルなどのバックエンド分析プラットフォームに送信します。エージェントは USDT プロブ上で BPF プログラムをインストールし、最近のカーネル起動を ID を通じて相関させるためキャッシュし、シンボライズのために cubins を debuginfo サービスにアップロードします。ユーザーは nvcc コマンドに
-lineinfo フラグを含める必要があり(ソースレベル分析が必要な場合は DWARF 情報も含める)、cubins のアセンブリーを実現するためです。この進歩は、システム安定性を損なわずに複雑な GPU ボトルネックを診断することを可能にする決定的な一歩を表しています。本文
CUA プログファイリング ツールインタフェース(CUPTI)による PC サンプリング機能の活用
CUA プログファイリング ツールインタフェース(CUPTI)のもっとも強力な機能の一つに、プログラムカウンター(PC)サンプリングのサポートがあります。この機能により、CUDA アプリケーションの開発者は、コードがどこで時間を消費しているのかを指令レベルまで可視化できます。
我々は低オーバーヘッドの連続プロファイラからの PC サンプルデータをバックエンドへ送信し、以下の機能を实装しました。
- Polar Signals UI 上での分析
- MCP サポートを活用した LLM モデルによる解析
PC サンプリングは従来、NVIDIA NSight や Triton の Proton プロファイラーといった開発者向けのワークフローで使用されてきましたが、我々のオーバーヘッド最小化のアプローチにより、実際にプロダクション環境でも活用可能となりました。
まずはオープンソースのパファエージェントの [v0.48.0 リリース版] で本機能をご利用いただけます。Kubernetes 上での試し方については別途ブログ記事もご参照ください。
PC サンプリングの仕組みと特徴
ハードウェア構成
- 導入アーキテクチャ: Maxwell から導入され、当初は CUPTI アクティビティ API に乗っかって提供されていました。Volta アーキテクチャ以降は専用の PC サンプリング APIが新設されました。
- 動作原理: ワープ単位での専用ハードウェアを使用し、サンプリングティックごとに各ワープの状態を記録します。
- サンプリング間隔:
のべき乗で表現されたサンプリング係数に基づき、ハードウェア側が2
クロックサイクルごとにサンプルを行います。$2^{\text{SAMPLING\_FACTOR}}$- サンプル係数の範囲:5 から 31 に制約されています(例:$2^5=32$ サイクルごと 〜 $2^{31}$周期ごと)。
- サンプリング頻度: 毎秒数千万回から毎秒一回程度まで、幅広い範囲をカバーします。
- デフォルト設定: 我々の目的においてサンプリング係数は 20 をデフォルトとしています(構成可能です)。
- スループット: ハードウェア固有のスループットは1 秒あたり 2,000 サンプル以上。
データ収集の効率性
サンプルが取得されるたびに「バケット」のカウンターを単に増やすため、以下のような軽量な設計になっています。
- 記録内容: コールスタックやタイムスタンプを記録せず、PC オフセットと待機理由のペアのみを扱います。
- データフロー: 情報はハードウェア内で収集され、定期的なフラッシュでソフトウェアバッファへ転送されます(下位処理は CUPTI とドライバーが担当)。
- バッファサイズは設定可能です。
主な待機理由
PC/待機理由の情報はハードウェア内で収集されます。GPU における主な待機理由は以下の通りです。
- 長スクリーンボード: メモリ遅延によるロード待機。
- 短スクリーンボード: 共有メモリまたは専用機能ユニットの結果待ちによるレイテンシ。
- キューイング: 忙しく機能ユニットが空くまで待つ。
- 同期処理: シンクバリアやメモリーフェンスなど。
Polar Signals プロファイラでは、これらの待機理由の解釈を容易にするため、簡単な解説と NVIDIA のドキュメントへのリンクを付与して提供しています。
運用モード:連続モード vs コアネルシリアル化モード
モードの違い
PC サンプリングは以下の 2 つのモードで実行できます。
- 連続モード:
- 自然な動作ですが、サンプルを特定のコアネル起動に紐付けることが不可能です。
- 理由: GPU は並列処理を行うため、異なるコアネル起動同士が同一の CUDA バイナリ(cubin)を共有し、同一の PC/待機理由ペアに寄与する可能性があるため。
- コアネルシリアル化モード:
- 推奨モード。推測を排除するため採用しています。
- 性能低下は避けられない点ですが、プロダクション用プロファイラーとしての信頼性を担保します。
デフォルトの目標設定
我々は動的なアルゴリズムを実装し、一定期間(約 50ms)ごとに PC サンプリングを短時間活性化・停止させることでオーバーヘッドを低減しています。
- 目標データ量: デフォルトでは毎秒 100 ペア(PC/待機理由ペア)。
- 実運用上の振る舞い:
- シンプルな GPU ワークロード: インターバル間の時間が短い。
- 激しい PyTorch 学習ワークロード: 数秒もの間隔が生じることもあります。
データ収集と処理フロー
データ転送方法
ハードウェアからシムライブラリへのデータ取り出しは完了し、次にネットワーク経由で収集サービスへ返送する方法を採用しました。
- 技術: 既存の仕組みを再利用し、USDTプローブを活用。
- エージェント: シムライバリのフックを設定し、すべての有用データを抽出します。
追加された新しいプローブ
PC サンプリングサポート用のプローブは以下の通りです。
| プローブ名 | 説明 |
|---|---|
| PC サンプルのバッチデータ |
| 待機理由マップ(待機インデックスをデコード用) |
| ロードされた cubin バイト数(PC オフセットのソース再変換用) |
| GPU 設定情報(サンプルを時間に変換用) |
注意点:
pc_sample_batch 単体では意味を持ちません。待機理由マップ、ロードされた cubin バイト数、GPU 設定情報との組み合わせが必要です。これらの情報は起動時や cubin ロード時のワンショットイベントであり、シムライブラリとエージェント間の同期は行いません。
コアネル起動のキャッシュ活用
エージェントは BPF プログラムをインストールし、イベントストリームを BPF リングバッファへ供給します。ここでは以下の技術を活用しています。
- コアネル起動のキャッシュ:
- PC サンプルは事後に相関 ID のみタグ付けされます。
- エージェントは直近のコアネル起動をキャッシュし、各サンプルバッチをそのアプリケーションスタックと照合します。
- これにより、PC と待機理由を「ラベル」として追加し、グループ化やフィルタリングが可能になります。
データ転送の効率化
- Apache Arrow レコードへパッキング: 効率的なサーバー転送のため、サンプルは Arrow レコード形式に変換されます。
- 重複排除なし: データが既にカウントとして報告されているため、重複除外を行う必要がありません。エージェントとバックエンドは到着するたびに単にバケットを足し合わせればよいだけです。
シンボライゼーション(ソースコードへのマッピング)
プロファイリング対象プロセス内部でのサイクル燃費を避けるため、以下の構成で動作します。
- エージェントは各 cubin をデバッグ情報サービスへアップロード。
- バックエンド側でシンボライゼーションを実行。
- cubin には標準的な DWARF デバッグ情報が搭載されていないため、独自にアドレス対ソーステーブルを構築します(cubin の解凍とディスアッセンブルを含む)。
重要:
nvcc コマンドラインに -lineinfo フラグを含めることで、PC オフセットを関数・ファイル・行への変換が可能になります。
まとめ
PC サンプリングは従来、オーバーヘッドの問題から開発ツール(NSight, Proton)に限定されていましたが、以下の工夫によりプロダクション環境での継続稼働が可能になりました。
- サンプルのサンプリング
- 遅結合エージェントでもコンテキストを欠かさずに動作するためのメタデータの再生
- シンボライゼーションをバックエンドへシフトさせること
その結果、コアネルスタックや Polar Signals 連続プロファイラから得られるタイミング情報に加え、なぜワープが待機したかといった指令レベルの GPU 洞察を手にできるようになりました。
無料で14 日間のトライアルを開始できますので、今日からお試しください。Kubernetes をご利用のお客様は、ワークロードを変更せずに数分以内に開始する方法をご紹介しています。