llama.cpp Compiler ์์ธ
llama.cpp๋ C/C++๋ก ๊ตฌํ๋ ๊ฒฝ๋ LLM ์ถ๋ก ์์ง์ผ๋ก, ๋ค์ํ ํ๋์จ์ด์์ ์ต์ ํ๋ ์ถ๋ก ์ ์ ๊ณตํฉ๋๋ค.
๊ฐ์
llama.cpp๋ ๋๊ท๋ชจ ์ธ์ด ๋ชจ๋ธ(LLM)์ ๋ค์ํ ํ๋์จ์ด์์ ํจ์จ์ ์ผ๋ก ์ถ๋ก ํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์คํ์์ค ์ถ๋ก ์์ง์ ๋๋ค. Georgi Gerganov๊ฐ 2023๋ ์ ์ฒ์ ๋ฐํํ ์ด ํ๋ก์ ํธ๋ ์์ C/C++๋ก ๊ตฌํ๋์ด ์ธ๋ถ ์์กด์ฑ์ด ๊ฑฐ์ ์์ผ๋ฉฐ, Apple Silicon๋ถํฐ NVIDIA GPU, AMD GPU๊น์ง ๋ค์ํ ํ๋ซํผ์ ์ง์ํฉ๋๋ค.
llama.cpp์ ํต์ฌ์ ggml ํ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ GGUF ํ์ผ ํ์์ ๋๋ค. ggml์ ํ ์ ์ฐ์ฐ์ ์ํ ๊ณ ์ฑ๋ฅ C ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ณ , GGUF๋ ๋ชจ๋ธ ๊ฐ์ค์น์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์ ์ฅํ๊ธฐ ์ํ ๋ฐ์ด๋๋ฆฌ ํ์์ ๋๋ค. ์ด ๋ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก llama.cpp๋ ์ต์ํ์ ์ค์ ์ผ๋ก ์ต์ฒจ๋จ ์ฑ๋ฅ์ ๋ฌ์ฑํฉ๋๋ค.
ํต์ฌ ๊ฐ๋
GGUF ํ์ผ ํ์
GGUF(GGML Universal File)๋ ๋ชจ๋ธ ์ถ๋ก ์ ์ํ ํ์ค ํ์ผ ํ์์ ๋๋ค. ๋จ์ผ ํ์ผ๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ๋ฉฐ, ๋ชจ๋ธ์ ๋ชจ๋ ์ ๋ณด(ํ์ดํผํ๋ผ๋ฏธํฐ, ํ ํฌ๋์ด์ , ๊ฐ์ค์น ๋ฑ)๋ฅผ ํฌํจํฉ๋๋ค. mmap์ ํตํ ๋น ๋ฅธ ๋ก๋ฉ์ ์ง์ํ๋ฉฐ, ๋ค์ํ ์ธ์ด์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ค๊ณ๋์์ต๋๋ค.
GGUF ํ์ผ์ ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์กฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค:
- ํค๋: ๋งค์ง ๋๋ฒ(0x47475546), ๋ฒ์ , ํ
์ ์, ๋ฉํ๋ฐ์ดํฐ ์
- ํ
์ ์ ๋ณด: ๊ฐ ํ
์์ ์ด๋ฆ, ์ฐจ์, ํ์
, ์คํ์
- ํ
์ ๋ฐ์ดํฐ: ์ค์ ๋ชจ๋ธ ๊ฐ์ค์น
์์ํ(Quantization)
์์ํ๋ ๋ชจ๋ธ ๊ฐ์ค์น์ ์ ๋ฐ๋๋ฅผ ๋ฎ์ถฐ ํ์ผ ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ์ถ๋ก ์๋๋ฅผ ํฅ์์ํค๋ ๊ธฐ์ ์ ๋๋ค. llama.cpp๋ ๋ค์ํ ์์ํ ๋ฐฉ๋ฒ์ ์ง์ํฉ๋๋ค:
๊ธฐ๋ณธ ์์ํ ํ์
- F32: 32๋นํธ ๋ถ๋์์์ (์๋ณธ ์ ๋ฐ๋)
- F16: 16๋นํธ ๋ถ๋์์์ (๋ฉ๋ชจ๋ฆฌ 50% ์ ๊ฐ)
- Q8_0: 8๋นํธ ์์ํ (๋ฉ๋ชจ๋ฆฌ 75% ์ ๊ฐ)
- Q4_0: 4๋นํธ ์์ํ (๋ฉ๋ชจ๋ฆฌ 87% ์ ๊ฐ)
k-quant ์์ํ
k-quant๋ ๋ ์ด์ด๋ณ๋ก ๋ค๋ฅธ ์์ํ ๋ ๋ฒจ์ ์ ์ฉํ๋ ๊ณ ๊ธ ๊ธฐ๋ฒ์
๋๋ค:
- Q4_K_M: ์ค๊ฐ ์ ๋ฐ๋ 4๋นํธ (๊ท ํ ์กํ ์ฑ๋ฅ)
- Q5_K_M: ์ค๊ฐ ์ ๋ฐ๋ 5๋นํธ (๋์ ์ ๋ฐ๋)
- Q6_K: 6๋นํธ ์์ํ (์ต๊ณ ์ ๋ฐ๋)
i-quant ์์ํ
i-quant๋ ์ค์๋ ํ๋ ฌ(imatrix)์ ํ์ฉํ ์ต์ ํ๋ ์์ํ์
๋๋ค:
- IQ2_XXS: 2๋นํธ ๊ทนํ ์์ถ
- IQ3_S: 3๋นํธ ๊ท ํ ๋ชจ๋
- IQ4_XS: 4๋นํธ ๊ณ ์ฑ๋ฅ ๋ชจ๋
์ค์๋ ํ๋ ฌ(Importance Matrix)
์ค์๋ ํ๋ ฌ์ ๊ฐ ํ ์์ ์ค์๋๋ฅผ ์ธก์ ํ์ฌ ์์ํ ์ ์์ค์ ์ต์ํํ๋ ๊ธฐ์ ์ ๋๋ค. ๋ชจ๋ธ์ ์ถ๋ ฅ ํ์ง์ ์ ์งํ๋ฉด์ ๋ ๊ณต๊ฒฉ์ ์ธ ์์ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ค์ค ํ ํฐ ์์ธก(Multi-Token Prediction)
MTP๋ ์ถ์ธก ์คํ(Speculative Decoding)์ ์ํ ๋๋ํํธ ๋ชจ๋ธ๋ก, ๋ฉ์ธ ๋ชจ๋ธ๊ณผ ํจ๊ป ์ฌ์ฉ๋์ด ์ถ๋ก ์๋๋ฅผ ํฅ์์ํต๋๋ค. ๋ณ๋์ GGUF ํ์ผ(mtp-*.gguf)๋ก ์ ๊ณต๋ฉ๋๋ค.
๋์ ์๋ฆฌ
๋ณํ ํ์ดํ๋ผ์ธ
- Hugging Face ๋ชจ๋ธ ๋ณํ: Python ์คํฌ๋ฆฝํธ(
convert_hf_to_gguf.py)๋ฅผ ์ฌ์ฉํ์ฌ PyTorch/TensorFlow ๋ชจ๋ธ์ GGUF ํ์์ผ๋ก ๋ณํ - ์์ํ ์ ์ฉ:
llama-quantize๋๊ตฌ๋ก ์ํ๋ ์ ๋ฐ๋๋ก ์์ํ - ๋ชจ๋ธ ๋ก๋ฉ: llama.cpp๊ฐ GGUF ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๊ณ ์ถ๋ก ์ค๋น
์ถ๋ก ๊ณผ์
ํ
์คํธ ์
๋ ฅ โ ํ ํฌ๋์ด์ง โ ์๋ฒ ๋ฉ โ ์ถ๋ก (Transformer ๋ ์ด์ด) โ ๋์ฝ๋ฉ โ ํ
์คํธ ์ถ๋ ฅ
ํ๋์จ์ด ๊ฐ์
llama.cpp๋ ๋ค์ํ ๋ฐฑ์๋๋ฅผ ์ง์ํฉ๋๋ค:
| ๋ฐฑ์๋ | ๋์ ๋๋ฐ์ด์ค | ํน์ง |
|---|---|---|
| Metal | Apple Silicon | ARM NEON, Accelerate ํ๋ ์์ํฌ ํ์ฉ |
| CUDA | NVIDIA GPU | ์ปค์คํ CUDA ์ปค๋ ์ต์ ํ |
| HIP | AMD GPU | ROCm ๊ธฐ๋ฐ ์ง์ |
| Vulkan | ๋ฒ์ฉ GPU | ํฌ๋ก์ค ํ๋ซํผ ์ง์ |
| SYCL | Intel GPU | oneAPI ๊ธฐ๋ฐ ์ง์ |
| BLAS | ๋ชจ๋ ํ๋ซํผ | ๊ธฐ๋ณธ ์ ํ๋์ ์ฐ์ฐ |
CPU+GPU ํ์ด๋ธ๋ฆฌ๋ ์ถ๋ก
๋ฉ๋ชจ๋ฆฌ ์ฉ๋๋ณด๋ค ํฐ ๋ชจ๋ธ์ ๋ถ๋ถ์ ์ผ๋ก ๊ฐ์ํ๋ ๊ธฐ์ ์ ๋๋ค. ๋ชจ๋ธ์ ์ผ๋ถ๋ CPU, ๋๋จธ์ง๋ GPU์ ํ ๋นํ์ฌ ์ถ๋ก ํฉ๋๋ค.
๋น๊ต/๋ถ์
์์ํ ๋ฐฉ๋ฒ ๋น๊ต
| ๋ฐฉ๋ฒ | ๋นํธ/๊ฐ์ค์น | ํฌ๊ธฐ (8B ๋ชจ๋ธ) | ํ๋กฌํํธ ์ฒ๋ฆฌ (t/s) | ํ ์คํธ ์์ฑ (t/s) |
|---|---|---|---|---|
| Q2_K_S | 2.97 | 2.78 GiB | 798.91 | 90.01 |
| Q4_K_M | 4.89 | 4.58 GiB | 821.81 | 71.93 |
| Q6_K | 6.56 | 6.14 GiB | 812.01 | 58.67 |
| Q8_0 | 8.50 | 7.95 GiB | 865.09 | 50.93 |
| F16 | 16.00 | 14.96 GiB | 923.49 | 29.17 |
ํ๋์จ์ด ์ง์ ๋น๊ต
| ํน์ฑ | llama.cpp | PyTorch | TensorFlow |
|---|---|---|---|
| ์์กด์ฑ | ๊ฑฐ์ ์์ | Python + C++ | Python + C++ |
| Apple Silicon | ๋ค์ดํฐ๋ธ ์ง์ | MPS ๋ฐฑ์๋ | Metal ์ ํ์ |
| ์์ํ | 1.5~8๋นํธ | 8๋นํธ๋ง | 8๋นํธ๋ง |
| ๋ฉ๋ชจ๋ฆฌ ํจ์จ | ๋งค์ฐ ๋์ | ๋ณดํต | ๋ณดํต |
| ์์ ์๊ฐ | ๋งค์ฐ ๋น ๋ฆ | ๋ณดํต | ๋๋ฆผ |
๊ฒฝ๋ ์ถ๋ก ์์ง ๋น๊ต
| ์์ง | ์ธ์ด | ํน์ง |
|---|---|---|
| llama.cpp | C/C++ | ์ต์ ์์กด์ฑ, ๋ค์ํ ์์ํ |
| ollama | Go | ์ฌ์ฉ ํธ์์ฑ ์ค์ฌ |
| vLLM | Python | ๊ณ ์ฑ๋ฅ ์๋น |
| TensorRT-LLM | C++ | NVIDIA ์ต์ ํ |
์ฅ๋จ์
์ฅ์
- ๊ทน๋์ ๊ฒฝ๋์ฑ: ์ธ๋ถ ์์กด์ฑ์ด ๊ฑฐ์ ์๋ ์์ C/C++ ๊ตฌํ
- ๊ด๋ฒ์ํ ํ๋์จ์ด ์ง์: CPU, GPU, NPU ๋ฑ ๋ค์ํ ํ๋ซํผ
- ํจ์จ์ ์ธ ์์ํ: 1.5๋นํธ๋ถํฐ 8๋นํธ๊น์ง ๋ค์ํ ์ต์
- ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ: mmap ์ง์์ผ๋ก ๋น ๋ฅธ ๋ก๋ฉ๊ณผ ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ
- ํ๋ฐํ ์ปค๋ฎค๋ํฐ: ์ง์์ ์ธ ๊ฐ์ ๊ณผ ์ ๋ชจ๋ธ ์ง์
- API ํธํ์ฑ: OpenAI API์ ํธํ๋๋ HTTP ์๋ฒ ์ ๊ณต
- ๋ฉํฐ๋ชจ๋ฌ ์ง์: LLaVA, BakLLaVA ๋ฑ ๋น์ -์ธ์ด ๋ชจ๋ธ ์ง์
- Grammar ๊ธฐ๋ฐ ์ถ๋ ฅ ์ ์ฝ: GBNF ๋ฌธ๋ฒ์ผ๋ก JSON ๋ฑ ๊ตฌ์กฐํ๋ ์ถ๋ ฅ ๊ฐ๋ฅ
- WebGPU ์ง์: ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ ์ถ๋ก ๊ฐ๋ฅ
๋จ์
- ์ปดํ์ผ ํ์: ์์ค์์ ๋น๋ํด์ผ ํ๋ฏ๋ก ์ด๊ธฐ ์ค์ ๋ณต์ก
- ์ ํ๋ ํ๋ จ ์ง์: ์ฃผ๋ก ์ถ๋ก ์ ํนํ๋จ
- ๋๊ท๋ชจ ๋ชจ๋ธ ์ ํ: ์ต์ ๋ํ ๋ชจ๋ธ์ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ
- ์์ ์๊ฐ: ๋ํ ๋ชจ๋ธ ๋ก๋ฉ์ ์๊ฐ ์์
๊ด๋ จ ๊ธฐ์
์ฐธ๊ณ ๋ฌธํ
- llama.cpp GitHub ์ ์ฅ์
- ggml ํ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- GGUF ํ์ผ ํ์ ์ฌ์
- k-quant ์์ํ ๋ ผ๋ฌธ
- ์ค์๋ ํ๋ ฌ ๊ธฐ๋ฒ
- GBNF ๋ฌธ๋ฒ ๊ฐ์ด๋
- ๋ฉํฐ๋ชจ๋ฌ ์ง์ ๋ฌธ์
๊ด๋ จ ๋๊ตฌ
- llama-quantize: ๋ชจ๋ธ ์์ํ ๋๊ตฌ
- llama-cli: ๋ช ๋ น์ค ์ถ๋ก ์ธํฐํ์ด์ค
- llama-server: OpenAI API ํธํ HTTP ์๋ฒ
- llama-bench: ์ฑ๋ฅ ๋ฒค์น๋งํฌ ๋๊ตฌ
- llama-perplexity: ๋ชจ๋ธ ํ์ง ์ธก์ ๋๊ตฌ
- llama-simple: ์ต์ํ์ ์ถ๋ก ์์
๋ฐ์ธ๋ฉ ๋ฐ ํตํฉ
- Python: llama-cpp-python, easy-llama
- Node.js: node-llama-cpp
- Rust: llama_cpp-rs, rust-llama.cpp
- Go: go-llama.cpp, yzma
- Java: java-llama.cpp
- C#: LLamaSharp
- Swift: llama-cpp-swift
- Flutter/Dart: llama_cppdart
๊ด๋ จ ๊ฐ๋
ํต์ฌ ์ ๋ฆฌ
- llama.cpp๋ C/C++๋ก ๊ตฌํ๋ ๊ฒฝ๋ LLM ์ถ๋ก ์์ง์ผ๋ก, ๋ค์ํ ํ๋์จ์ด์์ ์ต์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- GGUF ํ์์ ๋จ์ผ ํ์ผ๋ก ๋ชจ๋ธ์ ๋ฐฐํฌํ๋ฉฐ, mmap์ ํตํ ๋น ๋ฅธ ๋ก๋ฉ์ ์ง์ํฉ๋๋ค.
- k-quant ๋ฐ i-quant ๊ธฐ๋ฒ์ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ด๋ฉด์ ์ถ๋ก ํ์ง์ ์ ์งํฉ๋๋ค.
- Metal, CUDA, HIP ๋ฑ ๋ค์ํ ๋ฐฑ์๋๋ฅผ ์ง์ํ์ฌ ๋ฒ์ฉ ํ๋์จ์ด ๊ฐ์์ด ๊ฐ๋ฅํฉ๋๋ค.
- CPU+GPU ํ์ด๋ธ๋ฆฌ๋ ์ถ๋ก ์ ํตํด ๋ฉ๋ชจ๋ฆฌ ์ฉ๋๋ณด๋ค ํฐ ๋ชจ๋ธ๋ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
Sources: llama.cpp Documentation, GGUF Specification, ggml Repository
PDF: ์์ (์คํ์์ค ํ๋ก์ ํธ ๋ฌธ์ ๊ธฐ๋ฐ)