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 (-ngl bayrağı).

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.