llama.cpp
C++ ile yazılmış, her yerde çalışan inference motoru
Genel bakış
llama.cpp, Georgi Gerganov tarafından yazılan saf C/C++ inference motoru. Sıfır Python bağımlılığı, tek statik binary, her platformda çalışır. Ollama ve LM Studio gibi araçların altında bu vardır — ama doğrudan kullanmak da mümkün, daha çok kontrol verir.
GGUF formatının yaratıcısı. CPU, Metal, CUDA, Vulkan, ROCm, OpenCL, SYCL — desteklemediği donanım yok gibi. Embedded sistemler, sunucu dağıtımı, kendi ürününe gömme için ideal.
Kurulum
# Homebrew (Metal otomatik açık)
brew install llama.cpp
# Veya kaynaktan
git clone https://github.com/ggml-org/llama.cpp
cd llama.cpp
cmake -B build -DGGML_METAL=ON
cmake --build build --config Release -j
./build/bin/llama-cli --versionYapılandırma
# Hugging Face'den GGUF indir
huggingface-cli download bartowski/Llama-3.1-8B-Instruct-GGUF \
Llama-3.1-8B-Instruct-Q4_K_M.gguf --local-dir ./models
# Sohbet
./build/bin/llama-cli \
-m ./models/Llama-3.1-8B-Instruct-Q4_K_M.gguf \
-p "Selam, kendini tanıt." \
-n 256 \
-c 8192 \
-ngl 99 # GPU katmanı (Metal/CUDA için)./build/bin/llama-server \
-m ./models/Llama-3.1-8B-Instruct-Q4_K_M.gguf \
--host 127.0.0.1 --port 8080 \
-c 8192 \
-ngl 99 \
--parallel 4 \
--cont-batching
# OpenAI uyumlu endpoint:
# http://localhost:8080/v1/chat/completions
# Web UI: http://localhost:8080/-m, --model # GGUF dosya yolu
-c, --ctx-size # context length (model destekliyorsa 32K-128K)
-n, --n-predict # cevap için max token (-1 = sınırsız)
-ngl N # GPU'ya offload edilecek katman (-ngl 99 = hepsi)
-t, --threads # CPU thread sayısı
-tb, --threads-batch # batch işlemde thread
--temp 0.3 # temperature
--top-k 40
--top-p 0.9
--repeat-penalty 1.1
--mlock # modeli RAM'de sabitle (swap engelle)
--mmap # memory-mapped load (büyük model için)
--cont-batching # continuous batching (server'da)
--parallel N # eşzamanlı slot
--flash-attn # FlashAttention 2 (CUDA, hızlı)Donanım hızlandırma
llama.cpp en geniş donanım desteğine sahip motor. Metal (Apple), CUDA (NVIDIA), ROCm (AMD), Vulkan (cross-vendor), SYCL (Intel), OpenCL, hatta Raspberry Pi NEON SIMD.
| Apple Silicon (M1/M2/M3/M4) | Metal — varsayılan, unified memory |
| NVIDIA GPU | CUDA + cuBLAS, FlashAttention 2 |
| AMD GPU | ROCm (Linux) veya Vulkan (cross-OS) |
| Intel GPU | SYCL (oneAPI) |
| Vulkan | Donanım bağımsız (Linux/Win) |
| CPU only (AVX2/NEON) | ✓ |
| Embedded (RPi, ARM) | ✓ |
Model formatları & quantization
GGUF formatı (llama.cpp'nin standardı). Hugging Face'de bartowski, TheBloke gibi kullanıcılar her popüler modelin GGUF varyantını yayınlar. Her model için farklı quantization seviyeleri var — ihtiyacına göre seç.
| F16 / BF16 | Kayıpsız, en büyük |
| Q8_0 | Neredeyse FP16 kalitesi |
| Q6_K | Çok iyi kalite, orta boyut |
| Q5_K_M / Q5_K_S | İyi kalite, makul VRAM |
| Q4_K_M ★ | Önerilen — kalite/boyut tatlı noktası |
| Q3_K_M | Küçük, kalite kabul edilebilir |
| Q2_K / IQ2_XS | Çok küçük — sadece deneme |
| IQ4_XS / IQ3_S | Yeni nesil 'i-quants' — düşük bit, daha iyi kalite |
# HF safetensors → GGUF (FP16)
python3 convert_hf_to_gguf.py /path/to/model \
--outfile model-f16.gguf
# Quantize (Q4_K_M)
./build/bin/llama-quantize \
model-f16.gguf model-Q4_K_M.gguf Q4_K_MAPI
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="sk-no-key")
resp = client.chat.completions.create(
model="local",
messages=[{"role": "user", "content": "Hi"}],
)
print(resp.choices[0].message.content)curl http://localhost:8080/completion -d '{
"prompt": "Selam",
"n_predict": 128,
"temperature": 0.3,
"top_k": 40,
"top_p": 0.9
}'Performans
| Tek-stream (M2 Max, Q4_K_M 8B) | ~55 tok/s |
| Tek-stream (RTX 4090, Q4_K_M 8B + FlashAttn) | ~140 tok/s |
| Eşzamanlı slot (--parallel) | var ama vLLM kadar verimli değil |
| RPi 5 (Q4 4B) | ~3 tok/s |
| Soğuk başlangıç | 1-5 sn (mmap + RAM) |
Sık yapılan hatalar
- ngl ayarlamayı unutmakGPU varsa -ngl 99 (tüm katmanları GPU'ya) ekle. Eklemezsen CPU'da çalışır ve neden yavaş olduğunu anlamazsın.
- Bağımsız build flag'leriGGML_METAL, GGML_CUDA, GGML_VULKAN — istediğini build sırasında açmak gerek. Yanlış flag = hızlandırma yok. Hazır binary indirirken doğru varyantı seç.
- Quantization sayısı kafa karıştırıcıQ4_0, Q4_1, Q4_K_S, Q4_K_M, IQ4_XS — hepsi 4-bit ama farklı algoritmalar. Q4_K_M çoğu zaman doğru tercih, IQ4_XS daha yeni ve kaliteli ama bazı CPU'larda yavaş.
- Kendi binary'ni dağıtırken sürümllama.cpp hızla güncellenir, GGUF formatı arada değişebilir. Üretime alacaksan binary + GGUF + commit hash'i sabitle.