1人の速さだけでは足りない:混雑時の測り方
AI 公開日 更新日 中級

1人の速さだけでは足りない:混雑時の測り方

同時に何人が使っても耐えるかを測るため、待ち時間・同時実行・処理量の見方を整理します。

メトリフクロウ
メトリフクロウ 検証ラボ / Evaluation Lead

検証ラボの メトリフクロウ です。単発チャットの「速い/遅い」は大事ですが、ローカルLLMを業務基盤にするなら不足します。IDE、エージェント、バッチ、社内ツールが同時に叩く前提では、同時実行時の振る舞いが本番品質を決めます。

この回の答え

1人の速さではなく、混んだときの崩れ方を測ります。待ち時間は基準線、同時実行と処理量が主戦場です。条件ラベルを残します。

この回だけの用語

用語ひとことで
待ち時間(latency1本のリクエストが終わるまでの長さ。基準線
同時実行(concurrency何本を同時に叩くか。盛るノブではなく観測条件
スループット(throughput単位時間あたりのさばき量(トークン毎秒やリクエスト毎秒)
TTFT返事が始まるまで。混雑時に崩れやすい体感指標
p95遅い側の境目。現場の不満は平均よりここに出やすい
max_num_seqs同時に並べられるリクエスト上限のノブ
図1: latency だけでなく同時実行軸を見る
図1: latency だけでなく同時実行軸を見る

ポイント
単発 latency は基準線。採用判断の主戦場は concurrency / throughput です。

3種類のベンチを役割分担する

種類目的典型パラメータ
latency単発遅延の基準線concurrency=1, n=20
concurrency同時接続での安定性段階例: c=1→4→8→16(必要なら32)、n=40〜64
throughputバッチ処理能力既定例: c=16, n=64, max_tokens固定

ポイントは、run 間でワークロードを固定し、1軸だけ変えることです。concurrency を上げながらモデルも変えると、何が効いたか分かりません。

パラメータ表は「推奨値」ではなく「比較を揃えるための型」です。環境に合わせて n を増減しても構いませんが、比較セット内では固定してください。トークン毎秒は並列度込みで読む(c=1 と c=16 の数字は別試合です)。

いつどれを使うか

  • 新プロファイルの健全性確認: latency → 短い concurrency
  • 常駐共有の可否判断: concurrency を段階的に上げる
  • 夜間バッチや一括要約: throughput を主軸に
  • 長文用途: 入力長を明示した別スイートを用意

読むべき指標

  • TTFT: ユーザーが「反応した」と感じるまでの時間
  • latency パーセンタイル: 平均だけでなく p95 / p99
  • output tokens/sec: 生成速度の比較軸
  • requests/sec: 同時利用耐性の比較軸
  • error rate: 飽和点や設定ミスの兆候
  • 成功数 / 試行数: 分母を残さないと比較が歪む

「平均は良いが p95 が崩れる」「tok/s は高いが error が増える」は、採用判断で特に重要です。現場の不満は平均ではなく長尾に出ます。

観測仮説の置き方
c を上げると p95 だけ崩れるスケジューリングや KV 圧迫を疑う
tok/s は高いが error 増飽和。採用前に上限を決める
TTFT だけ悪いprefill / prefix / 初回ロードを疑う
全部悪いまず到達性・health・ワークロード固定を疑う

長文脈を測るとき

coding 用途と long-context 用途では、入力長を揃えないと比較になりません。長文側を見るときは、プロンプト長や max_tokens を明示し、可能なら同じ入力ファイルで揃えます。

コンテキストを伸ばすとキーバリューキャッシュ(KV)が膨らみ、見かけの速度だけでなくメモリ上限にも影響します。性能数字は、メモリ枠の話とセットで読んでください。短いデモプロンプトのトークン毎秒を、長文プロファイルの合格証に使わないことが原則です。

ワークロード固定チェック

  • [ ] プロンプト本体(または入力ファイル)が同じ
  • [ ] max_tokens / temperature など生成条件が同じ
  • [ ] thinking の実効(キー名・ON/OFF)と経路(直 / 入口)が同じ
  • [ ] concurrency とリクエスト数が記録されている
  • [ ] ストリーミング有無が揃っている
  • [ ] ウォームアップ方針が揃っている

吞吐比較で temperature を固定することと、品質比較で temperature=0 にしてよいことは別問題です。reasoning 品質側の測定衛生は、品質プレイブックと「数値が嘘をつくとき」側を見てください。

よくある失敗

  1. デモ用の短いプロンプトだけで結論づける
  2. ウォームアップ無しの初回だけを計測する
  3. サーバが未起動のまま数値を見て絶望する(実際は到達不能)
  4. GPUスナップショットを残さず、メモリ起因か判別できない
  5. concurrency を一気に最大まで上げ、飽和点を見落とす
  6. 品質スモークと性能 run の条件が別物になっている
  7. ゲートウェイ経由の欠測(タイムアウト等)を「低いスコア」に置換して平均を歪める
  8. prefix cache が効く固定接頭辞だけで測り、本番の可変入力を忘れる
  9. 同じ GPU に別ワークロード(例: 画像生成)が同居しているのに、モデル差と誤診する

失敗を「モデルが弱い」と即断する前に、到達不能・設定ミス・ワークロード不一致・同居負荷を除外します。

段階的に上げる読み方

いきなり高 concurrency で勝敗を付けない方が、学びが残ります。

  1. c=1 で基準線(壊れていないか)
  2. 想定同時利用の半分で安定性を見る
  3. 想定値で本番相当を見る
  4. 少し上回せて飽和の兆候を確認する(32 以上は本番影響を見てから)

「どこから崩れるか」が分かると、メモリ枠や max_num_seqs の調整に入れます。崩れる点を知らないまま平均だけ比べると、共有常駐で事故ります。

レポートに必ず残す列

比較表を作るなら、最低でも次を列にします。欠けている列がある表は、後から解釈不能になりやすいです。

  • concurrency / n / max_tokens
  • TTFT p50・p95
  • latency p95(可能なら p99)
  • output tok/s と requests/sec
  • error rate と成功数
  • プロンプト長区分(short / long など)
  • 環境ラベル(ハーネス確認 / 実機)

列が多いほど良いわけではありませんが、この欠落は高コストです。特に成功数を残さないと、見かけの平均値だけで判断してしまいます。

つまずいたこと

同時実行を上げると数字が良く見える瞬間があります。その直後に、テールレイテンシが壊れ、現場の体感は最悪、というパターンを何度も踏みました。

計測設計で困ったのは、平均値の美しさと利用者の怒りが一致しないことです。concurrency を「盛れるノブ」として扱い、失敗を観測しないベンチは、むしろ意思決定を歪めました。

この回の要点

  • concurrency は盛るノブではなく観測条件
  • 平均値よりテールと失敗率を併記する
  • 体感悪化を見逃すベンチを採用根拠にしない

同時実行の測り方は公開できますが、特定マシンの tok/s 表はこの回では出しません。テールと失敗率を含む実機値は、再計測と匿名化が済んだものから足します。

次は「ベンチ数字が嘘をつくとき:試験台と実機を混ぜない」です。concurrency 条件をメモしたまま読むと、嘘の切り分けが早くなります。

よくある質問

単発が速ければ十分ですか?

いいえ。業務では同時実行が前提です。混雑時の p95 と error rate を見ないと採用判断になりません。

concurrency の数字はどう振りますか?

型の例は 1→4→8→16。32 は余力があれば。一気に最大まで上げず、崩れる段を残します。

Related

関連記事

Contact

検証や観光DXの進め方について、お気軽にご相談ください。