Hugging Face'te Sekiz Model Yayınladık: MLX ve Ölçülmüş Sonuçlar
Done Dynamics, Qwen3.8-27B tabanlı sekiz MLX model sürümünü Hugging Face'te yayımladı: dördü metin, dördü görüntü okuyan; 4-bit, 6-bit, 8-bit ve bf16. Boyut, saniyedeki token üretimi ve tepe bellek kullanımı M3 Ultra üzerinde ölçüldü.

Mayısta 1.000.000 TL’lik Mac Studio yatırımını duyurmuştuk: 512 GB unified memory’li bir M3 Ultra ve 36 GB’lık bir M4 Max. O yazının sonunda bir cümle vardı — verilerimizi dışarı çıkarmadan çalıştırabileceğimiz modelleri kendimiz hazırlayacağız. Bu yazı o cümlenin karşılığı.
Hugging Face profilimizde sekiz model sürümü yayında. Dördü yalnız metin okuyor, dördü görüntü de okuyor. Her ailede dört ayrı hassasiyet var: 4-bit, 6-bit, 8-bit ve bf16. Hepsi aynı kaynak revizyonundan dönüştürüldü, hepsi aynı makinede aynı istemle ölçüldü. Rakamlar model kartlarında yazılı; aşağıda hem rakamlar hem de onları üretirken öğrendiklerimiz var.
Neden dönüştürmek gerekiyor?
Apple Silicon’da bir dil modeli çalıştırmanın iki yolu var. Birincisi PyTorch’u Metal arka ucuyla kullanmak; çalışır ama unified memory mimarisinin sunduğu avantajın büyük kısmını masada bırakır. İkincisi MLX — Apple’ın kendi dizi çerçevesi. MLX, CPU ile GPU arasında tensör kopyalamaz, çünkü Apple Silicon’da ikisi zaten aynı belleğe bakıyor. 512 GB’lık bir makinede bu, “modelin GPU belleğine sığması” diye bir sorunun ortadan kalkması demek.
Karşılığında MLX kendi ağırlık biçimini istiyor. Hugging Face’teki bir depo genellikle PyTorch için hazırlanmış safetensors dosyaları taşır; MLX bunları okuyabilmek için yeniden düzenlenmiş bir yapı bekler. Dönüşüm işte bu: ağırlıkları okuyup MLX’in beklediği düzende, istenen hassasiyette yeniden yazmak.
Bu dönüşümü her seferinde kendi makinemizde yapmak yerine bir kez yapıp yayımlamak daha mantıklıydı. Aynı işi yapan başka biri için de öyle.
Sekiz sürüm, iki aile
Kaynak model çok kipli: hem metin hem görüntü okuyor. Ama dönüşüm araçları bu konuda ikiye ayrılıyor ve bu ayrım sessizce sonuç değiştiriyor.
mlx-lm yalnızca dil kulesini dönüştürür. Görüntü kulesine ait tek bir tensör bile çıktıya girmez, üretilen yapılandırma dosyasında vision_config bulunmaz. Sonuç çalışır, hızlıdır, biraz da küçüktür — ama görüntü göndermeye kalkarsanız hiçbir şey olmaz. Hata bile vermez; model o girdiyi görmez.
mlx-vlm ise görüntü kulesini korur. Toplam 2180 tensörün 333’ü görüntü kulesine ait ve bunlar çıktıya dahil edilir.
Aynı kaynaktan iki farklı şey çıktığı için ikisini de yayımladık.
Metin sürümleri — Qwen3.8-27B-heretic-MLX-*
| Sürüm | Boyut | Ağırlık başına bit | Üretim | Tepe bellek |
|---|---|---|---|---|
| 4-bit | 15,1 GB | 4,501 | 37,9 token/sn | 15,5 GB |
| 6-bit | 21,9 GB | 6,501 | 27,9 token/sn | 22,2 GB |
| 8-bit | 28,6 GB | 8,501 | 22,2 token/sn | 28,9 GB |
| bf16 | 50,0 GB | 16 | 12,7 token/sn | 54,1 GB |
Görüntü sürümleri — Qwen3.8-27B-heretic-VL-MLX-*
| Sürüm | Boyut | Ağırlık başına bit | Üretim | Tepe bellek |
|---|---|---|---|---|
| 4-bit | 15,0 GB | 4,695 | 38,9 token/sn | 19,2 GB |
| 6-bit | 21,3 GB | 6,661 | 29,2 token/sn | 27,0 GB |
| 8-bit | 27,5 GB | 8,627 | 23,1 token/sn | 34,7 GB |
| bf16 | 51,0 GB | 16 | 13,2 token/sn | 55,8 GB |
Ölçüm koşulları: Mac Studio M3 Ultra, 512 GB unified memory, macOS 26.5.2. Metin tarafında mlx-lm 0.31.3, 68 token’lık istem, 120 token üretim. Görüntü tarafında mlx-vlm 0.6.13, görüntü ve metin içeren 470 token’lık istem. Tek çalıştırma, tek makine, tek istem — bu bir kıyaslama testi değil, büyüklük mertebesi rehberi.
Rakamlardan çıkan üç sonuç
Birincisi: 4-bit ile bf16 arasında üç kat hız farkı var. 37,9’a karşı 12,7 token/saniye. Aynı model, aynı makine. Nicemleme burada bir sıkıştırma numarası değil, doğrudan gecikme bütçesi.
İkincisi: bellek tasarrufu hızdan daha çarpıcı. bf16 sürümü 54 GB tepe bellek istiyor; 4-bit 15,5 GB ile yetiniyor. 36 GB’lık M4 Max’imizde bf16 sürümü hiç çalışmaz, 8-bit’e kadar olan her şey rahatça çalışır. Yani nicemleme bir “biraz daha hızlı” ayarı değil, bazı makinelerde çalışıp çalışmama sorusu.
Üçüncüsü: görüntü kulesi hızı değil belleği vuruyor. Görüntü sürümlerinin üretim hızı metin sürümleriyle neredeyse aynı — hatta 4-bit’te bir tık daha yüksek. Ama tepe bellek her sürümde 4-6 GB daha fazla. Görüntü kulesinin kendisi ve görüntü parçalarının ara aktivasyonları oraya yerleşiyor. İstem işleme tarafında dört sürüm de 303-331 token/saniye aralığında kaldı: sürümler arasındaki fark üretimde ortaya çıkıyor, ön işlemede değil.
Token bütçesi: düşünme kipi sessizce yiyor
Bu ailenin sohbet şablonu enable_thinking ve reasoning_effort parametrelerini destekliyor ve düşünme varsayılan olarak açık. Model cevaba başlamadan önce bir muhakeme bloğu üretiyor, o blok da token bütçenizden yiyor.
Pratikte şu oluyor: max_tokens değerini 128 gibi küçük bir sayıda bırakırsanız, bütçenin tamamı muhakemeye gidebilir ve elinize hiç cevap geçmez. Sorunun cevabını almak yerine modelin düşünme sesini alırsınız.
İki yol var. Cevabın kısa olması gerekiyorsa düşünmeyi kapatın:
prompt = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, enable_thinking=False
)
Muhakemeye ihtiyacınız varsa bütçeyi ona göre açın — 512 ve üstü. Ara bir yol olarak reasoning_effort ile derinliği ayarlayabilirsiniz.
Bu, ölçüm yaparken de önemli. Saniyede kaç token ürettiği rakamı düşünme açıkken de kapalıyken de aynıdır, ama cevabın kaç saniyede geldiği ikiye katlanabilir. Bir uygulamanın gecikme bütçesini hesaplarken bakılacak sayı ikincisi.
Kullanımı
Metin sürümü için mlx-lm yeterli:
pip install mlx-lm
mlx_lm.generate --model donedynamics/Qwen3.8-27B-heretic-MLX-4bit \
--prompt "Kendini kısaca tanıt." --max-tokens 256
from mlx_lm import load, generate
model, tokenizer = load("donedynamics/Qwen3.8-27B-heretic-MLX-4bit")
messages = [{"role": "user", "content": "Kendini kısaca tanıt."}]
prompt = tokenizer.apply_chat_template(messages, add_generation_prompt=True)
print(generate(model, tokenizer, prompt=prompt, max_tokens=256))
Görüntü sürümü için mlx-vlm gerekiyor — mlx-lm ile yüklerseniz görüntü kulesi sessizce devre dışı kalır:
pip install mlx-vlm
mlx_vlm.generate --model donedynamics/Qwen3.8-27B-heretic-VL-MLX-4bit \
--image fotograf.png --prompt "Bu görüntüde ne var?" --max-tokens 256
from mlx_vlm import load, generate
from mlx_vlm.prompt_utils import apply_chat_template
model, processor = load("donedynamics/Qwen3.8-27B-heretic-VL-MLX-4bit")
prompt = apply_chat_template(processor, model.config, "Bu görüntüde ne var?", num_images=1)
print(generate(model, processor, prompt, ["fotograf.png"], max_tokens=256))
Görüntü tarafını varsaymadık, test ettik
Görüntü kulesinin korunduğu cümlesi yapılandırma dosyasına bakarak da yazılabilirdi. Yazmadık. Üretilmiş bir test görüntüsü hazırladık: solda kırmızı kare, ortada mavi daire, sağda yeşil üçgen, üstünde MAC512 VISION TEST yazısı ve 7391-ZQ kodu.
Dört görüntü sürümüne de aynı görüntüyü verdik. Dördü de üç şekli doğru renk ve doğru konumla adlandırdı, iki metni de birebir okudu. 4-bit dahil.
Bu, nicemlemenin görüntü tarafını bozmadığını gösteren küçük ama gerçek bir kanıt. Küçük diyoruz çünkü tek bir sentetik görüntü, gerçek bir belge ya da fatura setinin yerini tutmaz — kendi verinizle kendiniz denemeden üretime almayın.
Dönüşüm süreci ve doğrulama
Dönüşüm komutları tek satır:
mlx_lm.convert --hf-path trohrbaugh/Qwen3.8-27B-heretic-ara -q --q-bits 4 \
--mlx-path Qwen3.8-27B-heretic-MLX-4bit
mlx_vlm.convert --hf-path trohrbaugh/Qwen3.8-27B-heretic-ara -q --q-bits 4 \
--mlx-path Qwen3.8-27B-heretic-VL-MLX-4bit
Ama komutu çalıştırmadan önce kaynağı doğruladık: 7 parça dosya, 1199 tensör, tüm safetensors başlıkları ayrıştırıldı, eksik dosya yok. Sekiz sürümün tamamı aynı revizyondan (a67ae100…) dönüştürüldü — böylece aralarındaki fark yalnızca hassasiyet, kaynak farkı değil.
Nicemleme afin, grup boyutu 64. Tablodaki ağırlık başına bit değerlerinin tam sayı olmamasının sebebi bu: 4-bit sürümde gerçek maliyet 4,501 bit, çünkü grup başına ölçek ve sıfır noktası da saklanıyor.
Modelin köken zinciri ve bir uyarı
Zincir şöyle: Qwen/Qwen3.8-27B → trohrbaugh/Qwen3.8-27B-heretic-ara → bizim MLX sürümlerimiz.
Ortadaki halka önemli: kaynak model abliterated (“heretic”) bir türev. Reddetme davranışı cerrahi biçimde çıkarılmış, yani güvenlik ayarlı bir modelin reddedeceği istemlere de cevap veriyor. Bizim depolarımız yalnızca biçim ve hassasiyet değiştiriyor — hizalama eklemiyor, kaldırmıyor da.
Bunu pazarlama cümlesi olarak değil uyarı olarak yazıyoruz: kullanıcı önüne koymadan önce kendi değerlendirmenizi yapın ve kullanım senaryonuzun gerektirdiği filtrelemeyi kendiniz uygulayın. Kurumsal bir asistanda, müşteriye açık bir sohbet arayüzünde ya da çocuklara yönelik bir üründe bu modelleri filtresiz çalıştırmak doğru bir tercih değildir. Dahili bir analiz aracında, belge okuma hattında ya da geliştirici aracında ise davranış öngörülebilir ve kontrollü olur.
Lisans zincir boyunca Apache-2.0. Model için kredi Alibaba Group Tongyi Lab’deki Qwen ekibine, abliterasyon için trohrbaugh’a ait. Bizim katkımız yalnızca MLX dönüşümü ve ölçümü.
Bu iş neden bizim işimize yarıyor?
Sorunun ticari karşılığı şu: müşteri verisini bir yapay zeka sağlayıcısına göndermeden çalışan bir hat kurabiliyor muyuz?
Sekiz sürüm bu sorunun cevabının parçaları. 512 GB’lık makinede bf16 sürümünü çalıştırıp kalite tavanını görüyoruz; 4-bit sürümü aynı makinede üç kat hızlı çalıştığı için gerçek zamanlı işlerde onu kullanıyoruz; 36 GB’lık M4 Max’e yalnızca nicemlenmiş sürümler sığdığı için hafif işleri oraya alıyoruz. Görüntü sürümleri sayesinde belge, fatura ve ekran görüntüsü okuyan hatlar aynı altyapıda kalıyor — görüntü işleme sistemleri geliştirme tarafındaki işlerimizin çoğu bu sürümlerin üzerinde duruyor.
Bunu bir müşteri projesine dönüştürdüğümüzde adı kurumlara özel yapay zeka geliştirme oluyor: modelin seçimi, nicemleme kararı, gecikme bütçesi ve verinin nerede durduğu aynı masada konuşuluyor. Yayımladığımız sekiz sürüm de o masaya getirdiğimiz ölçülmüş veri.
Kendi kurulumunuzda denemek isterseniz depolar açık, model kartlarında ölçüm koşulları yazılı, lisans izin veriyor. Bize yazın — hangi sürümün hangi işe uygun olduğunu konuşmak bizim de işimize yarıyor.