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

For clean Markdown content of this page, append .md to this URL. For the complete documentation index, see https://docs.nvidia.com/dynamo/llms.txt. For full content including API reference and SDK examples, see https://docs.nvidia.com/dynamo/llms-full.txt.

Передача KV-кэша

Общие возможности и конфигурацию TensorRT-LLM см. в справочном руководстве.


В архитектурах disaggregated serving KV-кэш должен передаваться между worker'ами prefill и decode. TensorRT-LLM поддерживает два способа такой передачи:

Использование NIXL для передачи KV-кэша

Чтобы запустить disaggregated service, см. раздел Disaggregated Serving, где объясняется, как поднять deployment.

Метод по умолчанию: NIXL

По умолчанию TensorRT-LLM использует NIXL (NVIDIA Inference Xfer Library) с UCX (Unified Communication X) в качестве backend для передачи KV-кэша между worker'ами prefill и decode. NIXL - это высокопроизводительная библиотека обмена данными NVIDIA, предназначенная для эффективной передачи данных в распределённых GPU-средах.

Указание backend'ов для NIXL

TensorRT-LLM поддерживает два коммуникационных backend'а NIXL: UCX и LIBFABRIC. Если backend явно не указан, по умолчанию используется UCX. Dynamo сейчас поддерживает оба backend'а. Для deployment'ов AWS EFA протестированным и рекомендуемым backend'ом является UCX с транспортом SRD (см. AWS EFA ниже).

Альтернативный метод: UCX

TensorRT-LLM также может напрямую использовать UCX (Unified Communication X) для передачи KV-кэша между worker'ами prefill и decode. Чтобы включить UCX как backend передачи KV-кэша, задайте cache_transceiver_config.backend: UCX в YAML-файле конфигурации engine.

Переменная среды TRTLLM_USE_UCX_KVCACHE=1 вместе с cache_transceiver_config.backend: DEFAULT не включает UCX. Нужно явно задать backend: UCX в конфигурации.

AWS EFA

В AWS UCX использует транспорт SRD (Scalable Reliable Datagram) поверх устройств EFA. NIXL автоматически обнаруживает устройства EFA rdmap* через UCX - на уровне NIXL ничего менять не нужно.

Варианты image:

  • Предварительно собранный EFA image (только AMD64): на NGC доступен отдельный EFA image со встроенным EFA SDK. Его рекомендуется использовать для инстансов AMD64 (например, p5.48xlarge):
nvcr.io/nvidia/ai-dynamo/tensorrtllm-runtime:1.2.0-efa-amd64

Все доступные EFA image см. в Release Artifacts.

  • Подход с host mount (ARM64 / GB200): предварительно собранный EFA image для ARM64 не публикуется. Используйте стандартный image tensorrtllm-runtime и монтируйте EFA SDK с host node. Именно так мы тестировали на GB200 NVL72:
volumeMounts:
- name: efa-sdk
mountPath: /opt/amazon/efa
volumes:
- name: efa-sdk
hostPath:
path: /opt/amazon/efa

Запросы ресурсов EFA:

resources:
requests:
vpc.amazonaws.com/efa: "4"
limits:
vpc.amazonaws.com/efa: "4"

Обязательные переменные среды для worker'ов EFA (задайте и для prefill, и для decode):

env:
- name: FI_PROVIDER
value: "efa"
- name: FI_EFA_USE_DEVICE_RDMA
value: "1"
- name: FI_EFA_ENABLE_SHM_TRANSFER
value: "0"
- name: LD_LIBRARY_PATH
value: "/opt/amazon/efa/lib:/usr/local/lib:/usr/lib"
FI_EFA_ENABLE_SHM_TRANSFER должен быть 0. Передачи через SHM ломают регистрации GPU-буферов NIXL.

Security context: AWS EFA сейчас требует privileged mode:

securityContext:
privileged: true

Несовпадение ABI NIXL Plugin при multinode decode

При запуске multinode decode лидер decode запускает worker'ы через mpirun -> mgmn_worker_node, который загружает встроенный NIXL из TRT-LLM, а не системный nixl_cu13. Значение NIXL_PLUGIN_DIR по умолчанию у контейнера указывает на системные plugins, несовместимые по ABI со встроенным NIXL TRT-LLM. Переопределяйте это только в службе decode:

env:
- name: NIXL_PLUGIN_DIR
value: "/opt/dynamo/venv/lib/python3.12/site-packages/tensorrt_llm/libs/nixl/plugins"

Не задавайте это для worker'ов prefill - они используют nixl_cu13, который совместим с системными plugins.

ComputeDomain для GB200 NVL72

На стойках GB200 NVL72 для корректной инициализации cuMem/NVLS нужен ComputeDomain CR. Без него worker'ы завершаются с NCCL error 'unhandled system error' во время загрузки модели.

apiVersion: resource.nvidia.com/v1beta1
kind: ComputeDomain
metadata:
name: my-compute-domain
spec:
numNodes: 3 # total nodes across prefill + decode
channel:
resourceClaimTemplate:
name: my-compute-domain-channel

И prefill, и decode services должны включать ResourceClaims:

resources:
claims:
- name: compute-domain-channel
extraPodSpec:
resourceClaims:
- name: compute-domain-channel
resourceClaimTemplateName: my-compute-domain-channel

Обязательные переменные среды NCCL для GB200:

env:
- name: NCCL_MNNVL_ENABLE
value: "1"
- name: NCCL_CUMEM_ENABLE
value: "1"
- name: NCCL_NVLS_ENABLE
value: "1"
- name: NVIDIA_GDRCOPY
value: "1"

Проверка, что EFA активно

После deployment убедитесь по журналам worker'а, что NIXL использует SRD поверх EFA:

kubectl logs <prefill-pod> | grep -iE "NixlTransfer|srd|rdmap"

Ожидаемый вывод:

NixlTransferAgent using NIXL backend: UCX
ucp_context_2 self cfg#1 rma_am(srd/rdmap40s0:1) am(srd/rdmap40s0:1 srd/rdmap62s0:1 ...)
NixlTransferAgent mAddress: 100.x.x.x:32939
  • srd/rdmap* подтверждает транспорт SRD поверх устройств EFA
  • Несколько записей rdmap соответствуют одному устройству EFA на GPU