本文へ移動

ホーム / ML / 第4部 学習と推論の基盤

第4部 学習と推論の基盤・第8章

推論とサービング

★★★ 必須9トピック・面接 5問

学習したモデルを、本番で速く安定して動かす方法を押さえる。

別のページで開く →

障害対応の演習を読み込んでいます…

ひとことで

事前にまとめて計算しておくか、リクエストのたびに計算するか。鮮度とコストのトレードオフ。

モデルの予測(推論)をいつ計算するかには、大きく2つのやり方があります。バッチ推論は、夜間などにまとめて全員分を計算して保存しておき、使うときは読むだけにする方法です。オンライン推論は、リクエストが来たときにその場で計算して返す方法です。

バッチは事前に計算して読むだけ、オンラインはその場で計算するバッチ推論夜間ジョブ全員分保存KVS・DBアプリ読むだけ速い・安い。ただし前日の情報オンライン推論アプリリクエスト推論サーバーその場で計算特徴量最新の値今の情報を使える。p99 と障害に注意ハイブリッド(推薦の例)候補を作る夜にバッチで数百件保存ユーザーごと並べ替え表示時にオンライン表示上位を出す重い計算はバッチに寄せ、軽い計算だけその場で行う
バッチ推論・オンライン推論・ハイブリッド
観点バッチ推論オンライン推論
鮮度計算した時点のまま(例:前日の夜の情報)その瞬間の情報を使える(今見ている商品・今の検索語)
レイテンシ読むだけなので速い(KVS や DB から数 ms)モデルの計算の分だけかかる。p99 の管理が必要
コスト安い計算機をまとめて使える。ただし使われない人の分も計算する常にサーバーを動かしておく。リクエストの量に応じて増減させる
障害の影響計算が失敗しても前日の結果を使い続けられる推論のサーバーが落ちると、その機能が止まる(代わりの答えを用意する)
向いている例メールのおすすめ・需要予測・顧客のスコア・毎日のレポート不正検知・検索の並べ替え・入力に応じた応答(LLM)

判断の目安:「入力が事前に全部分かっているか」と「答えがどれくらい古くても許されるか」で決めます。対象のユーザーや商品が決まっていて、1日前の結果でよいならバッチが簡単で安全です。今の行動や、事前に分からない入力(自由な文章)を使うならオンラインが必要です。

まずバッチで始めて効果を確かめ、鮮度が足りないと分かってからオンラインにするのも良い進め方です。

面接ではこう答える

バッチ推論は、夜間などにまとめて全員分を計算して保存し、使うときは読むだけにする方法で、オンライン推論はリクエストが来たときにその場で計算する方法です。判断の軸は、入力が事前に全部分かっているかと、答えがどれくらい古くても許されるかです。対象が決まっていて前日の結果でよければ、安く安全なバッチを選び、今の行動や自由な文章のように事前に分からない入力を使うならオンラインにします。実務では、候補はバッチ、並べ替えはオンライン、のように組み合わせることも多いです。

バッチとオンラインは、どちらか一方を選ぶものではありません。重い計算を事前に済ませ、鮮度が要る部分だけその場で計算すると、速さ・費用・鮮度のバランスが取れます。

重い計算は夜のバッチに寄せ、軽い計算だけその場で行う夜間のバッチ候補を数百件ずつKVS に保存ユーザー → 候補表示のとき並べ替え今見ている商品・時間帯間に合わなければバッチの順・人気順を返す重い特徴量(過去1年の集計)は夜に、軽い特徴量(直近5分)はストリームで更新
候補はバッチ、並べ替えはオンライン

ハイブリッド:実務ではよく組み合わせます。

  • 候補はバッチ、並べ替えはオンライン:推薦で、ユーザーごとの候補 数百件を夜に計算しておき、表示するときに今の状況を使って上位を並べ替えます。重い計算をバッチに寄せ、軽い計算だけその場で行います。
  • 重い特徴量はバッチ、軽い特徴量はリアルタイム:過去1年の集計は夜に計算して保存し、直近5分の行動だけをストリーム処理で更新します。
  • 代わりの答え:オンライン推論が時間内に返らなければ、バッチで計算しておいた結果や人気順を返します。

8.3オンライン推論の構成

用語★★★ 必須
ひとことで

API・特徴量の取得・前処理・モデルのサーバー・後処理・予測ログからなる、オンラインで予測を返す仕組み。

オンライン推論は、モデルを API の後ろに置くだけではなく、特徴量の取得・前処理・後処理・ログまで含めた1つのサービスです。どこが遅いか、どこが落ちるかを分けて考えられるように、区間ごとに分けて設計します。

モデルの計算は全体の一部。特徴量の取得とログも含めて設計するAPI入力の検証特徴量の取得オンラインのストア前処理学習と同じものモデルのサーバーGPU・バッチング後処理しきい値・ルール予測ログ:リクエスト ID・時刻・モデルの版・特徴量・スコア・判定・レイテンシ
オンライン推論の構成の例
部品選択肢の例考えること
モデルのサーバーアプリに組み込む/Triton・TorchServe・vLLM などの推論サーバー/KServe などで Kubernetes に載せる小さいモデルはアプリに組み込むのが簡単。GPU を使う・複数のモデルを動かすなら専用のサーバー
特徴量の取得Redis などのオンラインのストア1回のリクエストで何回取りに行くか。まとめて取る
モデルの版レジストリから版を指定して読み込むどの版が動いているかを API の応答とログに出す
ログ予測ログをストリームや DWH に送る後で正解と結合して精度を測るため

面接ではこう答える

オンライン推論の構成は、入力を検証する API、オンラインのストアからの特徴量の取得、学習と同じ前処理、モデルのサーバー、しきい値などの後処理、そして予測ログに分けて考えます。小さなモデルならアプリに組み込めますが、GPU を使うものや複数のモデルを動かすなら Triton や vLLM のような推論サーバーを使います。どの版のモデルが答えたかをログに残し、後で正解と結合して精度を測れるようにします。

ひとことで

バッチング・量子化・小さいモデル・キャッシュで速くする。p99 とコールドスタートに注意。

推論 API を本番に出すと、精度と同じくらい「どれだけ速く返るか」が問われます。おすすめや検索の並べ替えのように、画面を出す途中で呼ばれる推論は、遅いとページ全体が遅くなり、タイムアウトすれば結果を出せません。

ここでは、速さをどの数字で見るか、どこが遅いのかをどう切り分けるかを押さえます。

推論のレイテンシ(応答の速さ)は、平均ではなく p99(遅いほうから1%の値)で見ます。平均が速くても、時々遅いと利用者は待たされます。また、サーバーが起動したばかりのとき、モデルの読み込みや初回の準備で最初のリクエストだけ遅くなるコールドスタートにも注意し、起動時にモデルを読み込んで試しに推論しておく(ウォームアップ)、最小の台数を0にしない、などで避けます。

全体の時間を区間に分けて測り、一番大きいところから手を打つ30ms特徴量の取得12ms前処理40msモデル8ms後処理= p50 90msp99 だけ遅いときは:コールドスタート・GC・特徴量ストアの遅いキー・大きな入力・待ち行列(同時実行の上限)を疑う
区間ごとに測る(数値は説明用の例)

そのほか、同じ入力への答えや埋め込みのキャッシュ、特徴量を取りに行く回数を減らす(まとめて取る)、モデルのサーバーを利用者の近くに置く、なども効きます。何が遅いのか(特徴量の取得・前処理・モデルの計算・後処理)を区間ごとに測ってから手を打ちます。

ダイナミックバッチング

量子化・蒸留

下の「ブラウザで試す」の図では、アプリが推論を依頼し、ゲートウェイが推論サーバーへ振り分け、オンラインの特徴量ストアから特徴量を取り、短い時間待ってリクエストを束ねて GPU で計算し、結果を返すまでを順に追えます。上の図の区間(特徴量の取得・モデルの計算など)が、それぞれ図のどの手順にあたるかを対応させると、どこを測ればよいかが見えます。束ねるために待つ時間は、1件あたりの遅延を増やす代わりに GPU の効率を上げる取引である点にも注目してください。

面接ではこう答える

推論のレイテンシは平均ではなく p99 で見ます。下げるときは、まず特徴量の取得、前処理、モデルの計算、後処理と区間ごとに測り、一番大きいところから手を打ちます。モデルが遅ければ量子化や蒸留、小さいモデルへの置き換え、GPU ならダイナミックバッチング、特徴量の取得が遅ければまとめて取る、キャッシュする、です。起動直後だけ遅いコールドスタートは、ウォームアップと最小台数で避けます。

別のページで開く →

ネットワーク図を読み込んでいます…

ひとことで

短い時間だけリクエストを待ってまとめ、GPU で一度に計算する方法。処理できる量が増える代わりに1件の遅れが増える。

ダイナミックバッチング:少しだけ待って、届いたリクエストをまとめて計算するリクエスト最大の待ち時間GPU3件4件2件時間待つほどまとめて効率が上がるが、1件ごとの遅れは増える(待ち時間と件数の上限で調整)
ダイナミックバッチング

ダイナミックバッチング:GPU は1件ずつより、まとめて計算するほうがずっと効率が良いです。そこで、短い時間(例:数 ms)だけリクエストを待ってまとめ、一度に計算します。全体で処理できる量が大きく増える代わりに、待つ分だけ1件の遅れが増えるので、「最大の待ち時間」と「最大のまとめる件数」を調整します。Triton Inference Server などの推論サーバーに機能があります。LLM では、生成の途中でも新しいリクエストを差し込む continuous batching(vLLM などが対応)が使われます。

面接ではこう答える

ダイナミックバッチングは、推論サーバーが数ミリ秒などの短い時間だけリクエストを待ってまとめ、GPU で一度に計算する方法です。GPU は1件ずつより、まとめて計算するほうがずっと効率が良いので、全体で処理できる量が大きく増えます。その代わり待つ分だけ1件の遅れが増えるので、最大の待ち時間と最大のまとめる件数を調整します。LLM では、生成の途中でも新しいリクエストを差し込む continuous batching が使われます。

ひとことで

量子化は重みを少ないビット数で表してメモリと計算を減らす方法。蒸留は大きなモデルをまねる小さなモデルを学習する方法。

ビット数を半分にすると、重みのメモリもほぼ半分16ビット約 14GB8ビット約 7GB4ビット約 3.5GB精度が少し落ちることがあるので、評価データで必ず比べる
重みのビット数とメモリ(7B モデルの重みの例)

量子化・蒸留:

手法内容と注意点
量子化重みを 32 ビットや 16 ビットから 8 ビット・4 ビットの数にする。メモリが減り、速くなる。精度が少し落ちることがあるので、評価データで必ず比べる
蒸留大きなモデル(先生)の出力をまねるように小さなモデル(生徒)を学習させる。小さくても先生に近い精度が出る
小さいモデル・軽い構造そもそも小さなモデルで足りないかを試す。表データなら勾配ブースティングは十分速い
推論用の最適化ONNX Runtime や TensorRT などで、計算をまとめて速くする

面接ではこう答える

量子化は、重みを16ビットから8ビットや4ビットの数にして、メモリと計算を減らす方法です。70億パラメーターのモデルなら、16ビットで約14GBの重みが4ビットでは約3.5GBになります。精度が少し落ちることがあるので、評価データで必ず比べます。蒸留は、大きなモデルの出力をまねるように小さなモデルを学習させる方法で、小さくても大きなモデルに近い精度を出せます。

ひとことで

LLM の推論は prefill(入力を読む)と decode(1トークンずつ出す)に分かれ、KV キャッシュが GPU メモリを使う。

入力をまとめて読む prefill と、1トークンずつ出す decodeprefill(入力を読む)t1t2t3t4t5t6t7t8t9t10最初のトークンまで(TTFT)1トークンごとの時間 × 出力の長さprefill は計算が重く、decode は KV キャッシュとメモリの読み出しが重い
LLM の推論の2つの段階
指標・仕組み意味効くこと
TTFT(最初のトークンまでの時間)入力を読み終えて1文字目が出るまで入力が長いほど長い。体感の速さに効くのでストリーミングで返す
トークンごとの時間・トークン毎秒2トークン目以降が出る速さ出力が長いほど全体の時間が延びる。出力の上限を決める
KV キャッシュ過去のトークンの Key・Value を保存して使い回す長い文脈・同時のリクエストが多いと GPU メモリを圧迫し、同時に処理できる数が減る
continuous batching生成の途中でも新しいリクエストを差し込むGPU の空きを減らし、処理できる量を増やす(vLLM などが対応)
プレフィックスの再利用同じシステムプロンプトの KV キャッシュを使い回す先頭が同じリクエストが多いと TTFT と計算が減る

自分たちで LLM を動かす場合、ボトルネックは多くの場合 GPU のメモリ(重み+KV キャッシュ)と、decode のメモリの読み出しの速さです。量子化で重みを小さくすると、その分 KV キャッシュに回せて同時に処理できる数が増えます。

面接ではこう答える

LLM の推論は、入力をまとめて読む prefill と、1トークンずつ出力する decode の2段階です。体感の速さは最初のトークンまでの時間 TTFT と、1トークンごとの時間で決まります。decode では過去のトークンの Key と Value を KV キャッシュとして保存して使い回すので、長い文脈や同時のリクエストが多いと GPU メモリを圧迫します。vLLM などの推論サーバーは continuous batching やキャッシュの効率的な管理で、同時に処理できる数を増やします。

モデルが返らなくても、機能は止めない最新のモデル時間内に返るバッチの結果前日に計算済みルール・人気順モデルなし機能を隠す最後の手段タイムアウト(例:p99 の目標の少し下)を超えたら次へ。どれを返したかをログに残す失敗が続くときは、しばらく呼ばずに代わりの答えを返す(サーキットブレーカー)
代わりの答えを段階的に用意する

推論のサーバーが遅い・落ちたときに、画面ごと止めてしまうのが一番悪い形です。モデルは「付加価値」であることが多いので、代わりの答え(フォールバック)を用意して機能を保ちます。

決めること例
タイムアウト推論 API の呼び出しは 100ms で打ち切る
代わりの答え前日のバッチの結果・人気順・ルール
見える化代わりの答えを返した割合を監視し、増えたらアラート
不正検知などの判定止めたときに「通す」か「保留」か、事業と決めておく

タイムアウトとリトライの考え方は SRE の解説で

GPU のサーバーは起動に時間がかかるので、増え始めが遅れるリクエスト台数この間は待たされる → 余裕の台数・先回りの増加で埋める
GPU の台数は遅れて増える(形はイメージ)
ポイント理由・やり方
CPU 使用率ではなく、待ち行列の長さ・同時実行数で増やすGPU の推論では CPU 使用率が負荷を表さないことが多い
起動を速くするコンテナのイメージを小さく、モデルのファイルを近くに置く。起動時にウォームアップ
最小台数を 0 にしないオンラインの推論で 0 からの起動はコールドスタートになる
時間帯で先回りして増やす毎日の山が決まっているなら予定で増やす
バッチ推論は 0 まで減らす動いていない時間の GPU の費用をなくす

この章のまとめ

🖨 まとめシート(印刷・PDF)
  • バッチ推論とオンライン推論の使い分け
  • レイテンシ・スループット・コストのバランス
  • バッチ推論とオンライン推論:事前にまとめて計算しておくか、リクエストのたびに計算するか。鮮度とコストのトレードオフ。
  • オンライン推論の構成:API・特徴量の取得・前処理・モデルのサーバー・後処理・予測ログからなる、オンラインで予測を返す仕組み。
  • レイテンシの測り方と下げ方:バッチング・量子化・小さいモデル・キャッシュで速くする。p99 とコールドスタートに注意。
  • ダイナミックバッチング:短い時間だけリクエストを待ってまとめ、GPU で一度に計算する方法。処理できる量が増える代わりに1件の遅れが増える。
  • 量子化・蒸留・推論用の最適化:量子化は重みを少ないビット数で表してメモリと計算を減らす方法。蒸留は大きなモデルをまねる小さなモデルを学習する方法。
  • LLM の推論(TTFT・KV キャッシュ):LLM の推論は prefill(入力を読む)と decode(1トークンずつ出す)に分かれ、KV キャッシュが GPU メモリを使う。

この章のクイズ

面接ではこう聞かれる

まず答えを見ずに声に出して答え、そのあと開いて比べる。

Q1推論のレイテンシを下げる方法を挙げてください。

模範回答

段階ごとに考えます。モデルの段階では、量子化で重みを 8 ビットなどにする、蒸留でより小さなモデルにする、ONNX Runtime や TensorRT のような推論用の最適化を使う、そもそも小さいモデルで足りないかを試します。基盤の段階では、GPU を効率よく使うためにダイナミックバッチングでリクエストをまとめる、モデルを事前に読み込んでコールドスタートを避ける、適切な GPU を選びます。

システムの段階では、事前にバッチで計算できるものはしておく、同じ入力の結果や特徴量をキャッシュする、特徴量の取得をまとめる、時間内に返らなければ代わりの答えを返す、などがあります。どれも、まず区間ごとの時間と p99 を測り、どこが遅いかを確かめてから手を打ち、精度が落ちていないかも評価します。

深掘りされたら

  • ダイナミックバッチングで、待ち時間と処理量のバランスをどう決めますか?

見られているポイントモデル・基盤・システムの各段階での工夫

Q2バッチ推論とオンライン推論は、どう使い分けますか?

模範回答

「入力が事前に全部分かっているか」と「答えがどれくらい古くても許されるか」で決めます。対象のユーザーや商品が決まっていて、前日の結果でよいならバッチ推論にします。夜にまとめて計算して KVS や DB に保存しておけば、使うときは読むだけなので速く、安く、推論が失敗しても前日の結果を使い続けられます。

今の行動や自由な文章のように、事前に分からない入力を使うならオンライン推論が必要です。実務では、推薦の候補はバッチで作り、表示するときにオンラインで並べ替えるような組み合わせもよく使います。

深掘りされたら

  • オンライン推論のサーバーが落ちたとき、どう振る舞わせますか?

見られているポイント鮮度と入力の性質で判断・ハイブリッド

Q3推論の p99 だけが遅いです。何を調べますか?

模範回答

平均は速いのに一部だけ遅いので、特定の条件で起きていることが多いです。まず、遅いリクエストの共通点を探します。入力が長い・特定の特徴量の取得が遅い・起動直後のサーバー(コールドスタート)に当たっている・ガベージコレクションや他の処理と重なっている、などです。

区間ごと(特徴量の取得・前処理・モデルの計算・後処理)に時間を記録して、どこで遅れているかを見ます。ダイナミックバッチングの待ち時間が長すぎる、同時のリクエストでキューが詰まっている、という場合もあります。原因に合わせて、ウォームアップ、タイムアウトと代わりの答え、台数の調整などを行います。

深掘りされたら

  • コールドスタートはどう防ぎますか?

見られているポイント遅いリクエストの共通点・区間ごとの計測

Q4量子化とは何ですか?使うときの注意は?

模範回答

モデルの重み(や計算の途中の値)を、32 ビットや 16 ビットの数から 8 ビットや 4 ビットの数にすることです。メモリが減り、多くの場合は速くもなるので、同じ GPU でより大きなモデルを動かしたり、費用を下げたりできます。

注意点は、精度が少し落ちることがある点です。落ち方はモデルやタスクによるので、必ず自分の評価データで量子化の前後を比べます。また、速くなるかどうかは、使う GPU や推論のライブラリが、その形式の計算に対応しているかでも変わるので、実際の環境で測ります。

深掘りされたら

  • 蒸留と量子化は、どう使い分けますか?

見られているポイント仕組みと効果・評価で確かめる・環境で測る

Q5LLM を自分たちで動かす場合、推論で何がボトルネックになりますか?

模範回答

GPU のメモリが一番の制約になりやすいです。モデルの重みに加えて、生成のたびに過去のトークンの情報を保存しておく KV キャッシュがメモリを使い、文脈が長いほど、同時のリクエストが多いほど増えます。メモリが足りないと、同時に処理できる数が減って全体の処理量が落ちます。

また、文章を1トークンずつ生成するので、出力が長いほど時間がかかります。対策としては、量子化でモデルを小さくする、continuous batching に対応した推論サーバー(vLLM など)で GPU を効率よく使う、出力の上限を決める、入力を短くする、などがあります。

深掘りされたら

  • 最初のトークンが出るまでの時間と、生成の速さは、それぞれ何で決まりますか?

見られているポイントKV キャッシュとメモリ・逐次の生成・対策