Tech Blog Summary · DeepSpeed (Microsoft) · 2022.09.09

ZeRO-Inference: GPU에 weights를 0개 올리고
초거대 모델을 GPU 1장으로 추론하기

"Democratizing massive model inference" — CPU/NVMe에 모델을 통째로 두고, layer를 한 장씩 GPU로 흘려보낸다
V100 32GB 1장으로 OPT-175BNVMe 기준 최대 15T 파라미터throughput 지향DeepSpeed ≥ 0.6.6
s₁ · Problem

문제: 좋은 모델일수록 살 수 없는 GPU가 필요해진다

한 줄 요약 — SOTA 모델(예: Megatron-Turing-530B)은 fp16 추론만 해도 A100-40GB가 최소 40장 필요해서, 학생·연구자·소기업은 공개된 모델조차 돌려볼 수 없다. 4년도 안 되어 SOTA가 0.3B(BERT-Large) → 530B로 커지면서, 모델 크기의 성장이 곧 접근성의 붕괴가 됐다 §Introduction.

핵심 관찰: 정작 보통 컴퓨터에도 CPU DRAM + NVMe SSD를 합치면 수 TB의 메모리가 이미 있다. 비싼 건 GPU HBM뿐이다. 그렇다면 모델을 꼭 GPU에 담아야 하나? §Introduction

"hosting no (zero) weights in GPU" — §Introduction (기술명 ZeRO의 유래)
s₂ · 기존 접근법

기존 접근법: 모델을 GPU에 "다 넣거나, 반쯤 넣거나"

접근법무엇을 해결했나대가는 무엇인가
전부 GPU에 적재
DeepSpeed-Inference, Accelerate, MII §When to use
가장 빠른 latency. 다중 GPU로 분산(tensor parallel)530B급이면 GPU 수십 장이 필요 — 비용이 대부분의 사용자를 배제
Partial offload
(들어가는 만큼만 GPU에 고정, 나머지는 필요할 때 가져오기) §Alternative approach
GPU에 있는 부분은 전송 생략① 175B급에선 GPU에 넣을 수 있는 비율이 미미해 절감 효과가 무의미. ② 남는 GPU 메모리가 없어 batch를 못 키움 → throughput 하락 (아래 Table 2에서 실증)
ZeRO-Inference (본 블로그)
full offload + layer streaming
weights 전체를 CPU/NVMe에 두고 layer 단위 스트리밍 → GPU 메모리는 전부 batch에 투자. V100 1장으로 NVMe 기준 15T 파라미터까지토큰당 latency는 태생적으로 느림 — 대량 batch·throughput 워크로드 전용

배경 카드 — 메모리 계층과 PCIe란? [블로그에 없음]

컴퓨터 메모리는 "빠를수록 작고 비싼" 피라미드다. GPU HBM(수십 GB, 초당 ~TB급으로 GPU 코어와 직결) > CPU DRAM(수백 GB~TB) > NVMe SSD(수십 TB). 그런데 CPU/NVMe에서 GPU로 데이터를 옮기는 통로가 PCIe인데, 이게 초당 겨우 수십 GB로 HBM보다 수십 배 느린 병목이다. ZeRO-Inference의 모든 설계는 결국 "느린 PCIe 전송을 어떻게 숨기느냐"의 싸움이다.

메모리 계층 피라미드HBM, DRAM, NVMe의 용량·속도·비용 비교와 PCIe 병목 GPU HBM · 32GB CPU DRAM · 1.5TB (DGX-2 예시) NVMe SSD · 30TB ← 빠름·작음·비쌈 ← 느림·큼·저렴 PCIe 병목 계층 사이를 오가는 좁은 다리
이 그림이 말하는 것: 용량은 아래로 갈수록 천 배 가까이 커지고 가격은 급락한다 — 모델을 아래층에 두자는 것이 ZeRO-Inference의 출발점.
s₃ · 동작 방식

어떻게 동작하나: layer streaming + "GPU 메모리는 batch에 몰빵"

① 기본 메커니즘: layer-by-layer streaming §Offload all model weights

모델 전체(수백 GB)를 CPU DRAM 또는 NVMe에 고정(pin)해 두고, 추론 시 layer 1개씩만 PCIe로 GPU에 가져와 계산한다. 계산이 끝나면 그 layer의 weights는 즉시 버리고(메모리 해제) 다음 layer를 받는다. layer의 출력(activation)만 GPU에 남아 다음 layer의 입력이 된다. GPT3-175B는 96 layer이므로, GPU에는 항상 전체의 ~1%만 존재 — 530B 모델의 GPU 메모리 요구가 1TB → 10GB로 두 자릿수 감소한다.

layer streaming 파이프라인 timeline시간축을 따라 fetch와 compute가 layer 단위로 겹쳐 진행되는 타임라인 PCIe 전송CPU/NVMe → GPU GPU 계산layer forward GPU 메모리상주 내용 시간 → Layer 1 전송 Layer 2 전송 (prefetch) Layer 3 전송 (prefetch) Layer 4 전송 (prefetch) Layer 1 계산 (대량 batch) Layer 2 계산 Layer 3 계산 L1 weights + batch 입력 L2 + activation (L1은 해제) L3 + activation 전송 완료 → 즉시 계산 계산하는 동안 다음 layer를 미리 당겨옴 = 전송 시간이 "숨겨짐"
이 그림이 말하는 것: k번째 layer를 계산하는 동안 k+1번째 layer를 전송하면(prefetching §Optimizations), 계산 시간 ≥ 전송 시간인 한 PCIe 병목이 사라진다.

② 핵심 통찰: 비운 GPU 메모리를 batch에 쓴다 §Offload all model weights

모델을 안 올렸으니 GPU 메모리 대부분이 빈다. 이걸 긴 시퀀스·큰 batch의 입력 토큰으로 채운다. layer 1개의 계산량은 처리하는 토큰 수에 비례해 커지므로(예: GPT3-175B layer 1개, batch 1 · 2048 토큰에 약 7 TFlops), 토큰을 많이 실을수록 계산 시간이 길어져 전송 시간을 완전히 덮는다. 즉 이 시스템에서 큰 batch는 사치가 아니라 PCIe를 숨기기 위한 필수 연료다.

숫자로 손으로 돌려보기 [블로그에 없음: 블로그의 7 TFlops·GPT3-175B 96 layer 수치로 직접 계산한 근사]

GPT3-175B → layer당 weights ≈ 175B/96 ≈ 1.8B 파라미터 ≈ fp16 3.6GB. PCIe 3.0 x16 ≈ 16GB/s 가정 → layer 전송 ≈ 0.23초. V100 fp16 실효 ~60 TFLOPS 가정:

batch (각 2048 토큰)layer당 계산량계산 시간전송 시간지배 요인layer당 실효 시간
17 TFlops0.12s0.23s전송 (PCIe 병목)0.23s — GPU가 절반 놀고 있음
214 TFlops0.23s0.23s균형점0.23s
856 TFlops0.93s0.23s계산 — 전송 완전히 숨겨짐0.93s에 8개 시퀀스 처리 → 시퀀스당 비용 ½로

batch 1과 batch 8의 총 소요는 4배 차이지만 처리량은 8배 차이 — batch를 키울수록 "전송비는 고정, 일은 늘어나는" 구조라 throughput이 계속 좋아진다. 반대로 batch를 못 키우면(붕괴 케이스, s₈) GPU는 PCIe를 기다리며 논다.

③ 최적화 2가지 §Optimizations

(a) Prefetching — 위 timeline처럼 다음 layer를 미리 당겨온다. 특이점: CPU offload에서는 효과가 없었고(짧은 생성 시퀀스라 계산 시간이 너무 짧아 숨길 틈이 없음), NVMe offload에서만 1.13~1.21× 개선 — NVMe→CPU 전송과 CPU→GPU 전송이 2단 파이프라인을 이루기 때문 §Prefetching layer weights.

(b) 다중 GPU 병렬 fetch — GPU가 여러 장이면 각 GPU가 layer의 서로 다른 조각을 자기 PCIe로 동시에 받고(1단계), 그 뒤 GPU끼리 NVLink(PCIe보다 수십 배 빠름)로 all-gather 해 전체 layer를 조립한다(2단계). PCIe 대역폭이 GPU 수만큼 합산되는 효과 → GPU당 throughput이 오히려 증가하는 super-linear scaling §Parallelizing layer fetching.

다중 GPU 병렬 fetch4개 GPU가 layer 조각을 나눠 받고 NVLink all-gather로 조립하는 2단계 과정 CPU/NVMe의 Layer k (3.6GB) 4조각으로 분할: ¼ · ¼ · ¼ · ¼ GPU 0조각 A 수신 GPU 1조각 B 수신 GPU 2조각 C 수신 GPU 3조각 D 수신 1단계: PCIe ×4 동시 전송 (¼ 시간) 2단계: NVLink all-gather로 전원이 완전한 Layer k 확보 (PCIe 대비 지연 무시 가능)
이 그림이 말하는 것: 좁은 다리(PCIe)를 4개 동시에 쓰고, 넓은 다리(NVLink)로 마무리 — 전송 지연이 GPU 수에 반비례로 줄어든다.

④ 사용법 §How to use

DeepSpeed 설정에서 ZeRO stage 3 + 파라미터 offload 대상만 지정하면 Hugging Face generate 파이프라인에 그대로 얹힌다:

"zero_optimization": {
  "stage": 3,
  "offload_param": { "device": "cpu" }        // 또는
  "offload_param": { "device": "nvme", "nvme_path": "/local_nvme" }
}
s₄ · Figure별 주장

블로그의 각 Figure/Table이 파는 주장

※ 블로그 원문 figure는 이미지 형태의 표/차트이며, 본 문서에서는 본문 수치를 기반으로 s₅에 재구성했다.

Figure설득하려는 주장근거로 쓰는 것
Fig. 1 (Model Scaling)V100 1장의 한계는 GPU가 아니라 "모델을 어디에 두느냐"가 결정한다HBM 기준 최대 <16B vs NVMe 기준 15T — 약 1000배 차이
Table 1 (Models)실험 대상이 실제 공개 초거대 모델임OPT-30B / OPT-175B / BLOOM-176B, 전부 V100 32GB 초과
Table 2 (Full vs Partial)어중간하게 GPU에 넣지 말고 전부 offload하라 — 이 블로그의 대표 주장OPT-30B: full offload가 partial 대비 CPU 1.3×·NVMe 2.4× 빠름 (43 / 30 tok/s)
Table 3 (Prefetching)prefetch는 NVMe에서만 유효NVMe 1.13~1.21× vs CPU 개선 없음
Table 4 (Multi-GPU)GPU를 늘리면 GPU당 성능도 올라간다 (super-linear)2·4 GPU에서 per-GPU throughput 증가 — PCIe 합산 효과
Table 5~7 (출력 길이)큰 batch가 성능의 생명줄임을 역으로 증명출력 토큰 10→50에서 KV cache 증가로 batch가 ½로 줄자 throughput도 비례 하락
s₅ · 결과 분석

결과: 어떤 설계가 어떤 숫자를 만들었나

Fig. 1 재구성 — V100 32GB 1장으로 감당 가능한 모델 크기 §Model Scaling on 1 GPU

모델 스케일 비교모델을 두는 위치에 따른 최대 추론 가능 모델 크기, 로그 스케일 막대 Baseline (HBM에 모델) ZeRO-Inf. + CPU DRAM 1.5TB ZeRO-Inf. + NVMe 30TB < 16B 파라미터 ~0.75T [계산] 15T 파라미터 (≈1000×) ※ 가로축 로그 스케일 개념도. 16B·15T는 블로그 명시 수치, 0.75T는 fp16 2바이트 기준 1.5TB/2로 직접 계산 [블로그에 없음]
이 그림이 말하는 것: 같은 GPU 1장이라도 모델의 "숙소"를 바꾸면 다룰 수 있는 크기가 1000배 달라진다.
왜 가능한가 — GPU에는 항상 layer 1~2개(수 GB)만 있으면 되므로, 상한을 정하는 것은 HBM이 아니라 모델을 통째로 담는 저장소(CPU/NVMe)의 용량이 된다. 530B 모델의 GPU 메모리 요구가 1TB→10GB로 줄어드는 것과 같은 원리.

Table 2 재구성 — Full vs Partial offload (OPT-30B, V100 1장) §Full Offload vs. Partial Offload

전략CPU offloadNVMe offload
Full offload (전부 CPU/NVMe, GPU는 batch 전용)43 tokens/s30 tokens/s
Partial offload (10~12B를 GPU에 고정)full 대비 1.3× 이상 느림full 대비 2.4× 이상 느림
왜 향상됐나 — partial은 전송량을 줄여주지만, GPU에 모델을 박아둔 만큼 batch를 키울 공간이 사라진다. throughput 관점에서는 "전송 절약 < batch 확대"라는 것이 실측 결론이며, 블로그는 이를 굵은 글씨로 못박는다: 모델이 안 들어가면 GPU 메모리는 batch에 쓰라고 §Full Offload 결론부. 참고로 더 많이 GPU에 고정하려 하면 작은 batch에서도 OOM이 났다(각주 2).
뒤집어 읽으면 — 이 결론은 throughput 지표에서만 성립한다. 단일 요청 latency가 목표라면 GPU에 최대한 고정하는 쪽이 유리할 수 있는데, 블로그는 그 축을 측정하지 않았다.

Table 3·4 재구성 — Prefetch와 다중 GPU §Prefetching, §Parallelizing

최적화CPU offloadNVMe offload
Prefetching개선 없음 (계산 시간이 짧아 숨길 여지 없음)OPT-30B 1.13× · OPT-175B 1.14× · BLOOM-176B 1.21×
2~4 GPU 병렬 fetchGPU당 throughput 자체가 상승 → super-linear scaling (prefetch 켠 상태 측정)
왜 향상됐나 — NVMe 경로는 NVMe→CPU→GPU의 2단 전송이라 prefetch가 두 구간을 파이프라인으로 겹칠 수 있다. 다중 GPU는 layer를 조각내 PCIe 4개로 동시에 받으므로 전송 지연이 1/N — 병목 자체가 PCIe였다는 진단이 옳았음을 보여주는 결과다.

Table 5~7 재구성 — 출력이 길어지면? §Impact of generation output length

출력 토큰 수batch 크기throughput
10 (기준)기준기준
50 (5×)½로 감소 (KV cache가 GPU 메모리를 잠식)batch 감소에 비례해 하락
뒤집어 읽으면 — 이 표는 사실상 이 시스템의 아킬레스건 예고편이다. 출력(=문맥)이 길어질수록 KV cache가 batch 공간을 잡아먹고, batch가 줄면 PCIe를 숨길 연료가 사라진다. 2022년의 이 관찰이 곧 "긴 문맥 시대에는 KV cache가 새 병목"이라는 TriForce(2024)의 출발점으로 이어진다.
s₆ · Conclusion

결론

§Conclusion 블로그 명시 결론: 모델 초대형화가 AI 접근성을 위협하는 상황에서, ZeRO-Inference는 모델을 CPU/NVMe에 두고 layer를 스트리밍함으로써 GPU 1장 수준의 예산으로 SOTA 모델 추론을 가능하게 하며, 공개 모델 배포(BigScience, Meta 등)와 함께 AI 민주화를 완성하는 조각이 되고자 한다. 별도의 future work 절은 없고, 다중 GPU 결과에서 "미래 PCIe 세대의 대역폭 향상이 성능을 더 끌어올릴 것"이라는 전망만 덧붙인다 §Parallelizing.

⏱ 30초 요약

ProblemSOTA 모델 추론에 GPU 수십 장 필요 → 대다수 사용자 배제.
Ideaweights를 GPU에 0개 두고 CPU/NVMe에서 layer 단위 스트리밍. 비운 GPU 메모리는 전부 대량 batch에 투자해 계산 시간으로 전송 시간을 덮는다.
Cost토큰당 latency 태생적 열세. 큰 batch가 확보되는 워크로드에서만 효율적.
전제조건throughput 지향 + 대량 batch/긴 시퀀스 + CPU/NVMe 용량 충분.
가장 강한 근거full offload가 partial 대비 1.3~2.4× 빠름(Table 2) — "batch가 왕"이라는 설계 철학의 실증.
s₇ · 놓치기 쉬운 것

본문 구석과 각주에서 놓치기 쉬운 것들

각주 1 — baseline이 16B에서 끊기는 이유: 16B 모델(fp16 32GB)은 V100-32GB에 "들어가긴" 하지만 입력·중간 결과를 둘 공간이 없어 실질 추론 불가.

각주 2 — partial offload에서 GPU 고정량을 더 늘리면 작은 batch에서도 OOM. "GPU에 더 넣기"의 한계를 실험적으로 확인.

각주 3 — 다중 GPU 실험은 독립 PCIe 링크를 가진 GPU만 골라 수행 — PCIe를 공유하는 슬롯 구성이면 병렬 fetch 이득이 줄어든다는 뜻이다.

실험 조건의 소박함 §Token Generation Performance — 성능 수치는 입력 4토큰 / 출력 10토큰, greedy search, HF pipeline + KV cache 기준. 오늘날의 장문맥·장출력 워크로드와는 거리가 있다.

Limitations 정리 [블로그에 없음: 명시적 한계 절이 없어 직접 정리]

#한계근거
1latency 민감 응용에는 부적합 — 자체적으로 대안(DeepSpeed-Inference/MII) 사용을 권고§When to use
2출력이 길어지면 KV cache가 batch를 잠식해 throughput 하락§Impact of output length
3성능이 PCIe 세대·슬롯 구성에 강하게 종속§Parallelizing, 각주 3
4weights offload 중심 설계 — KV cache offload 시 attention을 CPU에서 계산하는 등 긴 문맥 대응은 미성숙TriForce 논문 각주 1의 지적 [블로그에 없음]

FAQ

Q. FlexGen과는 뭐가 다른가?
A. [블로그에 없음] 같은 "offloading으로 GPU 1장 추론" 계열이다. FlexGen(2023)은 weights·KV·activation의 배치를 선형계획으로 최적화하는 학술 후속 연구, ZeRO-Inference는 ZeRO-Infinity(훈련용)를 추론에 이식한 실용 라이브러리 기능에 가깝다.
Q. 왜 이름이 ZeRO인가?
A. Zero Redundancy Optimizer 계열 기술이며, 추론에서는 GPU에 weights를 zero개 둔다는 중의적 의미로 소개된다 §Introduction.
Q. 지금(2026년) 기준으로도 유효한가?
A. [블로그에 없음] "GPU 메모리보다 큰 모델을 batch 처리한다"는 원리는 여전히 유효하고, 후속 연구들(FlexGen, TriForce의 offloading 세팅 등)이 같은 뼈대 위에 서 있다. 다만 2022년 글이라 KV cache 병목·speculative decoding 이후의 발전은 반영되어 있지 않다.
s₈ · 비판 / 한계

비판적으로 읽기: 이 시스템의 손익분기점은 "batch"다

ZeRO-Inference의 모든 효율은 "계산 시간 ≥ 전송 시간"이라는 한 가지 부등식 위에 서 있고, 그 부등식을 성립시키는 유일한 수단이 대량 batch다. batch를 못 키우는 상황 — 대화형 서비스(batch 1), 긴 출력으로 KV cache가 커진 상황 — 에서는 부등식이 깨지고 GPU는 PCIe를 기다리는 기계가 된다.

정상 vs 붕괴대량 batch일 때와 batch 1 대화형일 때의 대조 정상: 오프라인 대량 처리 (batch 큼) 예: 데이터셋 전체 라벨링·배치 요약 layer당: 계산 0.93s > 전송 0.23s → prefetch로 전송이 계산 뒤에 완전히 숨음 → GPU 가동률 높음, PCIe는 보이지 않는 배관 OPT-30B 43 tok/s (CPU offload) GPU 1장으로 175B급도 처리 가능 붕괴: 대화형 batch 1 (latency 요구) 예: 챗봇 — 사용자 1명이 답을 기다림 layer당: 계산 0.12s < 전송 0.23s → 전송이 지배 토큰 1개 = 96 layer × 0.23s ≈ 22초 [직접 계산] → 출력 길어지면 KV cache↑ → batch 더 못 키움 GPU는 대부분 PCIe 대기 상태 TriForce가 4.86× 격파한 지점이 바로 여기
이 그림이 말하는 것: 같은 시스템이 워크로드에 따라 "민주화의 도구"와 "22초/토큰 기계" 사이를 오간다. 블로그도 이를 알고 §When to use에서 용도를 명시적으로 제한한다.

논문/블로그가 다루지 않은 층위

① 알고리즘 층위 — ZeRO-Inference는 "무엇을 어디에 두고 어떻게 나르나"만 다루고, 비싼 실행의 횟수 자체를 줄이는 발상(speculative decoding)은 범위 밖이다. 2년 뒤 TriForce가 정확히 이 직교 축을 공략해 같은 offloading 환경에서 4.86×를 얻는다. ② KV cache 층위 — 2022년 시점이라 KV cache는 "batch를 줄이는 성가신 존재"로만 등장하고, KV cache 자체의 offload·압축·선택적 로드는 다루지 않는다. ③ 정밀도 층위 — fp16 고정. 이후 표준이 된 4/8bit quantization과 결합하면 전송량이 2~4배 줄어 손익분기 batch가 낮아질 텐데, 미평가다 [블로그에 없음: 해석].

유효 적용 범위

상황적합성이유
오프라인 대량 배치 처리 (요약·라벨링·평가) + GPU 예산 극소◎ 최적큰 batch 확보 → 전송 완전 은닉, 1000배 큰 모델 접근
NVMe만 큰 워크스테이션○ 유효prefetch 1.13~1.21× — 단 CPU 경유 2단 전송 감수
GPU 2~4장 (독립 PCIe 슬롯)○ 유효병렬 fetch로 super-linear — 슬롯 공유 구성이면 감소
대화형 챗봇, latency SLA 있는 서비스✕ 부적합블로그 스스로 DeepSpeed-Inference/MII 권고 §When to use
장문맥(수만 토큰 이상) 생성✕ 취약KV cache가 batch를 잠식 → 효율의 전제 붕괴. 이 지점의 후속 해법이 TriForce류
source: deepspeed.ai/2022/09/09/zero-inference.html (DeepSpeed, Microsoft) · 연계 문서: TriForce (arXiv:2404.11912) 요약