NVIDIA Dynamo로 모델 서빙
NVIDIA Dynamo의 DynamoGraphDeployment로 GLM-5.3을 vLLM 백엔드에 배포하고, OpenAI 호환 API를 네임스페이스의 Gateway에 연결합니다.
시작하기 전에
- 사용 전 준비를 참고하여 네임스페이스와 공통 리소스를 확인합니다.
- Queue와 Scheduler 사용을 참고하여
servingLocalQueue를 준비합니다. modelsPVC의GLM-5.3디렉터리에 모델 파일을 준비합니다.- 외부 엔드포인트에 인증 또는 트래픽 정책을 적용하려면 Gateway 구성을 먼저 확인합니다.
구성 요소
| 구성 | 리소스 | 기능 |
|---|---|---|
| 서빙 | DynamoGraphDeployment | Frontend와 vLLM Worker 배포, OpenAI 호환 API 제공 |
| Gateway 연결 | Backend, AIServiceBackend, AIGatewayRoute | Dynamo Frontend Service를 호스트명과 모델 이름으로 라우팅 |
| 트래픽 | BackendTrafficPolicy | 타임아웃, 로드밸런싱, 서킷브레이커, 재시도 설정 |
Step 1. DynamoGraphDeployment 생성
DynamoGraphDeployment는 요청을 받는 Frontend와 모델을 실행하는 Worker로 구성됩니다. Worker의 replicas는 모델 인스턴스 수를 의미합니다.
주요 설정값은 다음과 같습니다.
| 필드 | 설명 |
|---|---|
spec.backendFramework | 추론 백엔드. 이 예시에서는 vllm 사용 |
spec.components[].type | 컴포넌트 역할. frontend 또는 worker |
spec.components[].runtimeVersionOverride | Dynamo 런타임 버전. Worker 이미지 태그와 동일하게 지정 |
podTemplate.spec.schedulerName | Worker에 사용할 Scheduler. 이 예시에서는 kai-scheduler |
--served-model-name | API 요청 본문의 model 값과 Gateway의 모델 매칭 값 |
--tensor-parallel-size | 텐서 병렬 GPU 수. nvidia.com/gpu 요청값과 동일하게 지정 |
--gpu-memory-utilization | vLLM이 사용할 GPU 메모리 비율 |
다음 매니페스트를 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 노드 사양과 할당량이 예시와 다르면 requests와 limits를 함께 조정하세요.
매니페스트를 적용합니다.
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 구성에서는 다음 값을 사용합니다.
| 리소스 | 필드 | 값 |
|---|---|---|
| Backend | spec.endpoints[].fqdn.hostname | glm-5-3-frontend.<사용자 namespace>.svc.cluster.local |
| Backend | spec.endpoints[].fqdn.port | 8000 |
| AIServiceBackend | spec.schema.name | OpenAI |
| AIGatewayRoute | spec.rules[].matches[].headers[].value | zai-org/GLM-5.3 |
| AIGatewayRoute | spec.rules[].timeouts.request | 1800s |
| BackendTrafficPolicy | spec.targetRefs[].name | AIGatewayRoute 이름 |
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 순서로 삭제합니다.