본문 바로가기

머신러닝 & 딥러닝/LLM

대규모 분산 학습 및 배포 팁(DeepSpeed Zero, Megatron, Nemo, vLLM, sglang)

딥러닝 모델의 파라미터 규모가 수백억 개를 넘어가며 이제 단일 GPU로는 더 이상 훈련이 불가능한 시대가 되었습니다.
2025년, 이 문제를 해결하는 유망한 기술 5가지입니다.

  • DeepSpeed ZeRO — 메모리 최적화의 절대 표준
  • Megatron-LM — 6,000개 GPU까지 선형 확장의 상징
  • NVIDIA NeMo — 엔터프라이즈급 생성 AI 풀스택
  • vLLM — 24배 빠른 추론 성능의 정석
  • SGLang — 구조화 생성의 게임체인저

이 글은 실험 로그, 프로덕션 경험, 최신 벤치마크, GitHub 이슈 분석까지 모두 반영한 실전형 가이드입니다.
단순 설명이 아니라, 현업에서 바로 쓸 수 있는 엔지니어링 관점에서 재구성했습니다.


1. 훈련 최적화의 양대 산맥: DeepSpeed ZeRO vs Megatron-LM

🔹 DeepSpeed ZeRO — “단일 GPU 한계를 깨버린 기술”

DeepSpeed ZeRO의 철학은 단순합니다.
반복되는 메모리를 없애자.

전통적인 데이터 병렬화가 모든 GPU에 모델 전체를 복제하는 반면,
ZeRO는 옵티마이저·그래디언트·파라미터를 GPU 간에 분할합니다.

  • ZeRO-1: 옵티마이저 분할 → 4배 메모리 절감
  • ZeRO-2: 그래디언트 분할 → 8배 절감
  • ZeRO-3: 파라미터까지 분할 → 16배 이상 절감

ZeRO-Offload, ZeRO-Infinity는 CPU·NVMe까지 활용하며 단일 GPU로도
100억~300억 규모 모델을 다룰 수 있게 했습니다.

이 기술이 실전에서 얼마나 강력한가요?

  • 단일 V100에서 64 TFLOP/s, NVIDIA 공식 대비 28% 더 빠름
  • 1,024개 V100으로 BERT 사전학습을 44분, 경쟁 대비 30% 적은 자원
  • 1조 파라미터 모델도 512 GPU로 초당 25 PFLOP 유지

즉, ZeRO는 메모리가 부족한 환경에서 가장 강력한 선택지입니다.


🔹 Megatron-LM — “6,144 GPU까지 거의 선형 확장”

NVIDIA가 만든 Megatron-LM은 분산 훈련의 정교함 자체입니다.

  • Tensor Parallelism(TP): 한 레이어를 여러 GPU에 분할
  • Pipeline Parallelism(PP): 레이어 자체를 단계화
  • Data Parallelism(DP): 전체 배치 확장

Megatron-Core v0.14.0 기준:

  • H100 클러스터에서 47% MFU(Model FLOPs Utilization)
  • GPT-3 175B 훈련 시 GPU당 138 TFLOP/s
  • 6,144개 GPU까지 거의 선형적 확장성

핵심은 Megatron 고유의 1F1B(One-Forward-One-Backward) 스케줄링입니다.
파이프라인 버블을 최소화하며, 인터리브드 스케줄링은 이를 더욱 줄여줍니다.
최근 연구에 따르면 이 방식만으로 15–30% 처리량 향상이 가능합니다.

Megatron은 단 한 가지 목적을 위해 존재합니다.

“가장 빠르고 가장 큰 모델을 훈련하기 위해.”


2. 엔터프라이즈급 AI 플랫폼: NVIDIA NeMo

NeMo는 단순 훈련 프레임워크가 아닙니다.
데이터 → 사전학습 → 파인튜닝 → RLHF → 배포까지 한 번에 처리하는 생성 AI 플랫폼입니다.

특징은 다음과 같습니다.

  • 2B ~ 462B 모델까지 41–47% MFU
  • 3,584개 H100 GPU로 GPT-3 175B를 10.9분 만에 훈련
  • Llama 2 RLHF에서 5.6배 성능 향상(TensorRT-LLM)
  • 단일 H100으로 Llama 3 8B 파인튜닝을 48시간에 완료

2025년의 변화도 중요합니다.

  • NeMo 2.0은 Python 기반 설정으로 전환 (YAML 제거)
  • LLM/VLM은 Megatron-Bridge로 통합
  • 2025.11 이후 NeMo LLM/VLM은 deprecated 예정

따라서 NeMo는 다음 환경에서 최적입니다.

“엔터프라이즈 규모의 전체 파이프라인을 하나의 스택으로 구축해야 한다면.”


3. 추론 최적화의 절대 강자: vLLM vs SGLang

훈련이 끝났다면 다음 과제는 추론 성능입니다.
2025년 현재, 추론 엔진의 양대 축은 vLLM과 SGLang입니다.

 


🔹 vLLM — “최고의 범용 LLM 추론 엔진”

핵심 혁신은 PagedAttention입니다.

운영체제 페이징처럼 KV 캐시를 “블록 단위”로 저장해
메모리 단편화를 해결합니다.

효과는 단순하지만 압도적입니다.

  • 메모리 낭비 60–80% → 4% 미만
  • HuggingFace 대비 최대 24배 빠른 처리량
  • vLLM V1(2025년 1월 출시)에서는 추가로 1.7배 속도 개선

Continuous Batching은 동적 요청 처리량을 극대화해
실제 서비스에서 탁월한 효율을 보여줍니다.

기업들이 vLLM을 선택하는 이유는 명확합니다.

  • OpenAI API와 완전 호환
  • NVIDIA·AMD·TPU·Inferentia·Intel 등 광범위한 하드웨어 지원
  • 빠른 업데이트와 강력한 커뮤니티(PyTorch Foundation 소속)

🔹 SGLang — “구조화 생성(JSON/XML)의 절대적 기준”

SGLang은 단순 LLM 추론기가 아닙니다.
프로그램 가능한 LLM 런타임에 가깝습니다.

두 가지 핵심 기술이 이를 가능하게 합니다.

✔ RadixAttention

PagedAttention을 확장한 구조로,
반복되는 프롬프트를 똑똑하게 캐싱합니다.

  • 캐시 히트율: 50–99%
  • Chatbot Arena 기준 1.7배 빠른 첫 토큰 지연

✔ 압축 FSM 기반 구조화 디코딩

JSON/XML 등 구조화된 출력 생성에서
기존 방식 대비 3배~10배 빠른 성능을 제공합니다.

실제 벤치마크 결과는 더 압도적입니다.

  • Few-shot / Agent / ToT 추론: vLLM 대비 3.5x ~ 6.4x
  • DeepSeek-R1 계열 모델에서 2.3배 처리량 향상

구조화 출력·에이전트·ReAct 기반 추론을 한다면
SGLang은 현재 최고의 선택입니다.


4. 어떤 기술을 선택해야 할까? — 실전 의사결정 가이드

질문 1: 지금 필요한 것은 훈련인가, 추론인가?

  • 훈련: DeepSpeed, Megatron, NeMo
  • 추론: vLLM, SGLang

질문 2: 모델 규모는 어느 정도인가?

  • < 10B: DeepSpeed ZeRO-2
  • 10–30B: ZeRO-3 또는 Megatron TP
  • 30–100B: Megatron 3D 병렬화
  • 100B+ : Megatron / NeMo 필수

질문 3: 출력 형태는 어떤가?

  • 범용 챗봇 → vLLM
  • JSON/XML/멀티턴/에이전트 → SGLang

질문 4: 팀의 숙련도는?

  • 빠른 적용 → DeepSpeed
  • 정교한 통제 → Megatron
  • 엔터프라이즈 환경 → NeMo
  • 안정성 + 확장성 → vLLM
  • 혁신적 기능 → SGLang

이 기술들은 경쟁 관계가 아니라 상호보완적입니다.
예를 들어:

  • Megatron으로 사전학습
  • NeMo로 RLHF
  • DeepSpeed로 파인튜닝
  • vLLM으로 서빙
  • SGLang으로 구조화 생성

이 조합은 실제 많은 글로벌 기업이 사용하는 패턴입니다.


5. 실전 트러블슈팅 — OOM부터 최적화까지

DeepSpeed OOM 해결법

  • 모델이 먼저 로드되기 때문에 초기 메모리 스파이크 발생 →
    deepspeed.zero.Init() 내부에서 모델 생성
  • DeepSpeed 메모리 추정치는 실제보다 50–75% 낮게 나옴 →
    항상 버퍼를 남겨두기

Megatron-LM OOM 해결법

  • 대부분 잘못된 TP/PP/DP 설정에서 발생
  • 해결책:
    • TP 증가
    • 활성화 체크포인팅(selective)
    • FlashAttention 활성화

NeMo CPU RAM 폭증 문제

  • 데이터로더 워커 수 과다로 발생
  • 해결책:
    • num_workers ≤ 8
    • bucketing + tarred dataset

vLLM OOM 문제

  • gpu-memory-utilization 조정: 0.5~0.9 사이에서 탐색
  • prompt_logprobs 활성화 시 메모리 폭증 → 비활성화 권장
  • 단편화 문제 →
    PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True

SGLang 설치 오류

  • sgl-kernel 아키텍처 미스매치 →
    pip install sgl-kernel --force-reinstall

🔭 2025년 생태계 동향과 미래 전망

2025년 기준 가장 중요한 흐름은 다음과 같습니다.

  • FP8이 표준, FP4가 실전 적용 시작
  • MoE 모델(DeepSeek V3, Mixtral 등) 완전 실전 단계
  • 비디오/멀티모달 모델 급부상
  • 추론 엔진 구조 혁신 가속(vLLM V1, RadixAttention)
  • AMD·TPU·Gaudi·Ascend 등 하드웨어 다양성 확대
  • 100만 GPU 규모의 초대형 추론 인프라 등장

2026년 이후, 모델 규모와 추론 속도는 지금보다 훨씬 더 극단적인 수준으로 갈 것입니다.

최신 코드 패턴 및 예제

이론을 실전으로 옮기는 코드 예제들을 살펴보겠습니다. 2025년 최신 API를 반영했습니다.

DeepSpeed ZeRO-3 + 오프로드 기본 설정:

{
  "train_batch_size": 32,
  "gradient_accumulation_steps": 2,
  "fp16": {"enabled": true},
  "optimizer": {
    "type": "AdamW",
    "params": {"lr": 3e-4, "weight_decay": 0.01}
  },
  "zero_optimization": {
    "stage": 3,
    "offload_optimizer": {"device": "cpu", "pin_memory": true},
    "offload_param": {"device": "cpu", "pin_memory": true},
    "overlap_comm": true,
    "contiguous_gradients": true,
    "reduce_bucket_size": 5e8,
    "stage3_prefetch_bucket_size": 1e9
  }
}

ZeRO++ 통신 최적화를 추가하려면 "zero_quantized_weights": true, "zero_hpz_partition_size": 8, "zero_quantized_gradients": true를 설정하십시오. HuggingFace Transformers와 통합은 TrainingArguments에서 deepspeed="ds_config.json"을 추가하면 됩니다.

 

Megatron-LM 멀티GPU 3D 병렬화 (8 GPU: TP=2, PP=2, DP=2):

torchrun --nproc_per_node=8 pretrain_gpt.py \
  --tensor-model-parallel-size 2 \
  --pipeline-model-parallel-size 2 \
  --num-layers 24 --hidden-size 2048 \
  --num-attention-heads 16 \
  --micro-batch-size 2 --global-batch-size 16 \
  --seq-length 2048 \
  --use-distributed-optimizer \
  --overlap-grad-reduce --overlap-param-gather \
  --recompute-granularity selective

 

FP8 훈련(H100)은 --bf16 --fp8-format hybrid --fp8-amax-history-len 1024 --transformer-impl transformer_engine을 추가하십시오. 대규모 GPT-3 175B 스타일은 TP=8, PP=16, DP=8로 1024 GPU를 사용하며, --virtual-pipeline-model-parallel-size 4로 인터리브드 스케줄을 활성화합니다.

 

NeMo 2.0 Python 기반 훈련:

import nemo.lightning as nl
from nemo.collections import llm

if __name__ == "__main__":
    # 데이터 설정
    data = llm.MockDataModule(seq_length=2048, global_batch_size=16)
    
    # 모델 설정
    gpt_config = llm.GPTConfig(
        num_layers=6, hidden_size=384,
        ffn_hidden_size=1536, num_attention_heads=6
    )
    model = llm.GPTModel(gpt_config, tokenizer=data.tokenizer)
    
    # 전략 설정
    strategy = nl.MegatronStrategy(
        tensor_model_parallel_size=1,
        pipeline_model_parallel_size=1,
        pipeline_dtype=torch.bfloat16,
    )
    
    # 트레이너
    trainer = nl.Trainer(
        devices=1, max_steps=100,
        accelerator='gpu', strategy=strategy,
        plugins=nl.MegatronMixedPrecision(precision='bf16-mixed'),
    )
    
    trainer.fit(model, data)

Llama 3 LoRA 파인튜닝은 llm.llama3_8b.finetune_recipe()로 레시피를 생성하고, recipe.trainer.max_steps, recipe.trainer.strategy.context_parallel_size 등을 조정합니다. NeMo-Run으로 run.run(recipe, executor=run.LocalExecutor())를 실행합니다.

 

vLLM V1 엔진 서버 시작:

export VLLM_USE_V1=1
pip install vllm --upgrade

# 기본 서버
vllm serve meta-llama/Llama-3.1-8B-Instruct

# 프로덕션 설정
vllm serve meta-llama/Llama-3.1-70B-Instruct \
  --host 0.0.0.0 --port 8000 \
  --tensor-parallel-size 4 \
  --gpu-memory-utilization 0.95 \
  --max-model-len 8192 \
  --dtype auto \
  --api-key your-secret-key \
  --served-model-name llama-70b

Python 오프라인 추론은 LLM(model="meta-llama/Llama-3.1-8B-Instruct", gpu_memory_utilization=0.9)로 초기화하고, llm.generate(prompts, sampling_params)로 배치 생성합니다. OpenAI 클라이언트는 base_url를 설정합니다.

 

SGLang 최적화 서버:

# DeepSeek 최적화
python3 -m sglang.launch_server \
  --model-path deepseek-ai/DeepSeek-R1-Distill-Qwen-32B \
  --enable-dp-attention --enable-flashinfer-mla \
  --trust-remote-code --tp 4

# 멀티GPU
python3 -m sglang.launch_server \
  --model-path meta-llama/Llama-3.1-70B-Instruct \
  --tp 8

네이티브 SGLang API로 멀티턴 대화:

import sglang as sgl

@sgl.function
def multi_turn(s, q1, q2):
    s += sgl.user(q1)
    s += sgl.assistant(sgl.gen("a1", max_tokens=256))
    s += sgl.user(q2)
    s += sgl.assistant(sgl.gen("a2", max_tokens=256))

state = multi_turn.run(
    q1="프랑스 수도는?",
    q2="인구는 얼마나 되나요?"
)

JSON 스키마 생성은 sgl.gen("char", regex=schema)로 정규식 제약을 설정합니다. 비전-언어 모델은 sgl.image(img_path)로 이미지를 포함합니다.

따라서 아래의 시퀀스를 추천합니다.

(1) 작은 배치로 시작해 점진적으로 증가

(2) 혼합 정밀도(BF16/FP16) 기본 활성화

(3) 활성화 체크포인팅으로 메모리 절약

(4) 통신 오버랩 활성화(overlap_comm, --overlap-grad-reduce)

(5) 빈번한 체크포인트 저장

(6) 단일 GPU에서 먼저 테스트

(7) nvidia-smi dmon -s mu로 GPU 메모리 모니터링

(8) 프로덕션 전 체크포인트 저장/로드 검증

마지막 정리 — 효율적 선택을 위한 최종 체크리스트

1. 훈련인가? → DeepSpeed / Megatron / NeMo
2. 추론인가? → vLLM / SGLang
3. 출력 형태가 복잡한가? → SGLang
4. 대규모 멀티노드인가? → Megatron
5. 단일 GPU/저예산인가? → DeepSpeed
6. 엔터프라이즈 파이프라인을 원하나? → NeMo
7. 단순 챗봇 또는 범용 API? → vLLM

결론은 명확합니다.

이 다섯 기술을 이해하는 순간, 초거대 모델은 더 이상 거대 기업만의 전유물이 아닙니다.
올바른 도구 선택이 곧 생산성입니다.

이 글이 2025년의 복잡한 AI 인프라 환경에서
여러분의 전략적 기술 선택에 도움이 되길 바랍니다.


var content = document.querySelector('.entry-content') contentSelector: '.entry-content'