NTNX>日記

個人的な趣味による Nutanix Community Edition 日記。Japanese のみですみません。

Nutanix Enterprise AI 2.6 で統合エンドポイントを作成してみる。

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 のサンプル コードを取得できます。

 

サンプル コードです。

gist.github.com

 

 

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」のリクエストを確認すると、リクエストがほぼ均等に分散されている様子が見られるはずです。

 

以上。

©2026 gowatana
クリエイティブ・コモンズ・ライセンスこの 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。