최근 몇 년간 AI 추론은 단일 모델, 단일 파드 형태의 단순한 배포 방식에서 벗어나, 여러 구성 요소로 이뤄진 복잡한 시스템으로 진화하고 있습니다. 이제 하나의 모델을 배포할 때도 prefill, decode, vision encoder, key-value(KV) router 등 다양한 컴포넌트로 구성되는 경우가 많으며, 여기에 여러 모델 인스턴스가 협력해 추론, 검색, 멀티모달 작업을 수행하는 에이전트 파이프라인까지 등장하고 있습니다.
이처럼 시스템 구조가 복잡해지면서, 확장과 오케스트레이션의 관점도 바뀌고 있습니다. 단순히 하나의 파드를 N개 복제해 실행하는 것이 아니라, 여러 구성 요소를 하나의 논리적 시스템처럼 조율하는 것이 중요해졌습니다. 이를 위해서는 각 컴포넌트가 요구하는 리소스와 설정을 이해하고, 함께 묶어 확장 및 스케줄링하며, 의도한 순서대로 실행하고, 네트워크 토폴로지를 고려해 클러스터 내에 적절히 배치해야 합니다. 결국, 파드 하나하나가 아닌 시스템 전체의 종속성과 구조를 고려한 통합적인 운영이 필요합니다.
이러한 복잡성을 해결하기 위해, NVIDIA는 NVIDIA Dynamo에 새로운 모듈형 컴포넌트로 NVIDIA Grove를 통합했다고 발표합니다. Grove는 최신 ML 추론 워크로드를 쿠버네티스 클러스터에서 유연하게 실행할 수 있도록 설계된 쿠버네티스 API로, 현재 오픈 소스로 공개되어 있으며 ai-dynamo/grove GitHub 리포지토리에서 확인하실 수 있습니다.
NVIDIA Grove가 전체 추론 시스템을 어떻게 오케스트레이션할까요?
Grove를 사용하면 단일 복제본 수준의 멀티노드 추론 배포를 수만 개의 GPU를 사용하는 데이터센터 규모로 확장할 수 있습니다. Grove는 prefill, decode, 라우팅 등 전체 추론 서빙 시스템을 하나의 쿠버네티스 CR(Custom Resource)로 정의할 수 있도록 지원합니다.
이 단일 스펙을 바탕으로, 플랫폼은 계층형 gang 스케줄링, 토폴로지 인식 배치, 다단계 오토스케일링, 명시적 시작 순서 지정 등을 자동으로 조율합니다. 별도의 스크립트나 YAML 파일, 커스텀 컨트롤러 없이도 시스템 동작을 정밀하게 제어할 수 있습니다.
Grove는 원래 멀티노드 분산 추론 시스템의 오케스트레이션 문제를 해결하기 위해 개발되었으며, 기존의 단일 노드 집약형 추론부터 다중 모델 기반의 에이전트 파이프라인까지 다양한 실사용 추론 아키텍처에 유연하게 적용될 수 있도록 설계되었습니다. Grove를 통해 개발자는 복잡한 AI 스택을 간결하고 선언적인 방식으로, 특정 프레임워크에 종속되지 않고 정의할 수 있습니다.
멀티노드 분산 서빙을 위한 사전 요구 사항은 아래에 자세히 설명합니다.
상호 의존적인 구성 요소를 위한 다단계 오토스케일링
현대적인 추론 시스템은 다양한 수준의 오토스케일링을 필요로 합니다. 예를 들어, 트래픽 급증에 대응하기 위한 prefill 워커 단위의 스케일링, prefill 리더와 그에 연결된 워커 그룹 단위의 스케일링, 전체 서비스 복제본 단위의 용량 확장 등입니다. 이러한 스케일링 계층들은 서로 영향을 주고받습니다. 예를 들어 prefill 워커를 확장하면 decode 용량도 함께 늘려야 하며, 새로운 서비스 복제본이 추가되면 구성 요소 간의 비율도 적절히 맞춰야 합니다. 기존의 파드 단위 오토스케일링으로는 이러한 상호 의존성을 효과적으로 처리할 수 없습니다.
복구 및 롤링 업데이트를 포함한 시스템 수준의 수명 주기 관리
서비스 복구나 업데이트는 개별 쿠버네티스 파드가 아닌, 전체 서비스 인스턴스를 기준으로 이루어져야 합니다. 예를 들어, 장애가 발생한 prefill 워커는 재시작 후 리더와 정확히 다시 연결되어야 하며, 롤링 업데이트 시에도 네트워크 토폴로지를 유지해 지연 시간을 최소화해야 합니다. 플랫폼은 여러 구성 요소로 이루어진 시스템을 하나의 운영 단위로 간주하고, 성능과 가용성을 모두 고려한 방식으로 관리해야 합니다.
유연한 계층형 gang 스케줄링
AI 워크로드 스케줄러는 기존의 all-or-nothing 방식에서 벗어나, 보다 유연한 gang 스케줄링을 지원해야 합니다. 분산형 서빙 환경에서는 필수 구성 요소 조합(예: prefill과 decode 워커 최소 하나씩)을 보장하면서도, 각 구성 요소 유형을 독립적으로 확장할 수 있어야 합니다. 문제는 workload 패턴에 따라 prefill과 decode의 스케일링 비율이 달라진다는 점입니다.
기존 gang 스케줄링은 모든 구성 요소를 하나의 그룹으로 묶어 함께 확장해야 하기 때문에, 이와 같은 유연한 스케일링이 불가능합니다. 따라서 시스템은 최소한의 구성 요소 조합을 보장하면서도 유연하게 확장할 수 있도록 하는 정책이 필요합니다.
토폴로지를 인식하는 스케줄링
구성 요소의 배치는 성능에 직접적인 영향을 줍니다. 예를 들어, NVIDIA GB200 NVL72 같은 시스템에서는 prefill과 decode 파드를 동일한 NVIDIA NVLink 도메인에 스케줄링하면 KV-cache 전송 지연을 최소화할 수 있습니다. 따라서 스케줄러는 물리적 네트워크 토폴로지를 이해하고, 관련된 컴포넌트는 인접하게 배치하면서도 복제본은 고가용성을 위해 분산시켜야 합니다.
역할 기반 오케스트레이션과 명시적인 시작 순서
구성 요소마다 역할, 설정, 시작 조건이 다릅니다. 예를 들어 prefill과 decode 리더는 일반 워커와는 다른 특화된 초기화 로직을 실행하며, 리더가 준비되기 전에는 워커가 시작되어서는 안 됩니다. 플랫폼은 이러한 역할별 설정과 의존성을 기반으로, 안정적인 초기화를 보장해야 합니다.
이 모든 요소를 종합해 보면, 추론 시스템을 실제 운영 방식에 맞춰 선언적으로 정의할 수 있어야 합니다. 즉, 다중 역할, 다중 노드, 명확한 다단계 종속성을 표현할 수 있어야 하며, 플랫폼은 이 정의를 기반으로 스케줄링, 스케일링, 복구, 업데이트를 자동으로 수행해야 합니다.
Grove의 프리미티브 구성 요소
고성능 추론 프레임워크는 Grove의 계층형 API를 활용해 역할별 로직과 다단계 스케일링을 선언적으로 정의하며, 이를 통해 다양한 클러스터 환경에서도 일관되고 최적화된 배포를 실현할 수 있습니다. Grove는 Workload API에서 세 가지 계층형 Custom Resource를 사용해 다중 구성 요소 AI 워크로드를 오케스트레이션합니다.
예를 들어 Figure 1에서는 PodClique A가 프론트엔드 컴포넌트를, B와 C가 각각 prefill-leader와 prefill-worker를, D와 E가 decode-leader와 decode-worker를 나타냅니다.

- PodClique는 prefill 리더 또는 워커, decode 리더 또는 워커, 프론트엔드 서비스 등 특정 역할을 수행하는 쿠버네티스 파드 그룹을 나타내며, 각각 독립적인 설정과 스케일링 로직을 가집니다.
- PodCliqueScalingGroup는 prefill 리더와 그에 연결된 워커처럼 함께 하나의 모델 인스턴스를 구성하고 반드시 함께 스케일링되어야 하는 PodClique들을 묶습니다.
- PodCliqueSet은 전체 멀티 컴포넌트 워크로드를 정의하며, 시작 순서, 스케일링 정책, gang-scheduling 제약 조건을 지정해 모든 구성 요소가 함께 시작되거나 함께 실패하도록 보장합니다. 용량을 확장해야 할 경우, Grove는 전체 PodCliqueSet의 완전한 복제본을 생성하고, 이를 클러스터 전반에 분산시키는 spread 제약 조건을 적용해 고가용성을 확보합니다. 이때 각 복제본 내 컴포넌트들은 최적의 성능을 위해 네트워크 상에서 밀접하게 배치됩니다.

Grove가 적용된 쿠버네티스 클러스터는 두 가지 핵심 컴포넌트로 구성됩니다. 하나는 Grove Operator이고, 다른 하나는 PodGang 리소스를 이해할 수 있는 스케줄러입니다. 대표적으로는 NVIDIA Run:ai 플랫폼의 오픈소스 서브컴포넌트인 KAI Scheduler가 있습니다.
PodCliqueSet 리소스가 생성되면 Grove Operator는 해당 사양을 검증한 뒤, 이를 실제로 실행하기 위한 쿠버네티스 오브젝트들을 자동으로 생성합니다. 여기에는 PodClique, PodCliqueScalingGroup, 관련 파드, 서비스, 시크릿, 오토스케일링 정책 등이 포함됩니다. 이 과정에서 Grove는 Scheduler API의 일부인 PodGang 리소스를 생성하여, 워크로드 정의를 클러스터 스케줄러가 이해할 수 있는 구체적인 스케줄링 제약 조건으로 변환합니다.
각 PodGang은 워크로드에 대한 세부 요구사항을 포함합니다. 예를 들어, 최소 복제본 보장, 컴포넌트 간 네트워크 대역폭을 최적화하기 위한 토폴로지 선호도, 고가용성을 위한 spread 제약 등이 있습니다. 이를 통해 클러스터 전체에서 토폴로지 기반의 배치와 효율적인 리소스 활용이 가능해집니다.
스케줄러는 PodGang 리소스를 지속적으로 감지하고 gang 스케줄링 로직을 적용합니다. 이를 통해 필요한 모든 컴포넌트가 함께 스케줄링되거나, 리소스가 준비될 때까지 대기하게 됩니다. 배치 결정은 GPU 토폴로지와 클러스터 로컬리티를 고려해 이루어집니다.
이 결과, prefill 서비스, decode 워커, 라우팅 컴포넌트 등 다중 구성 요소로 이루어진 AI 시스템이 올바른 순서로 시작되고, 네트워크 성능을 고려해 인접하게 배치되며, 장애 발생 시에도 하나의 그룹으로 함께 복구됩니다. 이를 통해 리소스 단편화를 방지하고, 부분적인 배포 실패 없이 안정적이고 효율적인 대규모 모델 서빙 파이프라인 운영이 가능해집니다.
Dynamo와 함께 Grove 시작하기
이 섹션에서는 Dynamo와 Grove를 사용해 KV-routing deployer 기반의 분산 서빙 아키텍처를 배포하는 방법을 안내합니다. Qwen3 0.6B 모델을 사용하며, prefill과 decode 워커를 분리한 구조의 분산 추론 워크로드를 Grove가 어떻게 관리하는지를 보여줍니다.
※ 이 예제는 Grove의 핵심 개념을 이해하기 위한 기초적인 예제입니다. 보다 복잡한 배포 구성은 ai-dynamo/grove GitHub 리포지토리를 참고하시기 바랍니다.
사전 준비 사항
다음 구성 요소들이 쿠버네티스 클러스터에 준비되어 있어야 합니다:
- GPU를 지원하는 쿠버네티스 클러스터
- 클러스터에 접근 가능한
kubectl설정 - Helm CLI 설치 완료
- Hugging Face 토큰 시크릿(
hf-token-secret) 생성하면, 아래 명령어를 사용해 생성할 수 있습니다:
kubectl create secret generic hf-token-secret \
--from-literal=HF_TOKEN=<insert_huggingface_token>
※ <insert_huggingface_token> 부분에는 본인의 Hugging Face 토큰을 입력해야 합니다. 이 토큰은 반드시 안전하게 보관해야 하며, 절대 소스 코드나 버전 관리 시스템에 커밋해서는 안 됩니다.
Step 1: 네임스페이스 생성
kubectl create namespace vllm-v1-disagg-router
Step 2: Dynamo CRD 및 Grove 포함 Dynamo Operator 설치
# 환경 변수 설정
export NAMESPACE=vllm-v1-disagg-router
export RELEASE_VERSION=0.5.1
# CRD 설치
helm fetch https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-crds-${RELEASE_VERSION}.tgz
helm install dynamo-crds dynamo-crds-${RELEASE_VERSION}.tgz --namespace default
# Dynamo Operator + Grove 설치
helm fetch https://helm.ngc.nvidia.com/nvidia/ai-dynamo/charts/dynamo-platform-${RELEASE_VERSION}.tgz
helm install dynamo-platform dynamo-platform-${RELEASE_VERSION}.tgz \
--namespace ${NAMESPACE} \
--create-namespace \
--set "grove.enabled=true"
Step 3: Grove 설치 확인
kubectl get crd | grep grove
예상 출력:
podcliques.grove.io
podcliquescalinggroups.grove.io
podcliquesets.grove.io
podgangs.scheduler.grove.io
podgangsets.grove.io
Step 4: DynamoGraphDeployment 구성 생성
다음은 프론트엔드 1개, decode 워커 2개, prefill 워커 1개로 구성된 분산 서빙 아키텍처를 정의하는 DynamoGraphDeployment 매니페스트입니다:
apiVersion: nvidia.com/v1alpha1
kind: DynamoGraphDeployment
metadata:
name: dynamo-grove
spec:
services:
Frontend:
dynamoNamespace: vllm-v1-disagg-router
componentType: frontend
replicas: 1
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.5.1
envs:
- name: DYN_ROUTER_MODE
value: kv
VllmDecodeWorker:
dynamoNamespace: vllm-v1-disagg-router
envFromSecret: hf-token-secret
componentType: worker
replicas: 2
resources:
limits:
gpu: "1"
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.5.1
workingDir: /workspace/components/backends/vllm
command:
- python3
- -m
- dynamo.vllm
args:
- --model
- Qwen/Qwen3-0.6B
VllmPrefillWorker:
dynamoNamespace: vllm-v1-disagg-router
envFromSecret: hf-token-secret
componentType: worker
replicas: 1
resources:
limits:
gpu: "1"
extraPodSpec:
mainContainer:
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:0.5.1
workingDir: /workspace/components/backends/vllm
command:
- python3
- -m
- dynamo.vllm
args:
- --model
- Qwen/Qwen3-0.6B
- --is-prefill-worker
Step 5: 구성 배포
kubectl apply -f dynamo-grove.yaml
Step 6: 배포 확인
Operator와 Grove 파드가 생성되었는지 확인합니다.
kubectl get pods -n ${NAMESPACE}
예상 출력:
dynamo-grove-0-frontend-xxxxx
dynamo-grove-0-vllmdecodeworker-xxxxx
dynamo-grove-0-vllmdecodeworker-xxxxx
dynamo-grove-0-vllmprefillworker-xxxxx
dynamo-platform-dynamo-operator-controller-manager-xxxxx
dynamo-platform-etcd-0
dynamo-platform-nats-0
Step 7: 배포 테스트
프론트엔드 포트 포워딩:
kubectl port-forward svc/dynamo-grove-frontend 8000:8000 -n ${NAMESPACE}
엔드포인트 테스트:
curl http://localhost:8000/v1/models
PodClique 리소스 확인 (선택 사항):
kubectl get podclique dynamo-grove-0-vllmdecodeworker -n vllm-v1-disagg-router -o yaml
더 알아보고 싶으신가요?
NVIDIA Grove는 완전한 오픈소스로 제공되며, ai-dynamo/grove GitHub 리포지토리에서 확인하실 수 있습니다. Grove는 NVIDIA Dynamo와 함께는 물론, 독립적인 컴포넌트로도, 고성능 AI 추론 엔진과도 결합해 쿠버네티스 환경에서 자유롭게 사용할 수 있습니다.
Grove 배포 가이드를 참고해 직접 시도해 보시고, 궁금한 점은 GitHub나 Discord를 통해 질문해 주세요. 커뮤니티의 기여, PR, 피드백은 언제나 환영합니다.
추가 리소스
- Grove가 소개된 Inference Office Hour 녹화본
- NVIDIA/KAI-Scheduler GitHub 리포지토리
- KAI Scheduler 개념 소개 자료
- NVIDIA Dynamo로 데이터센터 규모 AI 추론을 간소화하는 방법
감사의 말씀
NVIDIA Grove 프로젝트는 오픈소스 개발자, 테스터, 커뮤니티 여러분의 소중한 기여를 기반으로 성장해 왔습니다. 특히 SAP의 Madhav Bhargava, Saketh Kalaga, Frank Heine께 깊이 감사드립니다. 오픈소스는 협업을 통해 발전합니다. Grove에 함께해 주셔서 감사합니다.