DeepSpeed-FastGen — MII와 DeepSpeed-Inference로 만든 고성능 LLM 서빙

DeepSpeed-FastGen — MII와 DeepSpeed-Inference로 만든 고성능 LLM 서빙

DeepSpeed-FastGen은 DeepSpeed-Inference v2의 실체로, LLM 서빙에서 큰 문제였던 프롬프트 처리(prefill)와 생성을 한 시스템에서 효율적으로 합치는 데 집중해요. 기존 시스템들은 이 두 단계를 분리 취급하다 보니 생성 단계가 프롬프트 처리에 밀려 SLA(서비스 수준 협약)를 위협받곤 했어요. FastGen은 새로 제안한 Dynamic SplitFuse 기법으로 이 한계를 넘어서면서, vLLM 같은 최신 시스템보다 최대 2.3배 높은 실효 처리량을 냈다고 해요. DeepSpeed-MII와 DeepSpeed-Inference를 결합해, 설치 몇 줄이면 쓸 수 있는 쉬운 서빙 시스템이에요.

출처: DeepSpeed 공식 문서 — DeepSpeed-FastGen: High-throughput Text Generation for LLMs via MII and DeepSpeed-Inference

빠른 시작

DeepSpeed-FastGen을 쓰는 건 최신 DeepSpeed-MII 릴리스를 설치하는 것만큼 간단해요.

pip install deepspeed-mii

비영속(pipeline) 배포로 텍스트를 생성하는 가장 간단한 코드는 이래요 (자세한 건 아래 배포 옵션 참고).

Dynamic SplitFuse: 프롬프트와 생성의 새로운 결합 전략

FastGen의 핵심은 Dynamic SplitFuse예요. 기존 방식이 시스템마다 prompt 처리와 token 생성이 따로 놀았던 걸, FastGen은 일관된 forward 크기를 유지하도록 프롬프트에서 토큰 일부를 가져와 생성과 결합하는 방식으로 바꿨어요. 즉, 고정된 forward 배치 크기에서 프롬프트 토큰과 생성 토큰을 함께 넣어 항상 GPU를 빈틈없이 채우는 전략이죠. 이 때문에 비연속 KV 캐시와 연속 배치(continuous batching)를 잘 활용하면서도, 응답성(responsivity)과 점유율(occupancy)을 동시에 높일 수 있어요.

성능 평가

벤치마크는 Llama-2 7B, 13B, 70B를 NVIDIA A100, H100, A6000에서 vLLM과 비교했어요. 긴 프롬프트 워크로드가 점점 중요해지는 상황(MPT-StoryWriter 같은 모델이나 DeepSpeed Ulysses 같은 시스템이 긴 컨텍스트를 지원하면서)에서, FastGen은 실효 처리량에서 최대 2.3배 우위를 보여줬어요.

사용법: 비영속 파이프라인 vs 영속 서빙

FastGen은 DeepSpeed-MII와 DeepSpeed-Inference의 시너지 조합으로 구현돼요. 백엔드에서 HuggingFace API로 모델 가중치와 토크나이저를 가져오기 때문에, 현재 지원 모델은 HuggingFace 기반이에요. 설치 후 두 가지 배포 옵션이 있어요 — 인터랙티브 비영속 파이프라인, 또는 영속 서빙 배포.

비영속 파이프라인 예시는 이래요.

from mii import pipeline

pipe = pipeline("mistralai/Mistral-7B-v0.1")
output = pipe(["Hello, my name is", "DeepSpeed is"], max_new_tokens=128)
print(output)

고급 설치 정보

이 영역의 다른 프로젝트들이 요구하는 긴 컴파일 시간을 줄이기 위해, 커널 대부분을 미리 컴파일된 Python 휠로 배포해요. 이게 바로 DeepSpeed-Kernels라는 별도 라이브러리로 배포되는 부분이에요.

더 알아보기 (Learn more)