
Modal에서 GLM-5.2-FP8 (700B MoE) 배포하기: Serverless 8x H200s, 트레이드오프 및 학습된 교훈
요약
Zhipu AI의 대규모 MoE 모델인 GLM-5.2-FP8을 Modal의 서버리스 환경에서 8x H200 GPU로 배포하는 기술적 사례를 다룹니다. vLLM을 활용한 아키텍처 설계와 양자화 방식에 따른 VRAM 및 성능 트레이드오프를 분석합니다.
핵심 포인트
- GLM-5.2는 Claude 3.5 Sonnet 및 GPT-4o와 대등한 성능을 보이는 오픈 웨이트 모델임
- 700B 규모 모델 배포를 위해 8x NVIDIA H200 GPU 클러스터 오케스트레이션 필요
- Modal의 초 단위 과금 및 자동 스케일링을 통해 서버리스 비용 효율성 극대화 가능
- BF16 대비 FP8 양자화를 통해 단일 노드 내 메모리 레이아웃 최적화 달성
Zhipu AI의 GLM-5.2 출시는 오픈 웨이트 (open-weights) AI 분야에서 중요한 발전입니다. 이는 장기 계획 (long-horizon planning), 복잡한 소프트웨어 엔지니어링, 그리고 고밀도 추론 (high-density reasoning)에 최적화된 전문가 혼합 (Mixture-of-Experts, MoE) 추론 모델입니다.
SWE-bench Pro 및 GPQA와 같은 최근 벤치마크에 따르면, GLM-5.2는 현재 시장에서 사용 가능한 가장 유능한 오픈 소스 LLM으로 자리 잡고 있으며, 엔지니어링 작업에서 Claude 3.5 Sonnet 및 GPT-4o와 같은 폐쇄형 (proprietary) 모델과 대등하거나 이를 능가합니다.
하지만 **703.74 GiB FP8 체크포인트 (checkpoint)**라는 거대한 규모의 모델을 자체 호스팅하려면, 모델 가중치와 131k 토큰 컨텍스트 윈도우 (context window)를 지원하기 위해 8x NVIDIA H200 GPU 클러스터 (각 141GB HBM3e)를 오케스트레이션 (orchestrating)해야 합니다.
RunPod와 같은 클라우드에서 전용 8x H200 (141GB) 노드를 대여하는 비용은 **시간당 $35.12 ($GPU당 시간당 $4.39)**인 반면, Modal은 **시간당 $36.31 ($GPU당 시간당 $4.54 또는 $GPU당 초당 $0.001261)**을 부과합니다. 그러나 Modal은 엄격하게 초 단위로 과금하며 유휴 상태일 때 클러스터를 자동으로 0으로 스케일링 (scaling)하기 때문에, 콜드 스타트 (cold start)와 스케일 다운 (scale-down) 유휴 대기 시간을 포함한 일반적인 20분간의 활성 개발 세션 비용은 단 ~$12.00에 불과하며, 수동 개입 없이 비활성 상태일 때는 정확히 $0.00/hour로 떨어집니다.
이 사례 연구는 vLLM을 사용하여 Modal에서 수행한 서버리스 (serverless) 배포 아키텍처, 직면한 기술적 병목 현상, 그리고 통합 과정에서 얻은 실질적인 교훈을 기록합니다.
내부 구조: GLM-5.2 및 양자화 (Quantization) 트레이드오프
이 정도 규모의 모델을 단일 8-GPU 노드에 배포하려면 세심한 메모리 레이아웃 (memory layout) 계획이 필요합니다. 원래의 16비트 (BF16) 가중치를 서빙하는 것은 단일 노드에서 수학적으로 불가능합니다 (1.5 테라바이트 이상의 VRAM과 멀티 노드 파이프라인 병렬 (pipeline-parallel) 오케스트레이션이 필요함).
따라서 우리는 여러 양자화 형식을 고려해야 합니다. 다음은 아키텍처 트레이드오프 분석입니다:
| 형식 / 정밀도 (Format / Precision) | 필요한 VRAM (가중치 + 캐시) | 연산 하드웨어 경로 (Compute Hardware Path) | 정확도 유지 (Accuracy Retention) | 처리량 및 지연 시간 트레이드오프 (Throughput & Latency Trade-off) |
|---|---|---|---|---|
| BF16 (비양자화) | ~1.5 TB (16x H200 GPU 필요) | 느림 (멀티 노드 PP 오버헤드 발생) | 100% (기준점) | 노드 간 네트워크 통신 병목 현상으로 인해 느려짐. 높은 호스팅 비용. |
| ... |
양자화 형식에 따른 상대적 정확도 유지 (Relative Accuracy Retention vs. Quantization Format)
이 시각적 표현은 복잡한 추론 벤치마크(GPQA 및 SWE-bench 등)에서 각 양자화 형식이 모델의 기준 지능(BF16 대비)을 어떻게 유지하는지 보여줍니다:
형식 (Format) 필요 VRAM (VRAM Req.) 상대적 정확도 유지율 (%) (Relative Accuracy Retention (%))
─────── ───────── ───────────────────────────────────────────────
BF16 ~1.5 TB [████████████████████████████████████████] 100.0% (Baseline)
...
형식 선택 (Format Selection): FP8은 자체 호스팅(Self-hosting)을 위한 최적의 트레이드오프를 나타냅니다. 이는 모델의 원시 지능을 99.2% 유지하며, 단일 8-GPU 노드에 적합하고, Key-Value (KV) 캐시 점유 공간을 절반으로 줄이며, Hopper 아키텍처의 네이티브 하드웨어 Tensor Core를 활용합니다. 내부적으로 vLLM은 DeepSeek의 오픈 소스 DeepGEMM 라이브러리(vLLM이 GLM의 MoE 라우팅 커널에 활용함)를 사용하여 고도로 최적화된 Triton 경로로 MoE 라우팅 행렬 곱셈을 실행합니다.
왜 자체 호스팅인가? 전략적 의사결정 프레임워크 (Why Self-Host? The Strategic Decision Framework)
관리형 멀티 테넌트(Multi-tenant) API 제공업체는 마찰이 적고 즉각적인 가용성을 제공하지만, 특정 기술적 시나리오 하에서는 이 정도 규모의 모델을 자체 호스팅하는 것이 필수적이 됩니다:
- 엄격한 코드베이스 프라이버시 및 IP 준수 (Strict Codebase Privacy & IP Compliance): 규제 환경(금융, 의료, 엔터프라이즈 소프트웨어)에서 개념 증명(PoC) 또는 제품을 구축하는 경우, 독점적인 코드베이스 조각이나 민감한 고객 데이터를 제3자 API 라우터로 전송하는 것은 엄격한 컴플라이언스 프로토콜을 위반합니다. 격리된 서버리스 GPU 테넌트(tenant)에서 자체 호스팅을 하면 지적 재산(IP)이 보안 네트워크 경계를 절대 벗어나지 않도록 보장할 수 있습니다.
- 속도 제한(Rate Limits) 및 컨텍스트 스로틀링(Context Throttling) 우회: 장기적인 자율 소프트웨어 엔지니어링 에이전트를 실행하려면 깊고 반복적인 컨텍스트 평가(SWE-bench 실행)가 필요합니다. 제3자 API는 동시 부하가 발생할 때 컨텍스트 크기를 심하게 제한(throttle)하거나 과도한 프리미엄 요금을 부과합니다. 클러스터를 직접 소유하면 8x H200의 전체 컴퓨팅 파워를 인위적인 속도 제한 없이 독점적으로 사용할 수 있습니다.
- 프리픽스 캐싱(Prefix Caching) 안정성: 퍼블릭 멀티 테넌트(multi-tenant) API에서는 제공업체가 수천 명의 동시 사용자 간에 부하를 분산함에 따라 컨텍스트 캐시가 끊임없이 제거(evict)됩니다. 자체 호스팅을 하면 GPU 메모리를 직접 제어할 수 있습니다. 따라서 RadixAttention 프리픽스 캐시가 전체 개발 또는 평가 세션 동안 따뜻한(warm) 상태로 안정적으로 유지됩니다.
인프라 설계도 (The Infrastructure Blueprint)
이 모델을 서버리스로 서빙하기 위해서는 VRAM 할당을 엄격히 제어하고, 시작 네트워크 지연 시간(startup network latency)을 최소화하며, 클라우드 예산을 보호해야 합니다.
다음은 Modal의 Python SDK와 특화된 vLLM 빌드(vllm/vllm-openai:glm52-cu129)를 사용한 전체 코드형 인프라(IaC, Infrastructure-as-Code) 구성입니다:
import os
import modal
...
기술적 사후 분석 및 해결책 (Technical Post-Mortems & Resolutions)
1. Python 모듈 섀도잉 (typing_extensions)
- 증상 (Symptom): 초기 컨테이너 부팅 중, vLLM 엔진이 다음과 같은 오류와 함께 크래시 루프(crash-loop)를 발생시켰습니다:
ImportError: cannot import name 'Sentinel' from 'typing_extensions' (/usr/local/lib/python3.12/dist-packages/typing_extensions.py) - 진단 (Diagnosis):
pydantic-core는Sentinel클래스를 위해typing-extensions>=4.14.1을 필요로 합니다. 빌드 단계에서typing-extensions>=4.15.0을 설치했음에도 불구하고, 베이스 CUDA 이미지의dist-packages에 레거시 단일 파일 모듈(typing_extensions.py)이 포함되어 있었습니다. Python의 임포트 시스템은 동일한 검색 경로 내에서 패키지 디렉토리보다 단일 파일 모듈을 우선시하기 때문에, 우리가 설치한 최신 패키지를 섀도잉(shadowing)했습니다. - 해결 (Resolution): Dockerfile 설정에 pip를 실행하기 전 레거시 단일 파일 모듈을 삭제하는 단계를 추가했습니다:
RUN rm -f /usr/local/lib/python3.12/dist-packages/typing_extensions.py
2. Safetensors 순차적 I/O 병목 현상 (Safetensors Sequential I/O Bottleneck)
- 증상 (Symptom): 스타트업 프로파일링 결과, Modal의 가상 네트워크 파일 시스템(virtual network filesystem)을 통한 순차적 읽기(sequential reads)로 인해 모델 로딩에 12분 이상이 소요되었습니다. vLLM은 다음과 같은 경고를 기록했습니다:
Auto-prefetch is disabled because the filesystem (9P) is not a recognized network FS... start vLLM with --safetensors-load-strategy=prefetch. - 해결 (Resolution):
--safetensors-load-strategy prefetch파라미터를 추가했습니다. 이를 통해 vLLM이 여러 CPU 스레드를 사용하여 디스크에서 VRAM으로의 로딩 프로세스를 병렬화하도록 강제했으며, 그 결과 모델 로딩 시간을 약 12분에서 약 1분으로 단축했습니다. 결과적으로 하드웨어 할당 및 DeepGEMM 웜업(warmup)을 포함한 전체 콜드 스타트(cold start) 시간은 약 4.5분이 되었습니다.
3. 투기적 디코딩 vs 콜드 스타트 (Speculative Decoding vs. Cold Start (MTP & Eager Mode))
GLM-5.2는 5개의 토큰을 앞서 예측하기 위해 **다중 토큰 예측 (Multi-Token Prediction, MTP)**을 활용합니다. 이를 서버리스(serverless)로 구현하기 위해, 우리는 중대한 아키텍처적 선택에 직면했습니다:
- CUDA Graphs /
torch.compile(No Eager Mode): 거대한 컨텍스트 윈도우(context window)를 위한 수학적 그래프를 컴파일하는 과정에서 서버가 시작 시 20분 이상 멈춰 있었습니다. 결론: 서버리스(serverless) 환경에서는 불가능함. - Eager Mode (
--enforce-eager): 부팅 시간이 영광스러운 4.5분으로 단축되었으나, 새로운 시퀀스 길이(sequence length)를 가진 _첫 번째 쿼리(first query)_에서 MTP 엔진이 실시간으로 JIT Triton 커널 컴파일을 수행하는 동안 약 35초의 첫 토큰 생성 시간(TTFT) 급증이 발생했습니다. - 결정: 우리는 Eager Mode를 선택했습니다. 20분의 시작 지연을 피하기 위해 첫 상호작용에서 35초의 지연이 발생하는 것은 감수할 만한 대가입니다. 일단 워밍업(warm)이 되면, MTP는 구조화된 코드에서 **100%의 초안 수락률(draft acceptance rate)**로 작동하며, 30-50 tokens/s의 지속 가능한 생성 속도를 제공합니다.
실전 검증: OpenCode 테스트 및 Flappy Bird 챌린지
배포를 검증하기 위해, 우리는 Modal 서버를 OpenCode에서 OpenAI 호환 제공자(provider)로 통합했습니다.
먼저, 대규모의 실제 파일을 사용하여 컨텍스트 처리 능력을 테스트했습니다: CPython의 표준 라이브러리 비동기 코디네이터인 asyncio/tasks.py (1,060행 이상의 복잡한 동시성 로직)입니다. --reasoning-parser glm45가 활성화된 상태에서, 모델의 사고 사슬(Chain-of-Thought, CoT) 토큰은 전용 reasoning_content API 속성으로 라우팅됩니다:
// opencode.json
"modal-glm": {
"npm": "@ai-sdk/openai-compatible",
...
OpenCode는 이 스트림을 캡처하여 채팅창 내 접이식 "Thinking" 블록 안에 추론 과정을 렌더링합니다. GLM-5.2는 1,065행의 코드를 소화하고, CPython의 실행 콜백(execution callbacks)을 파싱하여 매우 정확하고 구조화된 아키텍처 분석을 생성했습니다.
이 모델은 엔지니어링 디테일에 대한 뛰어난 주의력을 발휘하여 게임("Sunset Flier")을 성공적으로 생성했습니다:
- 물리 및 게임 루프 (Physics & Game Loop): 적절한 중력 가속도, 점프 충격량 (jump impulses), 점수 계산, 그리고
localStorage를 통한 최고 점수 유지 기능을 갖춘 깔끔한 캔버스 기반 렌더링 (canvas-based rendering). - JS 오디오 합성 (JS Audio Synthesis): 정적인
.mp3에셋을 로드하는 대신, 모델은 HTML5 Web Audio API를 활용하여 점프(날갯짓), 점수 획득, 충돌(부딪힘) 시 오실레이터 노드(oscillator nodes: 사인파, 삼각파, 사각파, 톱니파 파형)를 사용하여 레트로 사운드 효과를 동적으로 생성했습니다.
이는 단 한 번의 실행(single pass)으로 상호작용이 가능하고 기능적인 소프트웨어를 구성할 수 있는 모델의 능력을 입증했습니다.
향후 최적화 (Future Optimizations)
이 서버리스 아키텍처를 운영 우수성(operational excellence)의 다음 단계로 끌어올리기 위해, 우리는 세 가지 향후 최적화 벡터를 계획했습니다:
- Keep-Warm Scheduling (Active Sessions): 활발한 코딩 시간 동안, Modal에서 간단한 서버리스
cron작업을 구성하여 14분마다/health엔드포인트에 핑(ping)을 보내도록 설정하면 4.5분의 콜드 스타트(cold start)를 완전히 피할 수 있습니다. - GPU Memory Snapshots: Modal의 GPU 메모리 스냅샷(snapshotting) 기술을 사용하면 DeepGEMM 워밍업(warmup) 이후의 VRAM 상태를 디스크에 직접 직렬화(serializing)할 수 있습니다. 사전 컴파일된 상태에서 컨테이너를 복구하면 가중치 로딩(weight-loading)과 JIT 컴파일(JIT compilation)을 모두 건너뛸 수 있어, 서버리스 콜드 스타트 시간을 잠재적으로 10초 미만으로 줄일 수 있습니다.
- SGLang Engine Migration: SGLang이 GLM-5.2의 커스텀 MoE 레이어를 네이티브로 지원하게 되면, 백엔드를 vLLM에서 마이그레이션함으로써 Eager 실행(Eager execution) 환경에서의 CPU 측 호스트 오버헤드(host overhead)를 줄이는 데 도움이 될 것입니다.
References & Technical Resources (참고 문헌 및 기술 리소스)
1. Model & Weights (Zhipu AI / Z-AI)
- Base Model: zai-org/GLM-5.2 on HuggingFace
- FP8 Quantized Checkpoint: zai-org/GLM-5.2-FP8 on HuggingFace
- Official Release Announcement: GLM-5.2: Built for Long-Horizon Tasks (HF Blog)
- IndexShare Architecture Paper: IndexShare: Sharing Indexer Across Sparse Attention Layers (arXiv:2603.12201)
2. Core Libraries & Runtime Optimizations (핵심 라이브러리 및 런타임 최적화)
- Triton FP8 MoE Kernels: DeepSeek의 DeepGEMM 라이브러리 (GitHub)
- vLLM Official Serving Recipes: GLM-5.2 vLLM 레시피 문서
- Serverless GPU Deployment: Modal vLLM 웹 서버 예제
3. Community Guides & Integrations (커뮤니티 가이드 및 통합)
- Unsloth Local Execution Guide: GLM-5.2 - Unsloth Studio를 사용하여 로컬에서 실행하는 방법
Conclusions (결론)
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기