Nutanix Enterprise AI(NAI)2.6 で、2つの LLM エンドポイントに負荷分散する、統合エンドポイントを作成してみます。なお、この機能は、NAI 2.6 時点ではテクニカル プレビューでした。
今回の内容です。
今回の環境
下記の一連の投稿により、統合エンドポイントを有効化した NAI 環境を構築してあります。
1. ローカル エンドポイントの作成
下記の投稿にある手順で、Llama 3.2 モデル(llama32-ep)から、LLM のローカル エンドポイントを作成しておきます。
エンドポイントは、下記の2つを作成しておきます。モデルは、以前の投稿 でインポートしたものを使用します。
- ローカル エンドポイント #1
- エンドポイント名:llama32-ep-01
- モデル機能:Text To Text
- モデル インスタンス名:llama32
- アクセラレーション タイプ:GPU Passthrough
- アクセラレーターの詳細:NVIDIA-A16(NAI ではサポート外だが利用可能)
- API キー:demo-key-01
- ローカル エンドポイント #2
- エンドポイント名:llama32-ep-02
- モデル機能:Text To Text
- モデル インスタンス名:llama32
- アクセラレーション タイプ:GPU Passthrough
- アクセラレーターの詳細:NVIDIA-A16(NAI ではサポート外だが利用可能)
- API キー:demo-key-01

2. 統合エンドポイントの作成
NAI UI で、「推論」→「統合エンドポイント」を開き、「統合エンドポイントを作成」をクリックします。

エンドポイントの基本情報を入力します。API Spec は、Chat / Rerank / Embeddings / Image Generations の4つから、この統合エンドポイントに追加するモデルに合わせて選択します。
- エンドポイント名:uep-01
- API Spec:Chat
そして、「モデルを追加」をクリックします。

エンドポイントを選択して、「モデルを追加」をクリックします。
- タイプ:ローカル
- エンドポイント:llama32-ep-01

2つめのエンドポイントを追加するため、「モデルを追加」をクリックします。

2つめのエンドポイントを選択して、「モデルを追加」をクリックします。
- タイプ:ローカル
- エンドポイント:llama32-ep-02

2つのモデル(のローカル エンドポイント)が追加されたことを確認して、「次へ」をクリックします。

エンドポイントの設定を入力して、「次へ」をクリックします。
- 着信トラフィック:負荷分散
- 負荷分散(合計で 100% になるように指定)
- llama32 - llama32-ep-01:50%
- llama32 - llama32-ep-02:50%
- API キー:demo-key-01

確認画面が表示されるので、「作成」をクリックします。

これで、統合エンドポイントが作成されました。

3. 作成された統合エンドポイントの様子
「推論」→「統合エンドポイント」を開き、統合エンドポイントの名前をクリックします。
- 名前:uep-01

統合エンドポイントの「概要」画面が表示されます。

「アクション」→「レート制限を管理」を開きます。

統合エンドポイントでは、2種類のレート管理が設定できます。
- トークン使用量のグルーバルレート制限を有効にする
- API キーごとのトークン使用量のレート制限を有効にする

「トークン使用量のグルーバルレート制限を有効にする」では、下記のように毎分の合計トークン数を指定できます。

「API キーごとのトークン使用量のレート制限を有効にする」では、下記のように、統合エンドポイントに割り当てた API キーごとに、毎分の合計トークン数を指定できます。今回は、設定変更せず「キャンセル」で閉じます。

NAI の統合エンドポイントは、Envoy AI Gateway が利用されています。
kubectl で確認すると、AIGatewayRoute リソース(aigatewayroutes.aigateway.envoyproxy.io)が作成されています。
$ kubectl get aigatewayroutes.aigateway.envoyproxy.io -n nai-admin uep-01 NAME STATUS uep-01 Accepted
このリソースでは、さきほど設定した 50% / 50% の 負荷分散も確認できます。
$ kubectl get aigatewayroutes.aigateway.envoyproxy.io -n nai-admin uep-01 -o yaml
apiVersion: aigateway.envoyproxy.io/v1alpha1
kind: AIGatewayRoute
metadata:
creationTimestamp: "2026-06-15T18:05:17Z"
finalizers:
- aigateway.envoyproxy.io/finalizer
generation: 1
labels:
nai.nutanix.com/extauth: enabled
nai.nutanix.com/unified-endpoint-mode: loadbalancer
name: uep-01
namespace: nai-admin
resourceVersion: "213658262"
uid: c7c233d3-c8de-4f88-b021-337c9eb125b9
spec:
llmRequestCosts:
- metadataKey: llm_input_token
type: InputToken
- metadataKey: llm_output_token
type: OutputToken
- metadataKey: llm_total_token
type: TotalToken
parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: nai-ingress-gateway
namespace: nai-system
rules:
- backendRefs:
- modelNameOverride: llama32-ep-01
name: nai-backend-openai
namespace: nai-system
priority: 0
weight: 50
- modelNameOverride: llama32-ep-02
name: nai-backend-openai
namespace: nai-system
priority: 0
weight: 50
matches:
- headers:
- name: x-ai-eg-model
type: Exact
value: uep-01
modelsOwnedBy: Envoy AI Gateway
timeouts:
request: 300s
status:
conditions:
- lastTransitionTime: "2026-06-15T18:05:17Z"
message: AI Gateway Route reconciled successfully
reason: ReconciliationSucceeded
status: "True"
type: Accepted
4. 統合エンドポイントの動作確認
「エンドポイント アクセス」を開きます。

統合エンドポイントでも、ローカル エンドポイントと同様に、curl のサンプル コードを取得できます。

サンプル コードです。
curl コマンドを実行すると、下記のようにテキスト生成を確認できます。この例では、証明書エラー無視(-k)と、応答の JSON 整形( | jq -r . )を追記しています。
API_KEY=<API キー> curl -k -s -X 'POST' 'https://10.1.7.122/enterpriseai/v1/chat/completions' \ -H "Authorization: Bearer $API_KEY" \ -H 'accept: application/json' \ -H 'Content-Type: application/json' \ -d '{ "model": "uep-01", "messages": [ { "role": "user", "content": "ごきげんよう" } ], "stream": false }' | jq -r .

サンプル リクエストを何度か実行したあと、統合エンドポイントの「メトリクス」→「使用状況」を開きます。

デフォルトでは、統合エンドポイントのすべてのリクエストが表示されます。

リクエストは、API キーまたはローカル エンドポイント単位でも表示できます。
1つめのローカル エンドポイント「llama32-ep-01」のみのリクエストを確認してみます。

そして、2つのエンドポイント「llama32-ep-02」のリクエストを確認すると、リクエストがほぼ均等に分散されている様子が見られるはずです。

以上。
