ページの先頭です

ページ内を移動するためのリンク
本文へ (c)

ここから本文です。

推論機能を強化するllm-d

AIを活用したアプリケーションやサービスは日々増加し、これらを裏側で支えているのが生成AIの推論(Inference)サービスです。AIがビジネスや社会のあらゆる分野に浸透し始めた現在、推論基盤の重要性は更に高まると予想されています。202511月に開催された KubeCon + CloudNativeCon North America 2025 のキーノートでも、この推論基盤が大きなテーマの一つとして取り上げられました。本記事では推論機能を強化する、llm-dについてご紹介します。

ライター:奈良 昌紀
通信事業者のデータセンターにおいてネットワーク・サーバー運用を経験した後、ネットワンシステムズに入社。帯域制御やWAN高速化製品担当を経て、2008年から仮想化関連製品を担当。現在は主にクラウドやコンテナなどの技術領域を担当。

目次

llm-d とは

LLM(大規模言語モデル)に対する同時アクセスが増えると、LLMのパフォーマンス指標である、最初のトークンが生成されるまでの時間(TTFT : Time to First Token)や、1秒間に生成されるトークンの数(TPOT : Time Per Output Token)が低下するおそれがあります。これは、GPUの処理性能が限られているためです。これらの指標を維持するためには、GPU数を増やしてLLMの推論を分散処理する必要があります。従来のウェブアプリケーションではラウンドロビンやリーストコネクション等の方式を利用して負荷分散対象を選択しますが、LLMを分散処理する場合これらの方式ではGPUリソースを効率よく利用することができません。そこで求められるのがスケールアウト可能な推論プラットフォームであり、llm-dKubernetes上で推論機能のスケールアウトを可能にします。

llm-d Red HatGoogleNVIDIA等が主導して開発を進めている、Kubernetesネイティブな大規模言語モデル(LLM)の分散推論フレームワークのオープンソースプロジェクトであり、特にエンタープライズ環境での「大規模かつ効率的なAI運用」のため、近年、急速に注目を集めています。LLMの推論機能を提供するライブラリであるvLLMベースの推論ワークロードをKubernetes上で管理し、Inference Schedulerと呼ばれる機能により、複数の推論インスタンスに対してリクエストを適切に振り分けられるよう設計されています。推論インスタンスに対する負荷分散には、次世代の Kubernetes Ingress である Gateway API を拡張した、Gateway API Inference Extension (GIE) の実装である Inference Gateway を利用します。推論インスタンスであるvLLMPodとして実行され、vLLM間でKVキャッシュを共有するためにNIXL(NVIDIA Inference Xfer Library)等が利用されます。また、KVキャッシュを効率的に利用するためにLMCacheを利用することも可能です。

(出典 : https://llm-d.ai/docs/architecture)

llm-dコミュニティが提供するWell-Lit Paths

Well-Lit Paths は直訳すると「よく照らされた道」を意味し、llm-d において推奨される利用方法や、本番運用を想定して検証済みの構成パターンをまとめたものです。現在、4 種類の Well-Lit Paths が提供されています。(High performance distributed inference on Kubernetes with llm-d)

Intelligent Inference Scheduling

Inference Gatewayの背後にvLLM Podを配置します。Inference Schedulerは入力トークンの先頭部分のKVキャッシュ(プリフィックスキャッシュ)を持つvLLM Podにリクエストを転送します。Inference SchedulervLLMKV-Eventsデータに基づいて転送先を決定します。過去のリクエストにより生成されたKVキャッシュを利用することが可能となるため、応答遅延を削減し、スループットを向上させます。また、スケジューリングポリシーは柔軟に設定することが可能です。

Prefill/Decode Disaggregation

LLMの推論実行時は一般的にはPrefillDecodeと呼ばれる処理が同一のGPUで実行されます。Prefillは入力トークンに対して大規模な行列演算を行いKVキャッシュを生成する処理であり、GPU処理性能に大きく依存します。一方、Decodeは生成済みのKVキャッシュを参照して、トークンを逐次生成する処理であり、計算量自体は小さいもののKVキャッシュへの高速なアクセスが求められます。これら特性の異なる処理をそれぞれ別々のGPUに分離して実行することで、それぞれに最適化されたGPUリソースを割り当て、推論全体の効率化を図ることが可能です。

Prefill向けPodDecode向けPodvLLMワークロードとして実行され、KVキャッシュを転送する必要があるためNIXLが利用され、複数ノードで構成する場合、ノード間はRoCEv2InfiniBandのような低レイテンシ・高帯域なネットワークで接続する構成が一般的です。

Wide Expert-Parallelism

DeepSeek-R1のような非常に大規模なMixture-of-Expert (MoE)モデルを複数のGPUに分散配置し、Data ParallelismExpert Parallelismによりスケールアウトすることで、エンドツーエンドのレスポンスを高速化します。

Tiered Prefix Cache

通常GPUメモリー上で処理されるプリフィックスキャッシュをCPUメモリーやローカルディスク、共有ディスク等にオフロードして再利用することで、プリフィックスキャッシュの再利用を増やし、TTFTを短縮します。上記の3つのPathと併用可能です。

Red Hat OpenShift AI 3.0 での実装

Red Hat OpenShift AIは、Red Hat OpenShift Container Platform上でAI/MLの開発・利用を推進するための機能を提供し、MLOpsプラットフォームの構築を可能にするソフトウェアです。従来からvLLMを利用した推論機能を利用することは可能でしたが、OpenShift AI 3.0 からllm-dアーキテクチャを用いた分散推論がサポートされました。

Serving runtimeによるllm-dの利用

Red Hat OpenShift AI 3.0では、モデルデプロイ時に選択可能なServing runtimeとして「Distributed inference Server with llm-d」が追加されており、このServing runtimeを利用することで、 KServe のカスタムリソースである LLMInferenceService によるモデルのデプロイが可能となっています。

デプロイが完了すると、External endpointとしてURLが利用可能になります。このURLの実体はInference Gatewayであり、URLに対するリクエスト処理はopenshift-ingressネームスペースに存在するEnvoyベースのrouter podによって行われます。

llm-d Serving Runtimeの実体

作成したDeploymentOpenShift上ではLLMInferenceServiceとして確認することができます。LLMInferenceServiceによって管理されるリソースを確認すると、vLLM Podを起動するためのDeployment(gpt-oss-kserve)や、Endpoint Picker (EPP)として機能する gpt-oss-kserve-router-scheduler Deploymentが作成されています。また、GIEに対する設定としてHTTPRouteInferencePoolDestinationRule等のリソースが作成されています。

$ oc get llminferenceservices.serving.kserve.io
NAME              URL                                                                     READY   REASON   AGE
gemma3-12b-it     https://inference.apps.ogci.techlab.netone.co.jp/demo/gemma3-12b-it     True             26h
gpt-oss           https://inference.apps.ogci.techlab.netone.co.jp/demo/gpt-oss           True             3m44s
qwen3-8b-single   https://inference.apps.ogci.techlab.netone.co.jp/demo/qwen3-8b-single   True             9m38s
$ oc tree llminferenceservices.serving.kserve.io gpt-oss
NAMESPACE  NAME                                                          READY  REASON  STATUS   AGE
demo       LLMInferenceService/gpt-oss                                   True           Current  4m40s
demo       ├AuthPolicy/gpt-oss-kserve-route-authn                       -              -        4m38s
demo       ├Deployment/gpt-oss-kserve                                   -              -        4m38s
demo       │  ReplicaSet/gpt-oss-kserve-94547cf4f                       -              -        4m38s
demo       │    Pod/gpt-oss-kserve-94547cf4f-7fqcx                      True           Current  4m38s
demo       │    Pod/gpt-oss-kserve-94547cf4f-bt5fs                      True           Current  4m38s
demo       ├Deployment/gpt-oss-kserve-router-scheduler                  -              -        4m38s
demo       │  ReplicaSet/gpt-oss-kserve-router-scheduler-7d4fdf9bcd     -              -        4m38s
demo       │    Pod/gpt-oss-kserve-router-scheduler-7d4fdf9bcd-6hrrf    True           Current  4m38s
demo       ├DestinationRule/gpt-oss-kserve-scheduler                    -              -        4m38s
demo       ├DestinationRule/gpt-oss-kserve-workload                     -              -        4m38s
demo       ├DestinationRule/gpt-oss-kserve-workload-svc                 -              -        4m38s
demo       ├HTTPRoute/gpt-oss-kserve-route                              -              -        4m38s
demo       ├InferenceModel/gpt-oss-inference-model                      -              -        4m38s
demo       ├InferencePool/gpt-oss-inference-pool                        -              -        4m38s
demo       │  Service/gpt-oss-inference-pool-ip-19a8eb77                -              -        4m38s
demo       │    EndpointSlice/gpt-oss-inference-pool-ip-19a8eb77-8px8k  -              -        4m38s
demo       ├Role/gpt-oss-epp-role                                       -              -        4m38s
demo       ├RoleBinding/gpt-oss-epp-rb                                  -              -        4m38s
demo       ├Secret/gpt-oss-kserve-self-signed-certs                     -              -        4m38s
demo       ├Service/gpt-oss-epp-service                                 -              -        4m38s
demo       │  EndpointSlice/gpt-oss-epp-service-zsq7s                   -              -        4m38s
demo       ├Service/gpt-oss-kserve-workload-svc                         -              -        4m38s
demo       │  EndpointSlice/gpt-oss-kserve-workload-svc-zmxbf           -              -        4m38s
demo       └ServiceAccount/gpt-oss-epp-sa                               -              -        4m38s

Inference Gateway (Envoy)が受信した推論リクエストは、HTTPRouteの定義に基づいて評価され、InferencePoolが選択されます。Inference GatewayはExternal Processingを利用して、InferencePoolで指定されているEPPに転送先を問い合わせます。EPPvLLM Podのメトリックを参照し、プリフィックスキャッシュ情報等を基にスコアリングを行い、推論リクエストを処理すべきvLLM PodEnvoyに回答します。Envoyが指示されたvLLM Podに推論リクエストを転送することで、推論ワークロードに適した負荷分散を実現します。

$ oc get pod -l app.kubernetes.io/name=gpt-oss
NAME                                               READY   STATUS    RESTARTS   AGE
gpt-oss-kserve-94547cf4f-7fqcx                     2/2     Running   0          5m4s
gpt-oss-kserve-94547cf4f-bt5fs                     2/2     Running   0          5m4s
gpt-oss-kserve-router-scheduler-7d4fdf9bcd-6hrrf   1/1     Running   0          5m4s

EPPとして機能する gpt-oss-kserve-router-scheduler Podの起動時の引数には、デフォルトで以下のようなEndpointPickerConfigが挿入されています。このEndpointPickerConfigは様々なカスタマイズにより、vLLM Podを決定する方法を柔軟に設定することが可能です。

apiVersion: inference.networking.x-k8s.io/v1alpha1
kind: EndpointPickerConfig
plugins:
- type: single-profile-handler
- type: prefix-cache-scorer
- type: load-aware-scorer
- type: max-score-picker
schedulingProfiles:
- name: default
  plugins:
  - pluginRef: prefix-cache-scorer
    weight: 2.0
  - pluginRef: load-aware-scorer
    weight: 1.0
  - pluginRef: max-score-picker

llm-dによる効果の測定

弊社ラボ環境でNVIDIA AIPerfをベンチマークツールとして利用してllm-dの有無による効果を測定しました。測定環境はNVIDIA RTX PRO 6000が利用可能なサーバーにOpenShift 4.20.8とOpenShift AI 3.0をインストールし、vLLM Podを8個作成し、OpenShiftのServiceリソースにより分散した場合と、llm-dを利用した場合のTTFT(Time to First Token)とITL(Inter Token Latency)の99パーセンタイル(p99)と90パーセンタイル(p90)をそれぞれ3回測定し、各パーセンタイル値について3回分の平均を比較しました。

TTFT (ms) [p99]

TTFT (ms) [p90]

ITL (ms) [p99]

ITL (ms) [p90]

llm-d

181.09

73.24333333

35.50666667

34.97333333

Service

693.4166667

124.7466667

32.22333333

31.38333333

TTFTの値に関しては、99パーセンタイル、90パーセンタイルどちらを見ても、Serviceに比べてllm-dを利用した場合のほうが短時間で最初のトークンを返せていることがわかります。この結果はllm-dがリクエストの特性やバックエンドのvLLMの状態を考慮してルーティングしたことでTTFTの短縮につながったと考えられます。特に、プリフィックスキャッシュを利用できる場合、キャッシュヒット率の向上がTTFTの改善に寄与した可能性が高いと考えられます。

まとめ

AIアプリケーションの増加に伴い推論機能のニーズは高まり、データ主権や地政学的リスクの軽減を目的としてローカル環境における推論基盤の必要性も高まっています。このような背景から、推論に適した新たなハードウェア、ソフトウェアが登場しています。今回はその中で推論機能を強化するllm-dをご紹介しました。llm-dの動作を含め、AIアプリケーションのためのソフトウェア、オンプレのサーバーやネットワーク、ストレージについてラボでのデモンストレーションも可能ですので、気になる方は、ぜひ、弊社担当にご連絡ください。

※本記事の内容は執筆者個人の見解であり、所属する組織の見解を代表するものではありません。

RECOMMEND