Перейти к основному содержимому

Чтобы получить чистый Markdown-контент этой страницы, добавьте .md к этому URL. Полный индекс документации см. по адресу https://docs.nvidia.com/dynamo/llms.txt. Полное содержимое, включая API reference и примеры SDK, доступно по адресу https://docs.nvidia.com/dynamo/llms-full.txt.

Inference Gateway (GAIE)

Настройка Inference Gateway с Dynamo

Inference Gateway (GAIE)

Интегрируйте Dynamo с Gateway API Inference Extension для интеллектуальной KV-aware маршрутизации запросов на уровне gateway.

Возможности

  • Подход kv-routing по умолчанию в EPP не учитывает токены, потому что prompt не токенизируется. Плагин Dynamo использует token-aware KV algorithm. Он задействует dynamo router, который реализует kv routing, запуская tokenizer вашей модели inline. Конфигурация плагина EPP встроена в recipe-based YAML для GAIE deploy в recipes/llama-3-70b/vllm/agg/gaie/ и recipes/llama-3-70b/vllm/disagg-single-node/gaie/ в соответствии с layout конфигурации GAIE/EPP, используемым в этом репозитории.

  • Интеграция Dynamo с Inference Gateway поддерживает Aggregated и Disaggregated Serving. Request использует disaggregated routing только тогда, когда в конфигурации EPP задан профиль prefill и доступны prefill workers. В примерах recipe отдельно показаны aggregated и disaggregated configs в recipes/llama-3-70b/vllm/agg/gaie/ и recipes/llama-3-70b/vllm/disagg-single-node/gaie/. Если не задано DYN_ENFORCE_DISAGG=true, развертывания без профиля prefill или без prefill workers переключаются на aggregated serving.

  • Интеграция GAIE поддерживает Data Parallelism.

  • Если вы хотите использовать LoRA, разверните Dynamo без Inference Gateway.

  • В этих схемах в качестве реализации Inference Gateway используется agentgateway.

Предварительные требования

  • Kubernetes cluster с настроенным kubectl
  • Драйверы NVIDIA GPU, установленные на worker nodes

Шаги установки

1. Установите Dynamo Platform

См. Quickstart Guide, чтобы установить Dynamo Kubernetes Platform. Если вы устанавливаете из исходного дерева, а не из release chart, следуйте Path B: Custom Build from Source и выполните helm dep build ./platform/ перед helm install, чтобы vendored subcharts соответствовали локальному содержимому chart.

2. Разверните Inference Gateway

Сначала разверните сервис inference gateway. В этом примере мы установим agentgateway с включенным inference extension.

cd deploy/inference-gateway
export NAMESPACE=my-model # You can put the inference gateway into another namespace and then adjust your http-route.yaml
./scripts/install_gaie_crd_agentgateway.sh

Этот скрипт устанавливает Gateway API CRD, GAIE CRD, agentgateway в agentgateway-system и Gateway с именем inference-gateway в ${NAMESPACE}.

f. Проверьте, что Gateway запущен

kubectl get gateway inference-gateway -n ${NAMESPACE}

# Sample output
# NAME CLASS ADDRESS PROGRAMMED AGE
# inference-gateway agentgateway <none> True 1m

3. Настройте secrets

Не забудьте при необходимости создать secret для docker registry.

kubectl create secret docker-registry docker-imagepullsecret \
--docker-server=$DOCKER_SERVER \
--docker-username=$DOCKER_USERNAME \
--docker-password=$DOCKER_PASSWORD \
--namespace=$NAMESPACE

Не забудьте добавить токен HuggingFace.

export HF_TOKEN=your_hf_token
kubectl create secret generic hf-token-secret \
--from-literal=HF_TOKEN=${HF_TOKEN} \
-n ${NAMESPACE}

4. Соберите образ EPP (необязательно)

Вы можете использовать предоставленный образ Dynamo FrontEnd для EPP либо собрать собственный кастомный образ Dynamo EPP, следуя шагам ниже.

# export env vars
export DOCKER_SERVER=ghcr.io/nvidia/dynamo # Container registry
export IMAGE_TAG=YOUR-TAG # Or auto from git tag
cd deploy/inference-gateway/epp
make all # Do everything in one command
# or make all-push to also push


# Or step-by-step
make dynamo-lib # Build Dynamo library and copy to project
make image-load # Build Docker image and load locally
make image-push # Build and push to registry
make info # Check image tag

Все-в-одном targets

TargetDescription
make dynamo-libСобрать статическую библиотеку Dynamo и скопировать в проект
make allСобрать библиотеку Dynamo + Docker image + загрузить локально
make all-pushСобрать библиотеку Dynamo + Docker image + отправить в registry

5. Развертывание

Ниже приведен пример для Qwen vLLM. Вам нужно развернуть Dynamo Graph и HTTPRoute. Пример http-route.yaml разрешает Gateway в том же namespace, что и HTTPRoute, поэтому самый простой путь - применить route в том же namespace, где вы установили Gateway (то есть ${NAMESPACE}). Если ваш Gateway находится в другом namespace, добавьте parentRefs[].namespace, чтобы указать его явно:

parentRefs:
- group: gateway.networking.k8s.io
kind: Gateway
name: inference-gateway
namespace: my-model # only needed if the Gateway is in a different namespace
cd <dynamo-source-root>
# kubectl get httproutes -n my-model # Убедитесь, что у вас не запущен несовместимый HTTPRoute, при необходимости удалите его.
# Choose disagg or agg example
kubectl apply -f examples/backends/vllm/deploy/gaie/disagg.yaml -n my-model
# or
kubectl apply -f examples/backends/vllm/deploy/gaie/agg.yaml -n my-model
# убедитесь, что применили route
kubectl apply -f examples/backends/vllm/deploy/gaie/http-route.yaml -n my-model

Примеры для других моделей можно найти в папке recipes.

# Deploy PVC, first update `storageClassName` in recipes/llama-3-70b/model-cache/model-cache.yaml to match your cluster before deploying
kubectl apply -f recipes/llama-3-70b/model-cache/model-cache.yaml -n ${NAMESPACE}
kubectl apply -f recipes/llama-3-70b/model-cache/model-download.yaml -n ${NAMESPACE}

Мы приводим примеры для llama-3-70b vLLM в recipes/llama-3-70b/vllm/agg/gaie/ для aggregated serving и в recipes/llama-3-70b/vllm/disagg-single-node/gaie/ для disaggregated serving. Обратите внимание: для aggregated serving нужно отключить DYN_ENFORCE_DISAGG в конфигурации EPP.

- name: DYN_ENFORCE_DISAGG
value: "false"

Используйте правильную папку в командах ниже.

# Deploy your Dynamo Graph.

# agg
kubectl apply -f recipes/llama-3-70b/vllm/agg/gaie/deploy.yaml -n ${NAMESPACE}
# Разверните GAIE http-route CR. Route по умолчанию разрешает Gateway в том же namespace;
# если ваш Gateway находится в другом месте, добавьте `parentRefs[].namespace` перед применением.
kubectl apply -f recipes/llama-3-70b/vllm/agg/gaie/http-route.yaml -n ${NAMESPACE}

# or disagg
kubectl apply -f recipes/llama-3-70b/vllm/disagg-single-node/gaie/deploy.yaml -n ${NAMESPACE}
kubectl apply -f recipes/llama-3-70b/vllm/disagg-single-node/gaie/http-route.yaml -n ${NAMESPACE}
  • При использовании GAIE FrontEnd не выбирает workers. Маршрутизация определяется в EPP.
  • FrontEnd должен запускаться с --router-mode direct, чтобы учитывать routing decisions EPP, переданные через request headers.
  • Используйте поле frontendSidecar в сервисе worker, чтобы оператор автоматически внедрил полностью настроенный frontend sidecar container со всеми необходимыми переменными окружения Dynamo, probes и портами:
frontendSidecar:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.2.0
args:
- --router-mode
- direct
envFromSecret: hf-token-secret
  • Предварительно выбранный worker (decode и prefill в случае disaggregated serving) передается в request headers.
  • Флаг --router-mode direct гарантирует, что routing уважает этот выбор.

Таймаут Startup Probe: по умолчанию таймаут startup probe у EPP составляет 30 минут (10s × 180 failures). Если ваша модель загружается дольше, увеличьте failureThreshold в startupProbe EPP. Например, чтобы разрешить 60 минут на запуск:

extraPodSpec:
mainContainer:
startupProbe:
failureThreshold: 360 # 10s × 360 = 60 minutes

Namespace Gateway Пример http-route.yaml разрешает Gateway в том же namespace, что и route. Если вы устанавливаете Gateway в одном namespace, а применяете route в другом, добавьте parentRefs[].namespace: <gateway-namespace> в http-route.yaml.

Общие переменные для настройки маршрутизации:

Включение KV-aware routing (самый точный режим)

KV-aware routing использует живые KV cache block events от workers, чтобы EPP мог направлять requests к worker с наилучшим перекрытием prefix cache. Чтобы включить его (по умолчанию):

  1. Workers — включите prefix caching и публикацию KV events. Каждый worker должен публиковать KV cache events в event plane (NATS/ZMQ), чтобы router EPP мог отслеживать состояние cache для каждого worker.
    • vLLM: укажите --enable-prefix-caching и --kv-events-config '{"enable_kv_cache_events":true}'.
    • SGLang: укажите --kv-events-config с подходящим endpoint.
    • TRT-LLM: укажите --publish-events-and-metrics.
  2. EPP — оставьте DYN_USE_KV_EVENTS по умолчанию (true). EPP подписывается на KV events workers через event plane (NATS/ZMQ) и использует их для scoring перекрытия префиксов.
  3. Размер block — должен совпадать. --block-size на всех workers должен совпадать с DYN_KV_CACHE_BLOCK_SIZE в EPP (по умолчанию: 128). Несовпадение размеров block приводит к некорректному вычислению hash block.

Отключение KV-aware routing

Чтобы отключить прослушивание KV events в EPP (например, когда prefix caching выключен на workers или нужен более простой балансировщик нагрузки):

  1. EPP: установите DYN_USE_KV_EVENTS=false. Router переходит в approximate mode (routing decisions отслеживаются локально с TTL decay вместо живых KV events от workers).
  2. Workers: укажите --no-enable-prefix-caching, чтобы полностью отключить prefix caching. Без prefix caching KV events не генерируются независимо от других флагов.
  3. Опционально установите DYN_ROUTER_KV_OVERLAP_SCORE_CREDIT=0 в EPP, чтобы полностью пропустить scoring перекрытия префиксов и заставить router выбирать workers только по нагрузке.
  • Задайте DYN_BUSY_THRESHOLD, чтобы настроить верхнюю границу того, насколько "full" может быть worker (часто выводится из kv_active_blocks или других метрик нагрузки), прежде чем router пропустит его. Если выбранный worker превышает это значение, routing переключается на следующего лучшего кандидата. По умолчанию значение отрицательное, то есть функция выключена.
  • Задайте DYN_ENFORCE_DISAGG=true (по умолчанию: false), чтобы управлять поведением на уровне request, когда prefill workers недоступны:
    • true (рекомендуется для disaggregated serving): requests завершаются с ошибкой, если prefill workers недоступны. Используйте это, когда disaggregated serving обязательно и fallback на aggregated mode неприемлем.
    • false (по умолчанию): requests аккуратно переходят в aggregated mode (пропускают prefill и направляются напрямую в decode), когда prefill workers недоступны. Когда prefill workers появятся позже, последующие requests автоматически начнут использовать disaggregated routing.
  • Задайте DYN_ROUTER_KV_OVERLAP_SCORE_CREDIT, чтобы управлять device-local prefix-overlap credit multiplier в диапазоне от 0.0 до 1.0. Более высокие значения сильнее склоняют к повторному использованию workers с похожими cached prefixes. (по умолчанию: 1)
  • Задайте DYN_ROUTER_PREFILL_LOAD_SCALE, чтобы масштабировать скорректированную prompt-side prefill load перед добавлением decode blocks. (по умолчанию: 1)
  • Задайте DYN_ROUTER_TEMPERATURE (по умолчанию: 0.0), чтобы сглаживать или усиливать нормализованную выборку workers. Низкая temperature заставляет router детерминированно выбирать лучший кандидат; более высокая temperature чаще пропускает workers с более низким score (exploration).
  • DYN_ROUTER_REPLICA_SYNC — включить синхронизацию replica (по умолчанию: false)
  • DYN_ROUTER_TRACK_ACTIVE_BLOCKS — отслеживать active blocks (по умолчанию: true)
  • DYN_ROUTER_TRACK_OUTPUT_BLOCKS — отслеживать output blocks во время генерации (по умолчанию: false)
  • Подробнее см. KV cache routing design.

Интеграция с Service Mesh (Istio)

При работе под service mesh, таким как Istio, mesh sidecar proxy может конфликтовать с собственным TLS-сервером EPP, вызывая ошибки соединения (double-TLS). Чтобы этого избежать, mesh нужно явно указать, как подключаться к сервису EPP, через Istio DestinationRule.

Dynamo operator может автоматически создавать такой DestinationRule. Включите это, задав параметры dynamo.serviceMesh при установке или обновлении Helm chart Dynamo platform:

helm install dynamo deploy/helm/charts/platform \
--set dynamo.serviceMesh.enabled=true

Или эквивалентно в custom values file:

dynamo:
serviceMesh:
enabled: true
provider: "istio"
istio:
tlsMode: "SIMPLE"
insecureSkipVerify: true

Параметры Helm

ParameterTypeDefaultDescription
dynamo.serviceMesh.enabledboolfalseВключить автоматическую генерацию DestinationRule для сервисов EPP.
dynamo.serviceMesh.providerstring"istio"Provider service mesh. Поддерживается только "istio".
dynamo.serviceMesh.istio.tlsModestring"SIMPLE"TLS mode для DestinationRule. Поддерживаемые значения: DISABLE, SIMPLE, MUTUAL, ISTIO_MUTUAL.
dynamo.serviceMesh.istio.insecureSkipVerifybooltrueПропустить проверку TLS certificate. Устанавливайте true, когда EPP использует self-signed certificates (по умолчанию).

CRD Istio (networking.istio.io) должны быть установлены в кластере до включения этой возможности. Operator определяет доступность Istio при запуске — если CRD отсутствуют, reconciliation DestinationRule пропускается даже при serviceMesh.enabled=true.

Когда функция включена, operator создает DestinationRule для каждого сервиса EPP, эквивалентный:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: <epp-service-name>
spec:
host: <epp-service-name>.<namespace>.svc.cluster.local
trafficPolicy:
tls:
mode: SIMPLE
insecureSkipVerify: true

Если вы не используете Helm chart Dynamo operator, вам нужно создавать этот DestinationRule вручную для каждого сервиса EPP. Без него стандартная mTLS policy Istio будет конфликтовать с gRPC TLS endpoint EPP.

Исключение Istio sidecar для inference-gateway

Когда включена namespace-level Istio sidecar injection (istio-injection=enabled), pod agentgateway-proxy тоже получает Istio sidecar. Этот sidecar перехватывает ext_proc gRPC connection от agentgateway-proxy к EPP (порт 9002) и направляет его через PassthroughCluster, что ломает соединение и приводит к тому, что все inference requests возвращают HTTP 500 с пустым body.

Решение - заставить agentgateway проставлять sidecar.istio.io/inject: "false" в template proxy pod, чтобы Istio webhook пропускал этот pod. Pod'ы EPP и workers при этом по-прежнему получают sidecar'ы обычным образом.

У вас есть два варианта, в зависимости от того, как настроен gateway:

Вариант A: AgentgatewayParameters на уровне gateway (рекомендуется)

Именно это автоматически делает install_gaie_crd_agentgateway.sh. Он влияет только на proxy pod'ы inference-gateway и не затрагивает другие gateways, управляемые agentgateway.

  1. Создайте ресурс AgentgatewayParameters в том же namespace, что и Gateway inference-gateway (например, dynamo-cloud). Он должен находиться рядом с Gateway, потому что spec.infrastructure.parametersRef в Gateway API - это LocalParametersReference, у него нет поля namespace.

    apiVersion: agentgateway.dev/v1alpha1
    kind: AgentgatewayParameters
    metadata:
    name: inference-gateway-params
    namespace: dynamo-cloud # same as the Gateway
    spec:
    deployment:
    spec:
    template:
    metadata:
    annotations:
    sidecar.istio.io/inject: "false"

    Примените его через server-side apply (agentgateway рекомендует именно этот способ):

    kubectl apply --server-side -n dynamo-cloud -f agentgateway-params.yaml
  2. Привяжите существующий Gateway к этому ресурсу. Если Gateway уже создан, пропатчите его на месте:

    kubectl patch gateway inference-gateway -n dynamo-cloud --type='merge' -p '{
    "spec": {
    "infrastructure": {
    "parametersRef": {
    "group": "agentgateway.dev",
    "kind": "AgentgatewayParameters",
    "name": "inference-gateway-params"
    }
    }
    }
    }'

    Или включите блок infrastructure прямо в manifest Gateway:

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
    name: inference-gateway
    namespace: dynamo-cloud
    spec:
    gatewayClassName: agentgateway
    infrastructure:
    parametersRef:
    group: agentgateway.dev
    kind: AgentgatewayParameters
    name: inference-gateway-params
    listeners:
    - name: http
    port: 80
    protocol: HTTP
  3. agentgateway пересоздаст proxy pod. Убедитесь, что в новом pod больше нет контейнера istio-proxy:

    kubectl get pod -l gateway.networking.k8s.io/gateway-name=inference-gateway \
    -n dynamo-cloud \
    -o jsonpath='{.items[0].spec.containers[*].name}{"\n"}'
    # Expect: agentgateway (NOT "agentgateway istio-proxy")

Вариант B: пропатчить дефолтный CR AgentgatewayParameters (на весь кластер)

Контроллер agentgateway создает дефолтный ресурс AgentgatewayParameters с именем agentgateway в agentgateway-system. Любой Gateway, который не задает spec.infrastructure.parametersRef, наследует этот дефолт. Его патч влияет на все proxy, которыми управляет agentgateway, в кластере.

kubectl patch agentgatewayparameters agentgateway -n agentgateway-system \
--type='merge' -p '{
"spec": {
"deployment": {
"spec": {
"template": {
"metadata": {
"annotations": {
"sidecar.istio.io/inject": "false"
}
}
}
}
}
}
}'

Используйте вариант A, если у вас в кластере несколько gateways под управлением agentgateway и вы хотите отключить injection только для proxy inference-gateway.

Эта annotation ничего не делает в кластерах без Istio, поэтому ее безопасно задавать без условий.

Если одновременно заданы DestinationRule (для EPP) и sidecar exclusion через AgentgatewayParameters (для agentgateway-proxy), end-to-end GAIE inference корректно работает при namespace-level injection Istio.

6. Проверьте установку

Проверьте, что все ресурсы развернуты корректно:

kubectl get inferencepool -n ${NAMESPACE}
kubectl get httproute -n ${NAMESPACE}
kubectl get service -n ${NAMESPACE}
kubectl get gateway -n ${NAMESPACE}

Пример вывода:

# kubectl get inferencepool
NAME AGE
qwen-pool 33m

# kubectl get httproute
NAME HOSTNAMES AGE
qwen-route 33m

7. Использование

Inference Gateway предоставляет HTTP endpoints для inference модели.

1: Получите URL gateway для вашего кластера k8s

a. Чтобы протестировать интеграцию в minikube, действуйте так: Используйте minikube tunnel, чтобы сделать gateway доступным на хосте. Это требует sudo на host machine. Альтернативно можно использовать port-forward, как показано в варианте (b).

# in first terminal
ps aux | grep "minikube tunnel" | grep -v grep # make sure minikube tunnel is not already running.
minikube tunnel # start the tunnel

# in second terminal where you want to send inference requests
GATEWAY_URL=$(kubectl get svc inference-gateway -n my-model -o jsonpath='{.spec.clusterIP}') && echo $GATEWAY_URL

b. Чтобы протестировать на кластере, используйте команды ниже:

используйте port-forward, чтобы сделать gateway доступным на хосте

# in first terminal
kubectl port-forward svc/inference-gateway 8000:80 -n ${NAMESPACE}
# for NAMESPACE use the namespace where the Gateway service was created, for example agentgateway-system

# in second terminal where you want to send inference requests
GATEWAY_URL=http://localhost:8000

2: Проверьте модели, развернутые в inference gateway

a. Запросите список моделей:

# во втором терминале, где задан `GATEWAY_URL`
curl $GATEWAY_URL/v1/models | jq .
# или если вы добавили имя host в http route:
curl -H "Host: llama3-70b-disagg.example.com" $GATEWAY_URL/v1/models | jq .

Пример вывода:

{
"data": [
{
"created": 1753768323,
"id": "Qwen/Qwen3-0.6B",
"object": "object",
"owned_by": "nvidia"
}
],
"object": "list"
}

b. Отправьте inference request в gateway:

MODEL_NAME="Qwen/Qwen3-0.6B"
curl $GATEWAY_URL/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "'"${MODEL_NAME}"'",
"messages": [
{
"role": "user",
"content": "In the heart of Eldoria, an ancient land of boundless magic and mysterious creatures, lies the long-forgotten city of Aeloria. Once a beacon of knowledge and power, Aeloria was buried beneath the shifting sands of time, lost to the world for centuries. You are an intrepid explorer, known for your unparalleled curiosity and courage, who has stumbled upon an ancient map hinting at ests that Aeloria holds a secret so profound that it has the potential to reshape the very fabric of reality. Your journey will take you through treacherous deserts, enchanted forests, and across perilous mountain ranges. Your Task: Character Background: Develop a detailed background for your character. Describe their motivations for seeking out Aeloria, their skills and weaknesses, and any personal connections to the ancient city or its legends. Are they driven by a quest for knowledge, a search for lost familt clue is hidden."
}
],
"stream":false,
"max_tokens": 30,
"temperature": 0.0
}'

or

MODEL_NAME="RedHatAI/Llama-3.3-70B-Instruct-FP8-dynamic"
curl -H "Host: llama3-70b-disagg.example.com" http://localhost:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"model": "'"${MODEL_NAME}"'",
"messages": [
{
"role": "user",
"content": "In the heart of Eldoria, an ancient land of boundless magic and mysterious creatures, lies the long-forgotten city of Aeloria. Once a beacon of knowledge and power, Aeloria was buried beneath the shifting sands of time, lost to the world for centuries. You are an intrepid explorer, known for your unparalleled curiosity and courage, who has stumbled upon an ancient map hinting at ests that Aeloria holds a secret so profound that it has the potential to reshape the very fabric of reality. Your journey will take you through treacherous deserts, enchanted forests, and across perilous mountain ranges. Your Task: Character Background: Develop a detailed background for your character. Describe their motivations for seeking out Aeloria, their skills and weaknesses, and any personal connections to the ancient city or its legends. Are they driven by a quest for knowledge, a search for lost familt clue is hidden."
}
],
"stream":false,
"max_tokens": 30,
"temperature": 0.0
}'

Пример inference output:

{
"choices": [
{
"finish_reason": "stop",
"index": 0,
"logprobs": null,
"message": {
"audio": null,
"content": "<think>\nOkay, I need to develop a character background for the user's query. Let me start by understanding the requirements. The character is an",
"function_call": null,
"refusal": null,
"role": "assistant",
"tool_calls": null
}
}
],
"created": 1753768682,
"id": "chatcmpl-772289b8-5998-4f6d-bd61-3659b684b347",
"model": "Qwen/Qwen3-0.6B",
"object": "chat.completion",
"service_tier": null,
"system_fingerprint": null,
"usage": {
"completion_tokens": 29,
"completion_tokens_details": null,
"prompt_tokens": 196,
"prompt_tokens_details": null,
"total_tokens": 225
}
}

Если в кластере работает больше одного HTTPRoute Добавьте host в http-route.yaml и используйте заголовок curl -H "Host: llama3-70b-agg.example.com" ... или curl -H "Host: llama3-70b-disagg.example.com" http://localhost:8000/v1/models

spec:
hostnames:
- llama3-70b-agg.example.com

8. Удаление установки

Если нужно удалить установку, выполните:

kubectl delete dynamoGraphDeployment vllm-agg
helm uninstall dynamo-gaie -n my-model

# Чтобы удалить GAIE
# 1. Удалите inference-gateway
kubectl delete gateway inference-gateway --ignore-not-found

# 2. Удалите Helm release agentgateway
helm uninstall agentgateway -n agentgateway-system
helm uninstall agentgateway-crds -n agentgateway-system

# 3. Удалите namespace agentgateway-system (необязательно, очистит все внутри)
kubectl delete namespace agentgateway-system --ignore-not-found

# 4. Удалите CRD Inference Extension
IGW_LATEST_RELEASE=v1.5.0-rc.2
kubectl delete -f https://github.com/kubernetes-sigs/gateway-api-inference-extension/releases/download/${IGW_LATEST_RELEASE}/manifests.yaml --ignore-not-found

# 5. Удалите CRD Gateway API
GATEWAY_API_VERSION=v1.5.1
kubectl delete -f https://github.com/kubernetes-sigs/gateway-api/releases/download/$GATEWAY_API_VERSION/standard-install.yaml --ignore-not-found

Интеграция Gateway API Inference Extension

В этом разделе описана обновленная реализация плагина для Gateway API Inference Extension v1.5.0-rc.2.

Операции bookkeeping router

EPP выполняет операции bookkeeping router Dynamo, чтобы Router FrontEnd не пришлось синхронизировать свое состояние.

Подсказки маршрутизации в заголовках

Начиная с v1.5.0-rc.1, EPP использует headers и body mutations для передачи routing decisions. Плагины задают HTTP headers для выбора worker и внедряют заранее вычисленные token IDs в request body (nvext.token_data), чтобы frontend sidecar мог пропустить лишнюю tokenization.

Заголовки, задаваемые плагинами Dynamo

ЗаголовокОписаниеКем задается
x-worker-instance-idID основного worker (decode worker в disagg mode)kv-aware-scorer
x-prefill-instance-idID prefill worker (только в disaggregated mode)kv-aware-scorer