NLP/LLM

LLM 서빙 관련 글 모음

아르카눔 2025. 4. 27. 15:15

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://masteringllm.medium.com/how-much-gpu-memory-is-needed-to-serve-a-large-languagemodel-llm-b1899bb2ab5d

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://yjoonjang.medium.com/%EB%B6%84%EC%82%B0-%EC%B2%98%EB%A6%AC-3-pipeline-parallelism%EA%B3%BC-tensor-parallelism%EC%97%90-%EA%B4%80%ED%95%98%EC%97%AC-7b4420fe0281

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