본문으로 건너뛰기

NVIDIA Dynamo로 모델 서빙

NVIDIA Dynamo의 DynamoGraphDeployment로 GLM-5.3을 vLLM 백엔드에 배포하고, OpenAI 호환 API를 네임스페이스의 Gateway에 연결합니다.

시작하기 전에

  • 사용 전 준비를 참고하여 네임스페이스와 공통 리소스를 확인합니다.
  • Queue와 Scheduler 사용을 참고하여 serving LocalQueue를 준비합니다.
  • models PVC의 GLM-5.3 디렉터리에 모델 파일을 준비합니다.
  • 외부 엔드포인트에 인증 또는 트래픽 정책을 적용하려면 Gateway 구성을 먼저 확인합니다.

구성 요소

구성리소스기능
서빙DynamoGraphDeploymentFrontend와 vLLM Worker 배포, OpenAI 호환 API 제공
Gateway 연결Backend, AIServiceBackend, AIGatewayRouteDynamo Frontend Service를 호스트명과 모델 이름으로 라우팅
트래픽BackendTrafficPolicy타임아웃, 로드밸런싱, 서킷브레이커, 재시도 설정

Step 1. DynamoGraphDeployment 생성

DynamoGraphDeployment는 요청을 받는 Frontend와 모델을 실행하는 Worker로 구성됩니다. Worker의 replicas는 모델 인스턴스 수를 의미합니다.

주요 설정값은 다음과 같습니다.

필드설명
spec.backendFramework추론 백엔드. 이 예시에서는 vllm 사용
spec.components[].type컴포넌트 역할. frontend 또는 worker
spec.components[].runtimeVersionOverrideDynamo 런타임 버전. Worker 이미지 태그와 동일하게 지정
podTemplate.spec.schedulerNameWorker에 사용할 Scheduler. 이 예시에서는 kai-scheduler
--served-model-nameAPI 요청 본문의 model 값과 Gateway의 모델 매칭 값
--tensor-parallel-size텐서 병렬 GPU 수. nvidia.com/gpu 요청값과 동일하게 지정
--gpu-memory-utilizationvLLM이 사용할 GPU 메모리 비율

다음 매니페스트를 dynamo-graph-deployment.yaml로 저장합니다.

dynamo-graph-deployment.yaml
apiVersion: nvidia.com/v1beta1
kind: DynamoGraphDeployment
metadata:
name: glm-5-3
namespace: <사용자 namespace>
spec:
backendFramework: vllm
components:
- name: Frontend
type: frontend
replicas: 1
podTemplate:
metadata:
labels:
kai.scheduler/enabled: "true"
kueue.x-k8s.io/queue-name: serving
kueue.x-k8s.io/priority-class: high
annotations:
sidecar.istio.io/inject: "false"
spec:
containers:
- name: main
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2
resources:
requests:
cpu: "2"
memory: 4Gi
limits:
cpu: "4"
memory: 8Gi

- name: VllmWorker
type: worker
replicas: 2
runtimeVersionOverride: "1.4.2"
podTemplate:
metadata:
labels:
kai.scheduler/enabled: "true"
kueue.x-k8s.io/queue-name: serving
kueue.x-k8s.io/priority-class: high
annotations:
sidecar.istio.io/inject: "false"
spec:
schedulerName: kai-scheduler
containers:
- name: main
image: nvcr.io/nvidia/ai-dynamo/vllm-runtime:1.4.2
command: ["sh", "-c"]
args:
- |
exec python3 -m dynamo.vllm \
--model=/mnt/models/GLM-5.3 \
--served-model-name=zai-org/GLM-5.3 \
--dyn-tool-call-parser=glm47 \
--dyn-reasoning-parser=glm45 \
--tensor-parallel-size=8 \
--enable-expert-parallel \
--kv-cache-dtype=fp8_e4m3 \
--max-model-len=131072 \
--max-num-seqs=128 \
--max-num-batched-tokens=32768 \
'--speculative-config={"method":"mtp","num_speculative_tokens":5}' \
--gpu-memory-utilization=0.95 \
--safetensors-load-strategy=prefetch
env:
- name: VLLM_DEEP_GEMM_WARMUP
value: skip
- name: NCCL_SOCKET_IFNAME
value: eth0
- name: GLOO_SOCKET_IFNAME
value: eth0
resources:
limits:
nvidia.com/gpu: "8"
cpu: "200"
memory: 1900Gi
requests:
nvidia.com/gpu: "8"
cpu: "200"
memory: 1900Gi
volumeMounts:
- name: models
mountPath: /mnt
- name: devshm
mountPath: /dev/shm
volumes:
- name: models
persistentVolumeClaim:
claimName: models
- name: devshm
emptyDir:
medium: Memory
sizeLimit: 64Gi
주의

Worker의 CPU, 메모리, GPU 요청값은 노드 단위로 설정되어 있습니다. 사용하는 GPU 노드 사양과 할당량이 예시와 다르면 requestslimits를 함께 조정하세요.

매니페스트를 적용합니다.

kubectl apply -f dynamo-graph-deployment.yaml

생성이 완료되면 <DynamoGraphDeployment 이름>-frontend 형식의 Service가 만들어지고 8000 포트로 OpenAI 호환 API를 제공합니다. 이 예시의 Service 이름은 glm-5-3-frontend입니다.

Step 2. Gateway에 연결

Frontend Service를 Gateway에 연결하려면 Backend, AIServiceBackend, AIGatewayRoute를 생성하고, 타임아웃과 재시도는 BackendTrafficPolicy로 설정합니다.

각 리소스의 필드 설명과 예시 YAML은 Gateway 설정 - AI Gateway 구성, Gateway 설정 - BackendTrafficPolicy를 따릅니다. Dynamo 구성에서는 다음 값을 사용합니다.

리소스필드
Backendspec.endpoints[].fqdn.hostnameglm-5-3-frontend.<사용자 namespace>.svc.cluster.local
Backendspec.endpoints[].fqdn.port8000
AIServiceBackendspec.schema.nameOpenAI
AIGatewayRoutespec.rules[].matches[].headers[].valuezai-org/GLM-5.3
AIGatewayRoutespec.rules[].timeouts.request1800s
BackendTrafficPolicyspec.targetRefs[].nameAIGatewayRoute 이름

Gateway의 모델 매칭 값은 Worker의 --served-model-name과 같아야 합니다.

인증과 Rate Limit이 필요하면 Gateway 설정 - 인증 구성, Gateway 설정 - Rate Limit 구성을 추가로 적용합니다.

Step 3. 배포 상태 확인

kubectl get dynamographdeployment glm-5-3 -n <사용자 namespace>
kubectl get pods,service -n <사용자 namespace> -o wide
kubectl get workload -n <사용자 namespace>

Worker Pod가 모델을 로드하고 Running 상태가 되었는지 확인합니다. Pod가 SchedulingGated 상태라면 Queue와 우선순위를 확인하고, Pending 상태라면 KAI Scheduler 이벤트와 GPU 가용량을 확인합니다.

kubectl describe pod <Worker Pod 이름> -n <사용자 namespace>
kubectl logs <Worker Pod 이름> -n <사용자 namespace> -c main

Step 4. 모델 호출

인증 구성을 적용한 경우 authorization 헤더에 API 키를 넣습니다.

curl -s https://<호스트명>/v1/chat/completions \
-H "authorization: Bearer <API 키>" \
-H "content-type: application/json" \
-d '{"model":"zai-org/GLM-5.3","messages":[{"role":"user","content":"안녕"}],"max_tokens":16}'

리소스 정리

더 이상 사용하지 않는 DynamoGraphDeployment를 삭제합니다.

kubectl delete dynamographdeployment glm-5-3 -n <사용자 namespace>

Gateway 리소스를 함께 제거할 때는 BackendTrafficPolicy, AIGatewayRoute, AIServiceBackend, Backend 순서로 삭제합니다.