๐Ÿ’ป AI Software

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๋Š” ์ตœ์†Œํ•œ์˜ ์„ค์ •์œผ๋กœ ์ตœ์ฒจ๋‹จ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

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)๋กœ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

๋™์ž‘ ์›๋ฆฌ

๋ณ€ํ™˜ ํŒŒ์ดํ”„๋ผ์ธ

  1. Hugging Face ๋ชจ๋ธ ๋ณ€ํ™˜: Python ์Šคํฌ๋ฆฝํŠธ(convert_hf_to_gguf.py)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ PyTorch/TensorFlow ๋ชจ๋ธ์„ GGUF ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
  2. ์–‘์žํ™” ์ ์šฉ: llama-quantize ๋„๊ตฌ๋กœ ์›ํ•˜๋Š” ์ •๋ฐ€๋„๋กœ ์–‘์žํ™”
  3. ๋ชจ๋ธ ๋กœ๋”ฉ: llama.cpp๊ฐ€ GGUF ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๊ณ  ์ถ”๋ก  ์ค€๋น„
llama.cpp ์ปดํŒŒ์ผ๋Ÿฌ ํŒŒ์ดํ”„๋ผ์ธ

์ถ”๋ก  ๊ณผ์ •

ํ…์ŠคํŠธ ์ž…๋ ฅ โ†’ ํ† ํฌ๋‚˜์ด์ง• โ†’ ์ž„๋ฒ ๋”ฉ โ†’ ์ถ”๋ก (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 ์–‘์žํ™” ๋ฐฉ๋ฒ• ๋น„๊ต

ํ•˜๋“œ์›จ์–ด ์ง€์› ๋น„๊ต

ํŠน์„ฑ 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 ์ตœ์ ํ™”

์žฅ๋‹จ์ 

์žฅ์ 

  1. ๊ทน๋„์˜ ๊ฒฝ๋Ÿ‰์„ฑ: ์™ธ๋ถ€ ์˜์กด์„ฑ์ด ๊ฑฐ์˜ ์—†๋Š” ์ˆœ์ˆ˜ C/C++ ๊ตฌํ˜„
  2. ๊ด‘๋ฒ”์œ„ํ•œ ํ•˜๋“œ์›จ์–ด ์ง€์›: CPU, GPU, NPU ๋“ฑ ๋‹ค์–‘ํ•œ ํ”Œ๋žซํผ
  3. ํšจ์œจ์ ์ธ ์–‘์žํ™”: 1.5๋น„ํŠธ๋ถ€ํ„ฐ 8๋น„ํŠธ๊นŒ์ง€ ๋‹ค์–‘ํ•œ ์˜ต์…˜
  4. ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”: mmap ์ง€์›์œผ๋กœ ๋น ๋ฅธ ๋กœ๋”ฉ๊ณผ ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ
  5. ํ™œ๋ฐœํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ: ์ง€์†์ ์ธ ๊ฐœ์„ ๊ณผ ์ƒˆ ๋ชจ๋ธ ์ง€์›
  6. API ํ˜ธํ™˜์„ฑ: OpenAI API์™€ ํ˜ธํ™˜๋˜๋Š” HTTP ์„œ๋ฒ„ ์ œ๊ณต
  7. ๋ฉ€ํ‹ฐ๋ชจ๋‹ฌ ์ง€์›: LLaVA, BakLLaVA ๋“ฑ ๋น„์ „-์–ธ์–ด ๋ชจ๋ธ ์ง€์›
  8. Grammar ๊ธฐ๋ฐ˜ ์ถœ๋ ฅ ์ œ์•ฝ: GBNF ๋ฌธ๋ฒ•์œผ๋กœ JSON ๋“ฑ ๊ตฌ์กฐํ™”๋œ ์ถœ๋ ฅ ๊ฐ€๋Šฅ
  9. WebGPU ์ง€์›: ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ๋„ ์ถ”๋ก  ๊ฐ€๋Šฅ

๋‹จ์ 

  1. ์ปดํŒŒ์ผ ํ•„์š”: ์†Œ์Šค์—์„œ ๋นŒ๋“œํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ดˆ๊ธฐ ์„ค์ • ๋ณต์žก
  2. ์ œํ•œ๋œ ํ›ˆ๋ จ ์ง€์›: ์ฃผ๋กœ ์ถ”๋ก ์— ํŠนํ™”๋จ
  3. ๋Œ€๊ทœ๋ชจ ๋ชจ๋ธ ์ œํ•œ: ์ตœ์‹  ๋Œ€ํ˜• ๋ชจ๋ธ์€ ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ
  4. ์‹œ์ž‘ ์‹œ๊ฐ„: ๋Œ€ํ˜• ๋ชจ๋ธ ๋กœ๋”ฉ์— ์‹œ๊ฐ„ ์†Œ์š”

๊ด€๋ จ ๊ธฐ์ˆ 

์ฐธ๊ณ  ๋ฌธํ—Œ

๊ด€๋ จ ๋„๊ตฌ

  • 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

๊ด€๋ จ ๊ฐœ๋…

ํ•ต์‹ฌ ์ •๋ฆฌ

  1. llama.cpp๋Š” C/C++๋กœ ๊ตฌํ˜„๋œ ๊ฒฝ๋Ÿ‰ LLM ์ถ”๋ก  ์—”์ง„์œผ๋กœ, ๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด์—์„œ ์ตœ์ ํ™”๋œ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. GGUF ํ˜•์‹์€ ๋‹จ์ผ ํŒŒ์ผ๋กœ ๋ชจ๋ธ์„ ๋ฐฐํฌํ•˜๋ฉฐ, mmap์„ ํ†ตํ•œ ๋น ๋ฅธ ๋กœ๋”ฉ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  3. k-quant ๋ฐ i-quant ๊ธฐ๋ฒ•์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๋ฉด์„œ ์ถ”๋ก  ํ’ˆ์งˆ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  4. Metal, CUDA, HIP ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ฒ”์šฉ ํ•˜๋“œ์›จ์–ด ๊ฐ€์†์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  5. CPU+GPU ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ์ถ”๋ก ์„ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰๋ณด๋‹ค ํฐ ๋ชจ๋ธ๋„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Sources: llama.cpp Documentation, GGUF Specification, ggml Repository
PDF: ์—†์Œ (์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ ๊ธฐ๋ฐ˜)