AI APIレイテンシ指標:TTFT、最初の有効応答、出力速度

1本のリクエストタイムラインで、Upstream Header、最初のSSE Event、有効応答、可視テキスト、End-to-end Latency、出力速度を分けます。

AI APIのレイテンシは1つの数値ではありません。ストリーミングリクエストでは、アップストリームHeader、最初の空でないSSE Event、最初の有効なコンテンツまたはアクション、最初の可視テキスト、レスポンス完了の時刻を分けて記録します。それぞれ異なる問いに答えるため、すべてを「TTFT」と呼ぶべきではありません。

テキストだけのチャットでは、最初の可視テキストまでの時間が通常はユーザー向けレイテンシです。推論やツールを使うワークフローでは、推論メタデータや関数呼び出し引数という形で、有効な出力が先に現れる場合があります。出力開始後の生成速度は別の指標です。

指標に名前を付ける前にリクエストタイムラインを作る

クライアントまたはゲートウェイレベルのタイムスタンプには、単調時計と共通の起点を使います。ストリーミングリクエストは次のように表現できます。

t0  gateway receives request
t1  gateway starts upstream request
t2  upstream response headers arrive
t3  first non-empty SSE event arrives
t4  first effective content or action arrives
t5  first visible text delta arrives
t6  upstream body completes or closes
t7  gateway handler finishes

すべてのリクエストに、すべての時点が存在するわけではありません。非ストリーミングレスポンスには有用なSSEタイムラインがありません。Function Callだけのレスポンスは可視テキストを出さない場合があります。キャンセルされたStreamは開始していても正常完了しません。欠けている値はゼロではなく未設定として保存してください。ゼロにすると、そのEventが即時発生したと誤って表現されます。

Modelflareはリクエスト単位のメタデータをother.timingに記録します。各フィールドとタイムラインの対応は次のとおりです。

フィールド 測定内容 重要な境界
auth_ms Tokenとユーザーの認証時間 ローカルフェーズの時間であり、アップストリーム時間ではない
distribution_ms チャネル選択とルーティングポリシーの時間 ローカルフェーズの時間
body_read_ms ダウンストリームRequest Bodyの読み取り時間 ルーティング前の遅いアップロードを検出できる
upstream_headers_ms アップストリームリクエスト開始からResponse Headerまで 起点はアップストリーム開始であり、ゲートウェイ受信時点ではない
first_sse_event_ms ゲートウェイ受信から最初の空でないアップストリームSSE Eventまで Eventは有効な出力ではなくメタデータの場合がある
first_response_ms ゲートウェイ受信から最初の有効なコンテンツまたはアクションDeltaまで 可視テキスト、推論要約、関数引数、カスタムツール入力を含む
first_text_delta_ms ゲートウェイ受信から最初の可視テキストDeltaまで 可視ストリーミングテキストが実際に出た場合だけ存在する
upstream_done_ms ゲートウェイ受信からアップストリームBodyの完了またはCloseまで Closeしただけでは正常完了とは限らない
total_handler_ms ゲートウェイ受信からRelayで把握できる最後の完了点まで ゲートウェイ視点のEnd-to-end時間に最も近い
visible_output_tps 出力Token数を最初の可視テキストからアップストリーム完了までの時間で割った値 可視出力の診断値であり、システム全体のTPSではない

この対応表により、起点が異なる値を直接引き算する誤りを防げます。たとえば、upstream_headers_msはアップストリームリクエスト開始からの時間ですが、first_response_msはゲートウェイがリクエストを受信した時点からの時間です。

TTFTには複数の実用的な意味がある

Time to First Tokenの一般的な定義は、クエリ送信から最初の出力Tokenを受信するまでの時間です。NVIDIA NIMベンチマーク指標ガイドでは、通常はネットワーク遅延、キュー待ち、Prompt Prefillを含み、内容のない初期レスポンスは数えないと説明しています。

この定義はテキスト生成ベンチマークには適しますが、現在のAPI Streamは可視テキストより前に複数種類のデータを送る場合があります。

  • Response CreatedまたはメタデータEvent。
  • 推論要約Delta。
  • Function Call引数の断片。
  • カスタムツール入力。
  • 空のHeartbeatまたはプロバイダー固有のEnvelope。

Dashboardやインシデントレポートでは、明示的な名称を使います。

名称 推奨する意味 適した用途
Time to Headers リクエスト開始からアップストリームHeaderまで ネットワーク、Proxy、アップストリームAdmissionの診断
Time to First Event リクエスト開始から最初の空でないSSE Eventまで Transportの生存確認のみ
Time to First Effective Response リクエスト開始から有効なコンテンツまたはアクションまで Agentと推論ワークフローの応答性
Time to First Visible Text リクエスト開始からユーザーが描画できるテキストまで チャットとユーザー体感の応答性

グラフに「TTFT」とだけ書く場合は、表のどの行を意味するか定義してください。そうしないと、2つのチームが同じリクエストについて異なる数値を報告し、どちらも正しいように見えてしまいます。

応答性と生成速度を分けて測る

End-to-endレイテンシは、リクエスト送信から完全なレスポンス受信までの時間です。選択した境界に応じて、キュー待ち、Prefill、Decode、ネットワーク転送、アップストリームStreamに現れるツール待ち、ゲートウェイ処理を含みます。

正常完了した単純なテキストStreamでは、次のように表せます。

end_to_end_latency = final_response_time - request_start_time
visible_generation_window = final_response_time - first_visible_text_time
visible_output_tps = output_tokens / visible_generation_window_seconds

Inter-token LatencyはTime per Output Tokenとも呼ばれ、通常は最初のToken以降の出力Token間隔の平均です。NVIDIA AIPerfの定義ではTTFTを除外し、残りの時間をoutput_tokens - 1で割ります。十分に長い出力では、その逆数が1ユーザーのDecode Throughputに近づきます。

SSE EventやText Deltaの数からToken単位のITLを計算しないでください。1つのEventに含まれるTokenはゼロ、1つ、複数のいずれもあり、Token境界はモデルのTokenizerにも依存します。Modelflareのvisible_output_tpsは記録された出力Token数と可視生成Windowを使います。TokenごとのEvent間隔やシステム全体のThroughputを表すものではありません。

各指標は別の問いに答えます。

  • 最初のテキストが速く、出力速度が遅い場合、最初は反応してもその後が重く感じられる。
  • 最初のテキストが遅く、出力速度が速い場合、長く待った後に一気に完了する。
  • 1ユーザーの出力速度が低くても、高並列時のシステム総Throughputが低いとは限らない。
  • Aggregate TPSが高くても、1ユーザーの良好なレイテンシは保証されない。

推論やツールは可視テキストより先に現れる

テキストだけのフローでは、first_response_msfirst_text_delta_msがほぼ同じ場合があります。推論やFunction Callingでは、この差が重要です。

モデルが1.8秒でFunction Call引数を出し始め、その後アプリケーションまたはプロバイダー側のツール処理が続き、可視テキストが6.4秒で始まる例を考えます。システムは1.8秒で実行可能な結果を出していますが、ユーザーが文章を見るのは6.4秒です。両方をTTFTと呼ぶと、遅延が計画前、ツール処理中、回答描画前のどこで発生したか分からなくなります。

プロダクト体験に合わせてフィールドを解釈します。

  • ターミナルAgentでは、最初の有効なアクションが最適な応答性指標になり得る。
  • 文章だけを表示するチャットUIでは、最初の可視テキストがユーザー指標になる。
  • コードが消費するTool Call APIでは、可視テキストが存在しない場合があり、必須にしてはいけない。
  • 推論モデルでは、早いSSE Envelopeは接続の進行を示すだけで、有効な進行を証明しない。

AI APIストリーミングガイドでは、SSE解析、キャンセル、Idle Timeoutを扱っています。パーサーがEnvelopeと有効な出力を区別した後で、レイテンシ指標を計算します。

決まった順序で遅いフェーズを診断する

アップストリーム境界から始め、その後にローカルフェーズを確認します。リクエストの大部分がモデル待ちなのに、認証やルーティングを先に疑うことを避けられます。

症状 最初に見る指標 調べるべきレイヤー 次の確認
Header前が遅い upstream_headers_ms ネットワーク経路、アップストリームAdmission、プロバイダーQueue、Proxy Route チャネル、地域、ステータス、並列数を比較
Headerは速いが有効出力が遅い first_response_msから初期フェーズを除いた時間 モデルQueue、Prompt Prefill、推論、アップストリームScheduling 入力Token、モデル、ルート、Inflight Countを比較
最初のEventは速いが有効出力が遅い first_sse_event_msからfirst_response_msまでの差 メタデータだけのEvent、Heartbeat、推論開始 生の内容ではなく安全なEvent Typeを確認
有効なアクションは速いが可視テキストが遅い first_response_msからfirst_text_delta_msまでの差 ツール/推論フェーズまたは回答構成 要求したツールと出力モードを確認
テキスト開始後に生成が遅い visible_output_tpsupstream_done_ms Decode Throughput、競合、長いContext、ネットワークBackpressure 出力長とチャネルInflight Countを比較
アップストリーム指標はすべて正常 auth_msdistribution_msbody_read_ms ローカル認証、ポリシー選択、クライアントUpload 上昇しているフェーズだけを確認

単一指標だけで根本原因を証明することはできません。たとえば高いupstream_headers_msには複数の可能性が含まれ、ルート、地域、プロバイダー、並列負荷の証拠を組み合わせて切り分ける必要があります。

3つの合成Traceを読む

次の値は診断例であり、Modelflareの本番平均値やプロバイダーベンチマークではありません。

Trace A:アップストリームHeaderを待っている

指標
upstream_headers_ms 6,100 ms
first_sse_event_ms 6,300 ms
first_response_ms 6,350 ms
first_text_delta_ms 6,400 ms
total_handler_ms 9,200 ms
visible_output_tps 42

待ち時間の大部分はHeader前に発生しています。可視テキスト開始後の生成は比較的良好です。クライアントRendererを最適化する前に、選択されたアップストリームルート、プロバイダーAdmission、ネットワーク経路、地域、並列負荷を確認します。

Trace B:有効なアクションが可視文章より早い

指標
upstream_headers_ms 240 ms
first_sse_event_ms 310 ms
first_response_ms 2,900 ms
first_text_delta_ms 8,700 ms
total_handler_ms 10,200 ms
visible_output_tps 55

Transportは早い段階で動いており、2.9秒で有効なアクションも現れていますが、可視テキストまではさらに5.8秒かかっています。推論やツールを使うリクエストなら、そのフェーズを調べます。Header Timeoutを延ばしても、このパターンは改善しません。

Trace C:開始は速いが生成が遅い

指標
upstream_headers_ms 260 ms
first_sse_event_ms 330 ms
first_response_ms 420 ms
first_text_delta_ms 430 ms
total_handler_ms 20,430 ms
visible_output_tps 9.8

テキストはすぐに表示されますが、その後の生成に約20秒かかっています。出力長、Context長、選択チャネル、Inflight Count、プロバイダー動作を比較します。First-output Timeoutは通過するため、この故障パターンは検出できません。

制御された条件でのみレイテンシを比較する

公平な比較では、ワークロード契約を一定に保ちます。最低限、次を記録してください。

  • 正確なモデルIDとルートまたはグループ。
  • 平均だけではなく、入力Tokenと出力Tokenの分布。
  • ストリーミングまたは非ストリーミングモード。
  • 有効にしたReasoning Effortとツール。
  • 地域とクライアントからゲートウェイまでのネットワーク経路。
  • 並列数または到着率。
  • Sampling設定と最大出力長。
  • Warmupポリシー、再試行ポリシー、除外した失敗。
  • サンプル数、時間Window、Percentileの計算方法。

1つの平均値ではなくp50、p95、p99を比較します。失敗を除外しないでください。Timeoutやエラーを削除すると、信頼性の低いルートほど速く見える場合があります。異なるPrompt、出力長、並列数、エンドポイント動作で2つのプロバイダーを測定し、モデル速度ランキングとして提示してはいけません。

コンテンツではなく診断メタデータを保持する

レイテンシ診断にPrompt、Response、API Key、平文のクライアントIDを保存する必要はありません。有用なリクエスト記録には次を含められます。

  • 生成したRequest IDとタイムスタンプ。
  • モデル、グループ、選択チャネルの参照。
  • ステータスと終了結果。
  • 利用可能な場合の入力、出力、Cached Token数。
  • 上記のTimingフィールド。
  • Stream Event数とText Delta数。
  • チャネルInflight Count。
  • 粗い地域情報と、プライバシーレビュー済みのNetwork Trace ID。
  • upstream_headers_slowgeneration_slow_tpsなどの粗い分類。

メタデータにも保持期間とアクセス制御を適用します。Request ID、ルート選択、時間パターン、Token数を組み合わせると、運用状況が推測される可能性があります。

調査は曖昧なTTFTラベルではなく、リクエストタイムラインから始めます。次にReliable AI API Routingで各試行が選択した正確なルートを比較し、AI API Error TroubleshootingでTimingと終了ステータスを関連付けます。これにより、Admission Delay、モデル起動、推論またはツール処理、可視生成、ローカルゲートウェイ処理を証拠に基づいて分離できます。