27B'lik bir model evde ne kadar hızlı çalışır?

aillmbenchmarkslocal-inferencehomelab
Mert Cobanov 6 dk okuma
Bu sayfada

27B’lik bir model evde ne kadar hızlı çalışır?

Dil modellerini kendi donanımında çalıştırmak sessizce sıradanlaştı. Birkaç yıl önce bu ya bulut GPU kiralamak ya da hayal kırıklığı yaratacak kadar küçük bir modele razı olmak demekti. Bugün 27 milyar parametreli bir model sıkıştırılınca 17 GB’a iniyor ve tek bir tüketici ekran kartına sığıyor.

Qwen kısa süre önce yeni bir model çıkardı, birileri de günler içinde Apple’ın MLX’ine portladı. Evde birbirinden epey farklı dört makinem var, ben de iki gecemi Qwen3.8-27B’yi dördünde koşturmaya ayırdım. Sayılar, arkalarındaki sebepten daha az ilginç çıktı.

TL; DR

Qwen3.8-27B, 4-bit halinde makineye göre saniyede 12 ile 75 token arasında üretiyor ve bu sayıların hepsini bellek bant genişliği neredeyse birebir tahmin ediyor. Bunu bilince herhangi bir benchmark’ı peçete hesabıyla kontrol edebiliyorsun; ben de imkânsız bir ölçümü paylaşmadan önce böyle yakaladım. Modelin kendisi akıl yürütmede şaşırtıcı derecede iyi, çeviride işe yarar, harf saymada ise umutsuz.

Dört makine

  • hope: RTX 5090, NVIDIA’nın güncel amiral gemisi tüketici kartı.
  • white: RTX 3090, 2020’nin amiral gemisi, 24 GB’ı sayesinde hâlâ çok iş görüyor.
  • macmini: M4 Pro, 24 GB unified memory, yani CPU ve GPU aynı havuzu paylaşıyor.
  • spark: NVIDIA DGX Spark, GB10 çipi, 128 GB unified memory.

Dördü de modeli 4-bit quantization ile çalıştırdı: her ağırlık orijinal 16 bit yerine 4 bitle saklanıyor, model dört kat küçülüyor, biraz doğruluk kaybediyor. Yerelde çalıştıran herkes bu takası yapıyor; tam hassasiyet bu makinelerin hiçbirine sığmaz. NVIDIA tarafı ollama ile GGUF dosyası kullandı, Mac ise Apple’ın kendi framework’ü MLX’i.

Ölçüm düzeni: makine başına üç koşu, her birinde 300 token, ortalaması alındı, temperature=0, sayılar ağ gecikmesi karışmasın diye sunucuların kendi sayaçlarından. Bir ayrıntı bir saatimi aldı: modeller ilk uyandıklarında yavaştır. white soğukken 23.8 tok/sn gösterdi, ısınınca 42; aşağıdaki her şey ısınmış modelden.

Burada iki sayı önemli. Üretim, modelin cevabını yazma hızı, metnin ekranda belirmesini izlerken hissettiğin şey. Prompt işleme ise senin girdiğini okuma hızı, ilk kelimeden önceki bekleme.

Sonuçlar

MakineDonanımBellek bant genişliğiÜretimPrompt işleme
hopeRTX 5090, GDDR7~1792 GB/sn75.5 tok/sn
whiteRTX 3090, 24 GB~936 GB/sn42.6 tok/sn274 tok/sn
macminiM4 Pro, 24 GB unified~273 GB/sn15.1 tok/sn50 tok/sn
sparkDGX Spark GB10~273 GB/sn12.6 tok/sn259 tok/sn

Dosya boyutları runtime’a göre değişiyor: ollama’nın GGUF’u 17 GB (hope’ta 17.7), MLX derlemesi 15 GB.

Neden her şeyi bellek bant genişliği açıklıyor

Model tek bir token üretmek için ağırlıklarının her birini bellekten okumak zorunda, sonra bir sonraki token için aynısını baştan yapıyor, cevap bitene kadar. Hangi yemeği yaparsa yapsın önce kilerin tamamını yürüyüp her rafa dokunmak zorunda olan bir aşçı düşün: doğrama hızının önemi yok, önemli olan yürüme hızı.

Bellek bant genişliği, makinenin bellekten saniyede kaç gigabayt çekebildiği. Her token modelin tamamını okumayı gerektirdiği için tavan peçeteye sığıyor:

tavan (token/sn) = bellek bant genişliği ÷ model boyutu
  • M4 Pro: 273 GB/sn ÷ 15 GB ≈ 18 tok/sn tavan, ölçülen 15.1 (tavanın %84’ü)
  • RTX 3090: 936 GB/sn ÷ 17 GB ≈ 55 tok/sn tavan, ölçülen 42.6 (%78)
  • RTX 5090: 1792 GB/sn ÷ 17.7 GB ≈ 101 tok/sn tavan, ölçülen 75.5 (%75)

Her makine kendi tavanının %75 ile %84’ü arasına oturuyor. Bunlar farklı üreticiler, mimariler, bellek teknolojileri ve framework’ler; bunlardan biri çok önemli olsaydı yüzdeler dağınık çıkardı. Dördü de fiziğin izin verdiği hıza yakın koşuyor. Eksik %15-25 çoğunlukla dequantization: hesap birimleri 4-bit sayıları doğrudan çarpamıyor, her ağırlık içeri girerken daha büyük bir formata açılıyor.

İki iş, iki ayrı darboğaz

Tablonun son iki satırında tuhaf bir şey var: Spark token üretiminde Mac mini’den yavaş (12.6’ya karşı 15.1) ama prompt işlemede beş kat hızlı (259’a karşı 50). İki iş makinenin farklı parçalarına yükleniyor. Üretimi bellek bant genişliği sınırlıyor, GB10’un belleği de M4 Pro’nunkiyle kabaca aynı hızda, o yüzden ikisi aynı yere düşüyor (Spark’ın biraz geride kalmasının sebebi GGUF dosyasının düpedüz büyük olması). Prompt işlemeyi ise hesap gücü sınırlıyor, çünkü girdinin tamamı tek seferde geçiyor, ve Spark’ın Blackwell tensor çekirdekleri tam bunun için tasarlanmış.

Yani Spark kötü bir makine değil, tek kullanıcılı hız onu yargılamak için yanlış eksen: gerçek avantajları 128 GB bellek ve aynı anda çok istek geldiğindeki toplam verim.

Gerçek olamayacak ölçüm

5090’ı kurarken ısınma turu olarak qwen3.6:35b çalıştırdım ve 169 tok/sn aldım. Peçete hesabını yapana kadar gerçekten sevinmiştim: o model 23 GB, tavanı 75 tok/sn civarı olmalı, bense fiziksel maksimumun iki katından fazlasını ölçmüşüm. Paylaşmak yerine metadata’ya baktım:

expert_count: 256
expert_used_count: 8

Açıklaması bu. qwen3.6:35b bir mixture-of-experts (MoE) modeli: tek büyük ağ yerine expert denen 256 küçük alt ağı var, bir router her token için bunlardan 8’ini seçiyor, kalanı boşta duruyor. Danışmanın seni ihtiyacın olan 3 uzmana yönlendirdiği bir hastane gibi, 256 doktorun birden muayene etmesi yerine.

Yani diskte 35 milyar parametresi var ama token başına küçük bir kısmını okuyor. Formül hâlâ geçerli, ben model boyutuna yanlış sayıyı koymuşum. Qwen3.8-27B ise dense, her ağırlık her seferinde okunuyor, dolayısıyla ikisini yan yana koymak anlamsız olurdu. Doğru modelle 5090 75.5 tok/sn verdi, tavanının %75’inde, diğerleriyle aynı bantta.

Peki iyi mi?

Yayınlanmış benchmark’lar burada pek işe yaramıyor: problem internetteyse model cevabını büyük ihtimalle ezberlemiş. Ben de tek kurallı 24 soru yazdım: meşhur bir problemi al, doğru cevabı değişecek şekilde değiştir. Orijinali ezberleyen model eski cevabı verir; akıl yürüten değişikliği fark etmek zorunda.

24’te 23 yaptı. En sevdiğim, sezgiye aykırı 13/27 cevabıyla bilinen “salı günü doğan oğlan” olasılık problemiydi. “Salı günü doğmuş”u “hafta sonu doğmuş” ile değiştirdim, bu cevabı 6/13’e çeviriyor, ve model 196 sonuçlu örneklem uzayını sıfırdan kurup doğru buldu. Ayrıca ince bir hatası olan bir binary search verip onu asacak bir girdi istedim; önerisi find([1], 2) benim hazırladığımdan daha minimaldi, ve çalıştırınca gerçekten asılıyor.

Dürüst olmak gerekirse kendi yazdığım 24 soru bir değerlendirme sayılmaz: soruları ben seçtim, yani zorluğu da ben seçtim. Asıl ilginç olan tek başarısızlık.

Kelimelerinin harf sayısı sırayla 1, 2, 3, 4, 5, 6 olan bir cümle istedim. 479 saniye düşündü ve boş döndü. Sayması gayet iyi, sorun yapısal: dil modelleri harf görmez, token görür, yani çoğu zaman tam bir kelimeye denk gelen parçalar. “person” içindeki altı harfi dışarıdan görünmeyen, bölünmez tek bir sembol olarak geliyor. Hiçbir modele anagram ya da akrostiş işi verme.

Başta yanlış saydığım bir soru ise benim hatam çıktı. Model {"city": "İstanbul"} cevabını vermişti, kontrolüm "istanbul" in c.lower() yapıyordu ve tutmuyordu: Python’da "İstanbul".lower() bir i artı ayrı bir birleşen nokta üretiyor, ekranda aynı, bayt olarak farklı. Yıllardır Türkçe yazılım yazıyorum, yine de yakalandım. Modelleri İngilizce dışı metinle değerlendirmeden önce string’lerini normalize et.

Ne işe yarar

Dataset çevirmek. Otomatikleştirmesi en zor üç şeyde iyi durdu: deyimler kelime kelime değil deyim olarak geldi, uzun belge boyunca terimler tutarlı kaldı, ve çıktıya “İşte çeviri:” gibi bir giriş cümlesi sızmadan biçim korundu. Uzun serbest metinde yine de geri-çeviri kontrolü koyardım.

Tek kartta uzun bağlam. 64 katmanın 48’i linear attention kullanıyor, sadece 16’sı klasik tam attention. Standart attention’da her token diğer hepsine bakabilir, ama bellek maliyeti bağlam uzunluğunun karesiyle büyür; linear attention bunun yerine boyutu sabit bir çalışan özet tutar. Bu hibrit, modelin konuşma belleği olan KV cache’i token başına yaklaşık 64 KB’a indiriyor, 128k bağlamı tek kartta mümkün kılan da bu. Bu takasın bir yerde kalite bedeli olmalı; uzun bağlamı test etmedim, o yüzden nerede olduğunu biliyormuş gibi yapmayacağım.

Birkaç kişi NVFP4’ü sordu: Blackwell tensor çekirdeklerinin doğrudan işlediği, dequantization’ı atlayan 4-bit float formatı. Test edemedim (vLLM gerekiyor, vLLM’i ARM64 Blackwell’de çalıştırmak başlı başına proje), ama 5090 zaten tavanının %75’indeydi, yani en iyi ihtimal 90 tok/sn civarı. Ortalıkta dolaşan etkileyici sayılar muhtemelen batch serving’den geliyor.

Özet

Evdeki üretim hızı bellek bant genişliği bölü model boyutuna iniyor: dört makine de üretici ve yazılım fark etmeksizin bu tavanın %75-84’üne oturdu. Aynı formül kontrol mekanizması olarak da çalışıyor, mixture-of-experts sayısını böyle yakaladı. Kalite tarafında, değiştirilmiş 24 problemde 23 doğru; tek başarısızlık akıl yürütmeden değil tokenization’dan.

Evinde 24 GB’lık bir kart varsa bu model ona sığıyor ve sohbet hızında çalışıyor. İşlerin geldiği noktadan gayet memnunum.

Kaynaklar