본문으로 건너뛰기

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 노드 사양과 할당량이 예시와 다르면 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 구성에서는 다음 값을 사용합니다.

리소스필드값
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 순서로 삭제합니다.