LLM 서빙 관련 글 모음
GPU RAM 필요량 계산
우선 LLM을 API로 가져와서 쓰는게 아니라면 GPU의 RAM 계산이 필수적이다.
이에 관련된 내용들을 레퍼런스들에서 참고해서 적어본다.
학습이 아니라 추론만을 위한 계산은 다음과 같다.
M = $\frac{P \times 4B}{\frac{32}{Q}} \times 1.2$
- M is the GPU memory in Gigabytes.
- P is the number of parameters in the model.
- 4B represents the 4 bytes used per parameter.
- Q is the number of bits for loading the model (e.g., 16-bit or 32-bit).
- 1.2 accounts for a 20% overhead.
LLama 2의 7B를 FP16으로 가져오면 결과 값은 7 * 4B / 2 * 1.2 = 16.8 GB가 필요하다.
NVIDIA 블로그를 참조하면 더 간단하게 계산할 수 있다.
LLama 2 7B를 예로 들면 아래 공식에 의해서 총 14 GB의 램이 필요하다.
7B * sizeof(FP16) ~= 14GB
그냥 모델의 파라미터에 2배를 해주면 된다.
이는 일반적으로 LLM이 FP16으로 공유되기 때문이다.
Quantization으로 FP8 이런식으로 바뀌면 필요한 VRAM의 크기는 더 줄어들게 된다.
엔비디아 방식으로 계산하고 1.2를 추가적으로 곱해주는게 가장 편해보인다.
KV Caching
그리고 대부분의 경우 KV 캐싱을 사용하기 때문에 추가적인 메모리가 필요하다.
Total size of KV cache in bytes = (batch_size) * (sequence_length) * 2 * (num_layers) * (hidden_size) * sizeof(FP16)
Llama 7B의 경우 약 2GB의 메모리가 필요하다.
추론 시간 향상을 위한 알고리즘
- KV Cache - 추가적인 메모리 필요
- vLLM의 Paged Attention - 최적화된 KV Cache로 메모리 사용량이 감소
병렬화
- Pipeline Parallelism (PP) 파이프라인 병렬화
- Tensor Parallelism (TP) 텐서 병렬화
- Sequence Parallelism (SP) 시퀀스 병렬화
Parallelism Libraries
양자화 Quantization
Qwen2.5-Coder를 Ollama에서 제공하는 걸 보면 Q4_K_M으로 양자화한걸 알 수 있다. (블로그 링크)
14B에 BF16이라서 28 GB 내외여야 정상일텐데 Q4_K_M을 써서 용량이 15 GB임을 알 수 있다.
보통 vLLM을 많이 쓰는 것 같긴하다.
학습에는 FSDP를 쓰면 되지만 정작 추론을 하는 서빙 단계에서는 어떤걸 써야하나 궁금해져서 찾아보았다.
일반적인 2B, 3B, 7B, 8B야 H100 80G에서 추론이 가능하지만 70B 이런 큰 모델은 추론시에 어떻게 하나 싶었는데 어느정도 해결되었다.
2025.07.02 추가
llama.cpp과 vllm을 RTX 4070으로 비교한 글 (링크)이 있어서 추가한다.
vllm이 llama.cpp 보다 성능이 더 좋다고 한다.
보니까 Cache line과 Memory coalescing이 핵심 키워드다.
Flash Attention 때도 느꼈지만 이젠 하드웨어쪽을 고려한 최적화도 정말 필수적인 듯하다.
References:
https://yooniverse1007.tistory.com/33
https://toss.tech/article/llm-serving
https://developer.nvidia.com/ko-kr/blog/mastering-llm-techniques-inference-optimization/
https://www.databricks.com/kr/blog/llm-inference-performance-engineering-best-practices
https://velog.io/@kaiba0514/vLLM%EC%9D%80-%EC%99%9C-%EB%B9%A0%EB%A5%B8%EA%B0%80-Paged-Attention
https://docs.vllm.ai/en/stable/
https://huggingface.co/docs/text-generation-inference/conceptual/tensor_parallelism
https://pytorch.org/tutorials/intermediate/TP_tutorial.html
https://news.hada.io/topic?id=21644
https://shlee08.tistory.com/214
https://hotstone.tistory.com/8
https://developer.nvidia.com/blog/how-access-global-memory-efficiently-cuda-c-kernels/
https://junstar92.tistory.com/250