rag-perf について
rag-perf は、デプロイ済みの NVIDIA RAG Blueprint サーバーをベンチマークする YAML 設定型のコマンドラインスキルです。ステージ別プロファイリングと任意の aiperf 負荷テストを組み合わせ、性能調整や回帰確認に使える統合レポートを作成します。
主な機能
- 01ステージ別の時間計測とボトルネック分析
- 02引用品質レポート
- 03任意の aiperf 負荷テスト
- 04YAML による同時実行数・パラメーターのスイープ
- 05統合レポートと結果ファイル
活用シーン
- 01検索とリランカーの設定比較
- 02単一負荷レベルでの性能回帰確認
- 03同時実行数スイープでのスループット測定
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ promptingcompany/ nv-skills --skill rag-perfインストール後、Claude Code で/rag-perfを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
BENCHMARK.mdskill-card.mdskill.oms.sigeval/h100.jsonnvidia_hosted.jsonreferences/config-schema.mdoutput-and-analysis.mdsynthetic-generation.md詳細
RAG-Perf — 設定駆動型パフォーマンスベンチマーク CLI
目的
YAML 設定でデプロイ済みの NVIDIA RAG Blueprint サーバーを操作し、サーバー側のプロファイリング実行(ステージごとの時間、引用の品質、ボトルネックの推定)と、任意のaiperf 負荷テスト(TTFT/E2E/トークンおよびリクエストのスループット/エラー率)を実行して、統合レポートを出力します。CLI は意図的に最小限に設計されており、rag-perf -c <config> と --help/--version のみを使用します。動作は完全に設定駆動型で、フィールドの違いは YAML で指定します。
対象範囲
- 回答品質の正確性/RAGASスコアリング → rag-eval スキルを使用してください。
- サービスのデプロイ、修復、設定(compose、helm、NIM 環境変数) → rag-blueprint スキルを使用してください。
- 本番環境の監視/アラート — rag-perf は一度だけ実行するベンチマークツールです。
- 実行時の要件: ネットワーク経由でアクセス可能な、デプロイ済みの RAG サーバーが必要です。
前提条件
- リポジトリをクローンし、リポジトリのルートからコマンドを実行してください(プリセット内の設定パスはリポジトリのルートを基準としています)。
- Python 3.11+ および uv が PATH 上にあること。
- rag-perf を専用の uv 管理仮想環境にインストールします:
uv sync --project scripts/rag-perf。 - 単体テストを実行するには、開発用エクストラもインストールします:
uv sync --project scripts/rag-perf --extra dev(そうしないとpytest-asyncioが見つからず、非同期テストが収集時にエラーになります)。 - アクセス可能な RAG サーバー(デフォルトは
http://localhost:8081)。aiperf のフェーズでは、同梱のnvidia_ragエンドポイントプラグインがインストールされている必要があります —pip install -e ./scripts/rag-perfにより、aiperf.pluginsエントリーポイントを通じて登録されます。 - 合成クエリの場合:
synthetic.llm_url(デフォルトはhttp://localhost:8999/v1/chat/completions)でアクセス可能な、OpenAI 互換のチャット補完エンドポイントが必要です。 - rag-perf 自体の実行に
NVIDIA_API_KEYは不要です(rag-eval とは異なります)。合成 LLM エンドポイントでは独自の認証が必要な場合がありますが、それはデプロイ環境側の要件です。
手順
-
プリセットを選択します。
scripts/rag-perf/configs/にある3つのプリセットは次のとおりです。quick_profile.yaml— プロファイルのみ、約30秒です。負荷テストはスキップします。検索やリランカーのチューニングをすばやく反復する場合に適しています。single_run.yaml— 並行数は1段階で、プロファイリングと aiperf を実行し、約2分かかります。リグレッションチェック向けです。sweep.yaml— 複数の軸を対象にスイープします。load.concurrency、rag.vdb_top_k、rag.reranker_top_kはすべてint | list[int]です。いずれかをリストにすると、スイープ軸になります(直積)。
-
プリセットを編集します。 必須:
rag.collection_names: ["<collection_name>"]を、デプロイ済みのインジェスターサーバーにある実際のコレクション名に置き換えます。インジェスターのGET /v1/collectionsでコレクションが存在することを確認してください。プレースホルダーの<collection_name>は検証を通過しますが、リクエストはすべて検索時に失敗します。バリエーションを試すときは、YAML プリセットをコピーして使用してください。CLI は意図的に設定ファイルのみを受け付けます。 -
実行します。 リポジトリのルートから実行します。
uv run --project scripts/rag-perf rag-perf -c scripts/rag-perf/configs/single_run.yaml他のプリセットも同じ形式で実行します。CLI が受け付けるのは
-c / --config(必須)、--help、--versionのみです。 -
標準出力を確認します。 実行のたびに、次の内容が順に出力されます。起動バナー、1行の概要、完全に解決された YAML 形式の設定(端末の出力から実行を再現できます)、コピーペースト可能な形式の shlex 結合済み aiperf コマンドを含むグリッドポイントごとの進捗、ポイントごとの詳細なサマリーテーブル(ステージ別内訳を棒グラフで表示し、引用品質、ボトルネック、負荷テストのブロックを含む)、最後に変化した軸に応じて自動でラベル付けされた並列比較テーブル。詳しくは
references/output-and-analysis.mdを参照してください。 -
成果物を確認します。 ディレクトリ構成は実行形式によって異なります。1ポイントで
iterations=1の場合はフラットになり、それ以外の場合はiter_<i>/<point>/...の下にネストされます。ディレクトリツリー全体、ファイルの用途、results.json/results.csv/report.mdの解析方法については、references/output-and-analysis.mdを参照してください。 -
ユーザー向けに要約します。 結果を報告するときは、
references/output-and-analysis.md#summarising-results-to-the-userの手順に従ってください。実行形式に合った標準結果ファイルを選び、見出し用のテーブル(並行数 × top-k 軸 × TTFT × スループット × ボトルネック × 引用品質)を作成し、スイープではスケーリング効率を算出してください。引用が0件、エラー率が0以外、llm_ttft_msが疑わしい値、p99 のサンプル数が少ない場合は、必ず明記し、次の実験に使う具体的な YAML を提案してください。 -
チューニングします。 スキーマの詳細は
docs/performance-benchmarking.mdと、以下の詳細リファレンスに記載されています。よく使う設定は、プロファイルのみのモードにするaiperf.enabled: false、ばらつきの推定精度を高めるload.iterationsの増加、一晩かけて直積スイープを行うためのload.sleep_between_points_s: 60です。
例
プロファイルのみ(検索やリランカーのチューニングに最も早く手応えを得られます):
uv run --project scripts/rag-perf rag-perf -c scripts/rag-perf/configs/quick_profile.yaml
出力:rag-perf-results/quick_profile/run_<ts>/{profile_report.md, profile_results.json, profiling/}。aiperf.enabled: false のため、aiperf_rag_on/ ディレクトリは作成されません。ファイル名が profile_* なのもこの設定によるものです。
完全なレポートを含む単一のベンチマークポイント:
uv run --project scripts/rag-perf rag-perf -c scripts/rag-perf/configs/single_run.yaml
出力:フラットな run_<ts>/{report.md, results.json, results.csv, profiling/, aiperf_rag_on/}。
並行数のスイープ:
uv run --project scripts/rag-perf rag-perf -c scripts/rag-perf/configs/sweep.yaml
出力:ポイントごとに run_<ts>/iter_1/<CR:_VDB-K:_RERANKER-K:_…>/{profiling,aiperf_rag_on}/ の下にネストされます。さらに、実行ルートに集計済みの report.md / results.json / results.csv が作成されます。
ユニットテストを実行します:
uv sync --project scripts/rag-perf --extra dev # one-time, installs pytest-asyncio
uv run --project scripts/rag-perf python -m pytest tests/unit/test_rag_perf/
制限事項
- CLI は設定専用です。パラメーターを変更するには、YAML を作成またはコピーしてください。
load.concurrency/rag.vdb_top_k/rag.reranker_top_kはint | list[int]を受け付けます。各値は一意のポイントディレクトリを示すため、バリデーターはリスト内の値が一意であることを要求します。input.fileとinput.syntheticには XOR ルールが適用されます。両方を設定すると検証に失敗します。どちらも設定されていない場合、syntheticにデフォルト値が自動入力されるため、空の設定でも検証に通ります。- ファイル入力の形式は拡張子のみから推測されます(
.jsonlまたは.csv)。それ以外の拡張子は拒否されます。 - 合成データの生成では、各クエリの完了時にディスクへ書き込みます(障害に強い設計です)が、最初の LLM エラーで即時に失敗します。部分的な JSONL は保持されます。エンドポイントを修正して再実行してください。
- 推論モデル(Nemotron Omni、Qwen-Reasoning)では
synthetic.disable_thinking: true(デフォルト)が必要です。これを設定しないと、モデルは chain-of-thought でトークン予算を使い果たし、contentが空になります。現在は、回答の代わりにreasoning_contentを使用するのではなく、生成器が明確なメッセージを表示してエラーを発生させます。 - YAML で設定できない aiperf 固有のオプション(リクエストレートの分布、GPU テレメトリー設定など)を変更するには、
scripts/rag-perf/rag_perf/runner.pyのAiperfRunner._base_aiperf_cmdを編集する必要があります。 - 詳細な手順は、このファイルを簡潔に保つため
references/に記載されています。
トラブルシューティング
| エラー/通知 | 可能性の高い原因 | 対処方法 |
|---|---|---|
Configuration errors in <yaml>: • input — ... XOR rule | input.file と input.synthetic の両方が設定されている | どちらか一方を選んでください。XOR バリデーターは YAML の読み込み時に実行されます。 |
input.file must end in .jsonl or .csv | .jsonl/.csv 以外の拡張子 | ファイル名を変更するか、変換してください。 |
load.concurrency has duplicate values | 例:[2, 2, 4] | 並行数ごとに一意のポイントディレクトリが割り当てられるため、重複を削除してください。 |
warmup_requests must be >= 1 | YAML で warmup_requests: 0 が設定されている | aiperf は warmup=0 を受け付けません。最小値は 1 です。 |
LLM returned empty content (reasoning_content was populated — model exhausted its budget on chain-of-thought; raise min_query_tokens or set synthetic.disable_thinking=true). | 推論モデルが CoT を使用し、トークンを使い果たした | synthetic.disable_thinking: true(デフォルト)を設定するか、min_query_tokens を増やしてください。 |
✗ All N profiling requests failed across M point(s). + exit 1 | URL の誤り、サーバーの停止、コレクションの誤り | target.url と rag.collection_names を確認してください(<collection_name> プレースホルダーを指定すると、このエラーが発生します)。 |
イテレーションごとに ⚠ N profiling requests failed の警告が表示されるが、実行は継続する | 実行中に一部のリクエストがタイムアウトまたはエラーになった | rag-server のログを確認し、target.timeout_s を増やすか、並行数を減らしてください。 |
RuntimeError: Random synthetic query generation failed at query N: ... | 生成中に LLM エンドポイントがリクエストを拒否した | 部分的な JSONL は synthetic.jsonl_output_path にあります。エンドポイントを修正して num_queries を減らして再実行するか、input.file に部分ファイルを指定してください。 |
デプロイにデータがあるのに Citation count (mean): 0 と Citation relevance score: N/A が表示される | rag.collection_names と実際に取り込まれたコレクションが一致していない | curl -s http://<ingestor>:8082/v1/collections を実行して、実際のコレクションを一覧表示してください。 |
テストで ModuleNotFoundError: No module named 'pytest_asyncio' が発生する | 開発用追加パッケージが不足している | uv sync --project scripts/rag-perf --extra dev を実行してください。 |
CI:tests/unit/test_rag_perf/ から ModuleNotFoundError: No module named 'ruamel' が発生する | CI の仮想環境に rag-perf パッケージがない | unit-tests ジョブで、トップレベルのインストール後に uv pip install -e ./scripts/rag-perf を追加してください。 |
注意点
- リポジトリのルートから実行してください。 プリセット設定では、リポジトリのルートを基準とした相対パスで
scripts/rag-perf/examples/queries.jsonlとscripts/rag-perf/prompts/default_prompts.yamlを参照します。scripts/rag-perf/内から実行すると、これらのファイルの検索に失敗します。 - CLI で変更できるのは設定のみです。 URL、同時実行数、コレクションなどの項目を変更するには、YAML を編集するか、プリセットをコピーしてください。
- 初回実行前に必ず
rag.collection_namesを編集してください。 プリセットには意図的なプレースホルダーとして["<collection_name>"]が設定されています。検証は通りますが、すべてのリクエストで取得が黙って失敗し、どこでもCitation count (mean): 0になります。 load.concurrency_list、rag.vdb_top_k_list、rag.reranker_top_k_listは、スカラー値またはリストをリストに正規化する読み取り専用プロパティです。グリッドについて考えるときはこれらを使用してください。基になる YAML フィールドには、ユーザーが記述した値がそのまま設定されています。aiperf.enabled: falseにするとファイル名が変わります。 トップレベルの出力はprofile_report.md/profile_results.json/profile_results.csvになります。集計スイープテーブルでは負荷テストの行も、末尾の「Optimal throughput」も表示されなくなります。- 解決済み設定のダンプは冗長です(50 行以上)。これは想定どおりです。ターミナル出力だけで再現できるようにするためのものなので、スクリプトでフィルタリングしないでください。
- 各サブプロセスの実行前に aiperf のシェルコマンドがログに記録されます。 標準出力で
\n $ python -m aiperf profile -m ... --endpoint-type nvidia_rag ...を探してください。コピー&ペーストして実行すれば、rag-perf を介さずに単一の測定点を再現できます。 --endpoint-type nvidia_ragは、同梱のプラグインscripts/rag-perf/rag_perf/plugin/nvidia_rag.pyによるものです。このプラグインによって、aiperf は RAG の/v1/generateリクエスト形式を認識し、SSE ストリームから引用とステージごとのmetricsを解析できるようになります。aiperf がnvidia_ragを解決できない場合、rag-perf を venv に編集可能インストールする必要があります。uv sync --project scripts/rag-perf(またはuv pip install -e ./scripts/rag-perf)を再実行してください。- スイープモードで測定点名が衝突する場合があります。 2 つの測定点の違いが同時実行数のみの場合(例:
[1, 4]と単一のvdb_top_kの組み合わせ)、ディレクトリ名にはすべての情報が含まれます。例:CR:1_ISL:50_OSL:512_VDB-K:20_RERANKER-K:4_Model:...。クラスター/GPU/experiment_name(output.cluster、output.gpu、output.experiment_name)も追加されます。マシン間で差分を確認しやすい成果物パスを作るのに便利です。 load.iterations > 1の場合、グリッド全体が繰り返されます。 繰り返しごとに独自のiter_<i>/に出力されます。集計 CSV の行数はn_points × iterationsです。
信頼できる情報源
| 項目 | 場所 |
|---|---|
| ドライバー | scripts/rag-perf/rag_perf/cli.py(main は唯一の Click コマンドです) |
| スキーマ | scripts/rag-perf/rag_perf/config.py(RunConfig とサブモデル) |
| オーケストレーター | scripts/rag-perf/rag_perf/runner.py(BenchmarkRunner.run、RagProfiler、AiperfRunner) |
| aiperf プラグイン | scripts/rag-perf/rag_perf/plugin/nvidia_rag.py |
| ユーザー向けドキュメント | docs/performance-benchmarking.md |
| プリセット | scripts/rag-perf/configs/{quick_profile,single_run,sweep}.yaml |
| サンプルクエリ | scripts/rag-perf/examples/queries.jsonl |
| 合成プロンプト | scripts/rag-perf/prompts/default_prompts.yaml |
| 設定スキーマの詳細 | references/config-schema.md |
| 合成クエリの生成 | references/synthetic-generation.md |
| 出力構成とメトリクスの意味 | references/output-and-analysis.md |
エージェント向けプレイブック
- 依存関係を同期します:
uv sync --project scripts/rag-perf(チェックアウトごとに一度実行します)。 - プリセットを選択してカスタマイズします: バリエーションが必要な場合は
scripts/rag-perf/configs/<preset>.yamlをコピーします。rag.collection_namesは必ず実在するコレクションに設定してください。 - 実行します: リポジトリのルートから
uv run --project scripts/rag-perf rag-perf -c <config>を実行します。 - 標準出力のポイントごとの表と集計表を確認します。 ボトルネックの推定はポイントごとのプロファイリングセクションにあります。ポイント間の比較は最後の集計表で確認できます。
output.dir/run_<ts>/以下の成果物を解析します。詳細はreferences/output-and-analysis.mdを参照してください。複数ポイントを実行した場合、results.csvには(ポイント × イテレーション)ごとに1行ずつ記録されます。references/output-and-analysis.md#summarising-results-to-the-userのプレイブックに従って、結果をユーザー向けに要約します。要約には、見出しの表、スイープのスケーリング効率の計算、引用がゼロ/エラーがゼロでない/llm_ttft_msが疑わしい/サンプル数が少ない場合に必須のフラグ、および次に実施する実験の具体的な YAML を含めてください。- 検索/リランカーを調整します: すばやく反復するには
quick_profile.yamlに切り替えるか、aiperf.enabled: falseに設定します。その後、負荷時の特性を調べる際はsingle_run.yaml/sweep.yamlに戻します。 - 失敗をトリアージします: 上記のトラブルシューティングと、引用が空/ボトルネックが N/A となるパターンについて
references/output-and-analysis.mdを参照してください。