Local AI

Özelleştirilmiş Quantization'ı Ustalıkla Kullanma: Alan-Spesifik LLM'ler için llama.cpp ile GGUF Pipeline'ı Oluşturma

Büyük Dil Modelleri (LLM'ler) yazılım geliştirmeyi devrimleştirdi, ancak bunları yerel olarak dağıtmak genellikle bellek kısıtlamaları nedeniyle takılıyor. Llama 3 veya Mistral gibi modeller etkileyici yetenekler sunsa da, standart 16-bit kayan nokta (FP16) temsilleri genellikle tüketici sınıfı donanım için çok ağır kalıyor. İşte burada quantization kritik hale geliyor. Hassasiyeti azaltarak, daha büyük ve daha yetenekli modelleri NVIDIA RTX 3090'lara veya hatta MacBook'lara sığdırabiliriz. Ancak, genel amaçlı quantization genellikle alan-spesifik nüansları feda eder. Bu kılavuzda, llama.cpp kullanarak belirli veri setlerine göre optimize edilmiş GGUF dosyalarına Hugging Face modellerini dönüştürmek için sağlam ve otomatik bir pipeline oluşturacağız.

Neden Genel Amaçlı Quantization Yeterli Değil

Çoğu geliştirici basitçe önceden yapılmış bir dönüştürme betiği çalıştırır ve en iyisinin olmasını umar. Ancak hukuk sözleşmeleri, tıbbi teşhisler veya özel kodlama görevleri gibi niş alanlarda eğitim yapıyor veya ince ayar (fine-tuning) uyguluyorsanız, modelin ince bağlamı koruma yeteneği hayati önem taşır. Q4_K_M gibi standart quantization şemaları, hız ve kalite arasında iyi bir denge sunar, ancak tüm ağırlıklar üzerinde eşit hassasiyet azaltması uygularlar. Alan-spesifik uygulamalar için, genellikle belirli katman türlerinin korunmasını önceliklendirmemiz veya genel amaçlı araçların göz ardı edebileceği özel ölçeklendirme faktörleri uygulamamız gerekir. Özelleştirilmiş bir pipeline oluşturmak, ağırlık dağılımını incelememizi ve hedefe yönelik quantization stratejileri uygulamamızı sağlar.

Dönüşüm Ortamının Kurulumu

Kod yazmadan önce doğru araçlara ihtiyacımız var. Modelleri GGUF formatına dönüştürmenin en verimli yolu, llama.cpp deposu tarafından sağlanan resmi Python dönüştürme betiklerini kullanmaktır. İlk olarak, Python 3.8+ yüklü olduğundan emin olun. Depoyu klonlayın ve gerekli bağımlılıkları yükleyin.

# llama.cpp deposunu klonlayın
git clone https://github.com/ggerganov/llama.cpp.git
cd llama.cpp

# Dönüştürme betiği gereksinimlerini yükleyin
pip install -r requirements.txt

# Kaynak modeli yüklemek için PyTorch ve Transformers yüklü olduğundan emin olun
pip install torch transformers accelerate

Alan-spesifik modelinizi yüklemek için Hugging Face'tan transformers kütüphanesini kullanmanız kritik önem taşır. Eğer bir modeli belirli bir veri setinde ince ayarladıysanız, bu model büyük ihtimalle Hugging Face Hub'da veya yerel dizininizde bulunur.

Dönüştürme Betiği

Pipeline'ımızın çekirdeği convert-hf-to-gguf.py betiğidir. Ancak, bunu "özelleştirilmiş" bir pipeline haline getirmek için, günlük kaydı, hata denetimi ve belirli model yapılandırmalarını yöneten daha sağlam bir Python betiği içine sarmalayacağız. Aşağıda, tıbbi metinlerde ince ayar yapılmış bir Mistral-7B modeli için dönüştürmenin nasıl çağrılacağına dair pratik bir örnek bulunmaktadır.

import subprocess
import os

def convert_to_gguf(model_path, output_path, architecture="mistral", quantization="Q4_K_M"):
    """
    Bir Hugging Face modelini llama.cpp kullanarak GGUF formatına dönüştürür.
    
    Args:
        model_path (str): Hugging Face model dizinine veya HF Hub ID'sine giden yol.
        output_path (str): .gguf dosyası için hedef dosya.
        architecture (str): Mimari tipi (örn. 'llama', 'mistral').
        quantization (str): Quantization şeması (örn. 'Q4_K_M', 'Q5_K_M').
    """
    # Dönüştürme betiğinin yolunu tanımlayın
    script_dir = os.path.dirname(os.path.abspath(__file__))
    convert_script = os.path.join(script_dir, 'gguf-py', 'convert-hf-to-gguf.py')
    
    # Komutu oluşturun
    cmd = [
        "python", 
        convert_script, 
        model_path,
        "--outfile", output_path,
        "--outtype", quantization,  # Not: daha yeni sürümler 'ftype' kullanabilir
        "--architecture", architecture
    ]
    
    print(f"{model_path} için dönüştürme başlatılıyor...")
    try:
        result = subprocess.run(cmd, check=True, capture_output=True, text=True)
        print("Dönüştürme başarılı!")
        print(result.stdout)
    except subprocess.CalledProcessError as e:
        print(f"Dönüştürme başarısız: {e.stderr}")

# Alan-spesifik bir tıbbi model için örnek kullanım
model_id = "domain-ai/medical-mistral-7b-finetuned"
output_file = "./models/medical_mistral_q4_k_m.gguf"

convert_to_gguf(model_id, output_file, architecture="mistral", quantization="Q4_K_M")

Gelişmiş: Dönüşüm Sonrası Optimizasyon

Model dönüştürüldükten sonra, her zaman işe hazır değildir. Alan-spesifik veri setleri için genellikle özel tokenizers entegre etmemiz veya bağlam uzunluğunu ayarlamamız gerekir. Orijinal meta verileri kaybetmeden mevcut bir GGUF dosyasını farklı bir formata yeniden quantize etmek için llama.cpp içindeki quantize yardımcı programını kullanabilirsiniz.

Sonuç

llama.cpp ile özelleştirilmiş bir quantization pipeline'ı oluşturmak sadece disk alanından tasarruf etmekle ilgili değildir; bu, alan-spesifik yapay zekanızın yüksek riskli uygulamalar için gereken nüansları koruduğundan emin olmakla ilgilidir. Dönüştürme sürecini otomatikleştirerek ve llama.cpp'in quantization şemalarının esnekliğinden yararlanarak, geliştiriciler bellek kısıtlamalarına saygı duyan ancak veri setlerinde gömülü olan uzman bilgiden ödün vermeyen güçlü, yerel öncelikli LLM'leri dağıtabilir. Dengeli bir yaklaşım için Q4_K_M ile başlayın, alanınız daha yüksek sadakat gerektiriyorsa Q5 veya Q6'ya geçiş yaparak iterasyon yapın.

Share: