vLLM FP8 KV-Cache 및 Attention 양자화 업데이트

vLLM FP8 KV-Cache 및 Attention 양자화 업데이트

vLLM은 FP8 KV-cache 및 attention 양자화를 위한 핵심 수정 사항과 최적화를 구현하여, 긴 컨텍스트 LLM 서빙 시 메모리 사용량과 inter-token latency (ITL)를 크게 줄일 수 있도록 했습니다. --kv-cache-dtype fp8 플래그를 사용하면 사용자는 KV-cache 저장 공간을 절반으로 줄이고 attention 연산을 FP8 (e4m3)로 실행할 수 있으며, 이는 메모리 제한적인(memory-bound) 디코딩 워크로드에 특히 효과적입니다.

기술적 개선 및 버그 수정

최근 vLLM 업데이트는 Hopper 및 Blackwell GPU에서 스트레스 테스트 중 확인된 심각한 정확도 및 성능 저하 문제를 해결합니다.

정확도를 위한 2단계 누적(Two-Level Accumulation)

Hopper GPU에서 128k needle-in-a-haystack 작업의 정확도가 91% (BF16)에서 13% (FP8)로 급락하는 심각한 정확도 저하 문제를 해결하기 위해, vLLM은 2단계 누적 전략을 도입했습니다. 이 방식은 contraction dimension이 100k 이상에 도달할 때 Tensor Cores에서 발생하는 정밀도 손실을 완화하기 위해 부분적으로 누적된 결과를 실제 FP32 레지스터에 기록합니다. 이 수정으로 정확도가 89%로 회복되었습니다.

하이브리드 Attention 및 레이어 스킵(Layer Skipping)

일부 레이어가 작은 윈도우(예: 128 tokens)를 사용하는 sliding-window attention을 사용하는 하이브리드 attention 아키텍처 모델(예: GPT-OSS)의 경우, FP8 양자화의 오버헤드가 메모리 이점보다 큰 경우가 많습니다. vLLM은 이제 --kv-cache-dtype-skip-layers sliding_window 플래그를 포함하여, 이러한 특정 레이어가 BF16 상태를 유지함으로써 디코딩 속도를 향상시킬 수 있도록 합니다.

커널 및 퓨전 최적화

  • Per-Head Scales: Flash Attention 3 (FA3) 커널은 이제 FP8 양자화를 위한 scale 배열을 지원하며, 각 scale은 하나의 KV-head에 대응합니다.
  • Query Quantization Fusion: Query 양자화가 torch.compile이 퓨전할 수 있는 torch 구현으로 이동하여, 고정된 per-token 오버헤드를 제거했습니다.
  • Tiling Configurations: head_dim = 64head_dim = 128에 대한 prefill tiling이 2단계 누적으로 인한 register spills를 줄이도록 조정되었습니다.

성능 벤치마킹

KV-cache를 BF16에서 FP8로 양자화하면 attention 단계당 메모리 트래픽이 절반으로 줄어들며, 이는 ITL 기울기(입력 길이에 따라 지연 시간이 증가하는 속도)를 직접적으로 감소시킵니다.

단일 요청 지연 시간

Llama-3.1-8B를 사용하는 H100 GPU에서 ITL 기울기는 4.37e-05에서 2.37e-05 ms/token으로 감소(54% 감소)하여, 디코딩 break-even 지점을 약 7k tokens로 낮추었습니다. gpt-oss-20b의 경우, skip-SW 변형을 사용하여 ITL 기울기를 BF16 베이스라인의 71%로 줄였습니다.

부하 상황에서의 처리량

높은 부하 시나리오(concurrency 8, ~20k input tokens)에서 FP8은 다음과 같은 이점을 제공했습니다:

  • Llama-3.1-8B: 출력 처리량 14.9% 향상 및 총 실행 시간 13.0% 단축.
  • gpt-oss-20b: 출력 처리량 4.8% 향상 (skip-SW 변형 사용 시).

아키텍처별 결과

  • Blackwell (B200): FlashInfer 백엔드를 사용할 때, Llama-3.1-8B의 ITL 기울기는 BF16의 54%로 감소했으며, break-even 지점은 약 4k tokens였습니다. Blackwell은 Hopper에서 발견된 정밀도 문제가 없으므로 2단계 누적이 필요하지 않습니다.
  • 대형 Head Dimension을 가진 Hopper (H100): head_dim = 256인 모델(예: gemma-4-E2B)의 경우, 2단계 누적으로 인한 레지스터 압박 증가로 인해 prefill 성능(TTFT)이 BF16보다 느립니다(긴 컨텍스트에서 약 1.6배 느림).

정확도 및 검증

성능 하한선을 설정하기 위해 보정되지 않은 양자화 스케일(scale = 1.0)을 사용하여 평가를 수행했습니다.

추론 및 긴 컨텍스트 작업

  • 추론(Reasoning): Qwen3-30B-A3B-Thinking-2507 및 Qwen3.5-27B에서 FP8 KV-cache 및 attention 양자화는 일반적으로 0에서 2점 사이의 미미한 정확도 손실을 보였습니다.
  • 긴 컨텍스트 (MRCR): Llama-3.3-70B-Instruct는 베이스라인 AUC@128k의 97-98%를 회복했습니다. Qwen3.5-27B는 집계된 AUC@1M 메트릭을 완전히 회복하여 극단적인 컨텍스트 길이에서도 안정성을 입증했습니다.

보정(Calibration) 사용 시점

보정되지 않은 FP8이 충분한 경우가 많지만, 일부 모델은 체계적인 성능 저하를 보입니다. 예를 들어, FlashMLA 백엔드를 사용하는 Kimi-K2.5는 시퀀스 길이에 따라 정확도가 지속적으로 하락하는 모습을 보였습니다. 이러한 경우 vLLM은 llm-compressor를 통한 스케일 보정 또는 per-attention-head 양자화 스케일을 지원합니다.

사용 권장 사항 요약

시나리오 권장 사항
디코딩 중심, 메모리 제한적 워크로드 --kv-cache-dtype fp8 사용
하이브리드-attention 모델 --kv-cache-dtype fp8 --kv-cache-dtype-skip-layers sliding_window 사용
짧은 컨텍스트 (< 7k tokens) 작은 FP8 오버헤드를 피하기 위해 BF16 유지
prefill 우선순위가 높은 head_dim = 256 BF16을 유지하거나 2단계 누적 비활성화 (정확도 검증 필요)
지속적인 정확도 손실 (< 95%) llm-compressor를 사용하여 보정 적용

Sources