llama.cpp ile C/C++ Tabanlı Düşük Kaynaklı LLM Çıkarımı ve GGUF Formatı
Yerel yapay zeka devriminin arkasındaki en önemli açık kaynak projelerden biri şüphesiz Georgi Gerganov tarafından başlatılan llama.cpp projesidir. Python bağımlılıkları (PyTorch, Transformers, HuggingFace ekosistemi) olmadan, tamamen saf C ve C++ ile yazılan bu kütüphane; büyük dil modellerini minimum kaynakla çalıştırma standardını belirledi.
Bu rehberde; llama.cpp projesinin mimarisini, GGUF formatını, kaynak koddan derleme adımlarını ve yerleşik HTTP sunucusu (llama-server) üzerinden model çalıştırma yöntemlerini ele alıyorum.
1. Neden llama.cpp?
Standart bir Python LLM yığını (stack) şu katmanlardan oluşur:
- Python Runtime -> PyTorch -> CUDA/C++ Kernels -> Donanım
llama.cpp ise bu ara katmanları tamamen ortadan kaldırır:
- Saf C/C++ Çekirdeği: Sıfır Python bağımlılığı.
- Apple Silicon & AVX/AVX2/AVX-512 Desteği: İşlemcinin SIMD vektör yönergelerini doğrudan kullanarak CPU üzerinde şaşırtıcı bir çıkarım hızı sağlar.
- Hibrit Çalışma (CPU + GPU Offloading): Model katmanlarının bir kısmını VRAM’e, sığmayan kısmını sistem RAM’ine atayarak çalışmaya devam edebilir (
-nglbayrağı).
2. GGUF Formatı ve Kuantizasyon Seviyeleri
Eski GGML formatının yerini alan GGUF (GPT-Generated Unified Format); model ağırlıklarını, tokenizer kurallarını ve üst verileri (metadata) tek bir ikili dosyada barındırır.
Model indirirken dosya adının sonunda gördüğünüz etiketlerin anlamı:
- Q4KM (4-bit Medium): En dengeli ve popüler kuantizasyon seçeneğidir. Model boyutunu ve bellek tüketimini ~%70 oranında azaltırken mantıksal doğruluk kaybı neredeyse fark edilmez düzeydedir.
- Q5KM (5-bit Medium): Kodlama veya karmaşık matematiksel akıl yürütme yapılacaksa 4-bit’e göre biraz daha yüksek doğruluk sağlar.
- Q8_0 (8-bit): Orijinal 16-bit model kalitesine son derece yakındır ancak dosya boyutu büyüktür.
- Q2K / Q3K: Fazla sıkıştırma nedeniyle modelde anlamsal bozulmalar ve saçmalama (hallucination) riski artar; mecbur kalınmadıkça önerilmez.
3. Linux Üzerinde Kaynak Koddan Derleme
llama.cpp projesini kendi donanımınıza göre optimize ederek derlemek en yüksek performansı elde etmenin anahtarıdır.
Depoyu Klonlama
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
A. Sadece CPU İçin Derleme (AVX2 Destekli)
Modern işlemcilerde CMake varsayılan olarak AVX2 yönergelerini otomatik algılar:
cmake -B build
cmake --build build --config Release -j$(nproc)
B. NVIDIA GPU (CUDA) Destekli Derleme
Model katmanlarını ekran kartına yüklemek için GGML_CUDA bayrağını açarak derliyoruz:
cmake -B build -DGGML_CUDA=ON
cmake --build build --config Release -j$(nproc)
Derleme tamamlandığında build/bin/ altında iki temel çalıştırılabilir dosya elde edersiniz:
llama-cli: Terminal üzerinden tekil komutlarla çıkarım yapmak için.llama-server: Modeli arka planda OpenAI uyumlu REST API olarak sunmak için.
4. Model İndirme ve İlk Çıkarım (Inference)
Hugging Face üzerindeki popüler repolardan (örneğin Bartowski veya TheBloke) bir GGUF modelini doğrudan indirebilirsiniz:
# Örnek: Llama-3.2-3B-Instruct GGUF modelini indirme
mkdir -p models
wget -c https://huggingface.co/bartowski/Llama-3.2-3B-Instruct-GGUF/resolve/main/Llama-3.2-3B-Instruct-Q4_K_M.gguf -O models/llama-3.2-3b-q4.gguf
Terminalden Çalıştırma (llama-cli)
./build/bin/llama-cli \
-m models/llama-3.2-3b-q4.gguf \
-p "C++ dilinde RAII prensibinin önemini iki maddede açıkla:" \
-n 256 \
-t 8 \
-ngl 99 \
--color
-m: Model dosyasının yolu.-p: Modela gönderilen istem (prompt).-n: Üretilecek maksimum token sayısı.-t 8: Kullanılacak CPU çekirdek (thread) sayısı.-ngl 99: GPU’ya devredilecek katman sayısı (99 = tüm katmanlar ekran kartına yüklensin).
5. Yerleşik Hafif Sunucu: llama-server
Modeli tek seferlik çalıştırmak yerine bir servis haline getirmek istiyorsanız llama-server mükemmel bir araçtır:
./build/bin/llama-server \
-m models/llama-3.2-3b-q4.gguf \
--host 0.0.0.0 \
--port 8080 \
-c 4096 \
-ngl 99
Bu komut ile http://localhost:8080 adresinde çalışan bir web arayüzü ve OpenAI uyumlu bir endpoint açılır:
# cURL ile test isteği atma
curl http://localhost:8080/v1/chat/completions \
-H "Content-Type: application/json" \
-d '{
"messages": [
{"role": "user", "content": "Merhaba, nasılsın?"}
]
}'
6. Sonuç
llama.cpp, C++ mühendisliğinin gücünü gösteren; bağımlılık yükü olmadan donanımın sınırlarını zorlayan bir başyapıttır. Ancak model indirmeyi, güncellemeyi ve sistem servisi olarak yönetmeyi daha pratik kılmak istediğimizde devreye bir sonraki bölümde inceleyeceğimiz Ollama girmektedir.