AI

CPU-Only Kenar Cihazları için LLM'leri Optimize Etme: Nicelleştirme ve Bilgi Distilasyonu Rehberi

Büyük Dil Modelleri'ni (LLM) kenar cihazlarda dağıtmak, benzersiz bir mühendislik zorlukları seti sunar. GPU'lar devasa paralel işlem gücü sunsa da, genellikle IoT ağ geçitleri, mobil telefonlar ve gömülü sistemlerde fazla güç tüketen, pahalı veya fiziksel olarak bulunmayan cihazlardır. Akıllı ajanları yalnızca CPU mimarilerinde çalıştırmayı hedefleyen geliştiriciler için, standart 32-bit veya 16-bit kayan nokta modellerinin ham performansı yetersizdir.

Çözüm, bellek ayak izini ve hesaplama yükünü azaltmak için model nicelleştirme ve daha küçük, daha verimli mimarilere akıl yürütme yeteneklerini sıkıştırmak için bilgi distilasyonu içeren çift bir yaklaşımda yatar. Bu yazı, kaynak kısıtlamalı donanımlarda düşük gecikmeli çıkarım elde etmek için bu tekniklerin nasıl birleştirileceğini incelemektedir.

CPU'da Nicelleştirme İçin Gerekçe

Nicelleştirme, sayıları daha düşük hassasiyetle temsil etmeyi içerir. Modern LLM'ler genellikle FP32 (32-bit kayan nokta) veya FP16 (16-bit kayan nokta) kullanırken, INT8 (8-bit tamsayı) veya hatta INT4'e nicelleştirme, model boyutunu sırasıyla 4x veya 8x azaltabilir. Tamsayı aritmetik işlemlerde mükemmel olan CPU'larda bu, yalnızca bir bellek tasarrufu değil, aynı zamanda bir performans çarpanıdır.

ONNX Runtime ve llama.cpp gibi modern çıkarım motorları, INT8/INT4 çıkarımı için optimize edilmiş çekirdekler sunmaktadır. Veri türünü azaltarak, CPU önbelleği ile çekirdekler arasındaki bant genişliği kullanımını minimize eder ve watt başına önemli ölçüde daha yüksek veri akışına olanak tanır.

Bilgi Distilasyonu: Devlerden Öğrenmek

Orijinal model çok büyük veya yavaşsa, nicelleştirme tek başına yeterli olmayabilir. Bilgi distilasyonu, daha küçük bir "öğrenci" modelinin, daha büyük bir "öğretmen" modelinin davranışını taklit etmesini sağlayarak eğitilmesine olanak tanır. Öğrenci, yalnızca zor etiketlerden (doğru cevap) değil, öğretmenin softmax olasılıklarında bulunan "karanlık bilgiden" de öğrenir.

Bu, kenar dağıtımı için hayati önem taşır çünkü distile edilmiş bir model, genellikle 7B parametreli bir modelle eşitlik sağlayabilirken, 700M parametreli bir model için uygun bir donanım bütçesinde çalışabilir. Nicelleştirme ile birleştirildiğinde, sonuç, sınırlı RAM'e kolayca sığan son derece verimli bir modeldir.

PipiLine'ın Uygulanması

Hugging Face `transformers` kütüphanesini kullanarak pratik bir iş akışına bakalım. Basit bir distilasyon kurulumunu ve nicelleştirme uygulamasına ilişkin bir notu göstereceğiz.

Adım 1: Distilasyon Döngüsünün Kurulması


from transformers import AutoTokenizer, AutoModelForCausalLM, Trainer, TrainingArguments
import torch

# Büyük bir öğretmen modeli yükle
teacher_model = AutoModelForCausalLM.from_pretrained("facebook/opt-1.3b")
teacher_model.eval()

# Daha küçük bir öğrenci modeli yükle
student_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m")

# Basit bir distilasyon kaybı fonksiyonu tanımla
def distillation_loss(student_logits, teacher_logits, temperature=2.0):
    teacher_probs = torch.softmax(teacher_logits / temperature, dim=-1)
    student_probs = torch.log_softmax(student_logits / temperature, dim=-1)
    return torch.nn.functional.kl_div(student_probs, teacher_probs, reduction='batchmean') * (temperature ** 2)

# Eğitim sırasında öğreticiyi dondurun ve öğrenciyi güncelleyin
# Not: Pratikte kolaylık için HuggingFace'in 'distillation' modülünü kullanın

Adım 2: Eğitim Sonrası Nicelleştirme

Distilasyondan sonra, modeli ONNX formatına aktarın ve dinamik veya statik nicelleştirme uygulayın. ONNX Runtime, CPU'lar için dinamik nicelleştirme konusunda etkilidir; bu, yeniden eğitim yapmadan ağırlık matrislerini çalışma zamanında INT8'e nicelleştirir.


import onnxruntime as ort
from onnxruntime.quantization import quantize_dynamic, QuantType

# Distile edilmiş ONNX modelini nicelleştir
quantize_dynamic(
    "model.onnx", 
    "model_quantized.onnx", 
    weight_type=QuantType.QUInt8
)

# Yükle ve çıkarım yap
session = ort.InferenceSession("model_quantized.onnx")

Sonuç

LLM'leri yalnızca CPU'lu kenar cihazlarda dağıtmak artık fütüristik bir kavram değil; ölçeklenebilir, özel ve düşük gecikmeli AI için günümüzün gerekliliğidir. Hesaplama verimliliğini optimize etmek için nicelleştirmeden ve model kapasitesini sıkıştırmak için bilgi distilasyonundan yararlanarak geliştiriciler, güçlü bulut tabanlı modeller ile kenar donanımının kısıtlamaları arasındaki boşluğu kapatabilir. Donanım hızlandırıcılar ve yazılım kütüphaneleri gelişmeye devam ettikçe, "kenar" ve "bulut" yetenekleri arasındaki sınır giderek daha da bulanıklaşacak ve bu optimizasyon teknikleri modern AI mühendisi için temel beceriler olmaya devam edecektir.

Share: