· kaynak dev.to (home feed)
Üç düzeltmeden sonra Qwen3.5 ve Qwen3.6 MTP head, Apple Silicon'da 1.4 kata ulaştı
Qwen3.5 ve Qwen3.6, speculative decoding için çok token tahmin (MTP) head'iyle geliyor. OptiQ'nun yazısı, yinelenen ağırlıkların, hatalı bir doğrulamanın ve kesme (truncation) uyuşmazlıklarının bunun Apple Silicon'da çalışmasını nasıl engellediğini gösteriyor.

Modelle birlikte gelen bir tahmin head'i
dev.to'da yayımlanan OptiQ ekibi yazısına göre, Qwen3.5 ve Qwen3.6'nın her ikisi de model paketinin içinde kompakt bir çok token tahmin (MTP) head'i içeriyor; 9B varyantında yaklaşık 185 MB. Amacı speculative decoding: head hızlıca K adet aday token taslağı çıkarır ve ana model hepsini tek bir paralel forward pass'te kontrol eder. Taslaklar, ana modelin zaten üreteceği tokenlarla uyuştuğunda, bu tokenlar neredeyse hiç ek maliyete yol açmaz. OptiQ ekibi bunu mlx-lm tabanlı serving yoluna bağlamanın bir öğleden sonra süreceğini düşünüyordu. Üç ayrı düzeltme gerektirdi.
Birleşik bellekte yinelenen ağırlıklar
OptiQ'nun entegrasyonu, MTP etkin üretimin kendi motorundan geçmesi için mlx-lm'deki stream_generate fonksiyonunu yamaladı. İlk istekte bu motor, mlx-lm sunucusu modeli zaten yüklemiş olmasına rağmen modeli yeniden yükledi ve Apple'ın birleşik belleğinde iki tam set base ağırlığı kalıcı hale getirdi. Qwen3.5-9B için tepe bellek, MTP olmadan 6.5 GB'dan MTP ile 16.7 GB'a fırladı ve 27B model, 24 GB'lık bir Mac'te MTP ile hiç çalışamadı.
Çözüm, MTP desteğini zaten yüklenmiş modele yerinde ekleyen OptiqEngine.from_loaded adlı bir classmethod oldu. Bunun ardından 9B tepe bellek 6.7 GB'a düştü ve 27B, 17.6 GB ile sığdı; daha büyük modeli benchmark yapmak da böylece mümkün oldu.
Örnekleme altında doğrulama yanlıştı
Taslak token'ı ana modelin argmax değeriyle karşılaştıran greedy doğrulama çalışıyordu. Ancak sıcaklık (temperature) söz konusu olduğunda kod, biri ana modelden biri taslaktan gelen iki bağımsız örnek karşılaştırıyordu ve farklı dağılımlardan çekilen iki bağımsız örnek neredeyse hiçbir zaman tam olarak eşleşmez. Qwen'ın önerdiği sampler ile (temperature 1.0, top_p 0.95, top_k 20) 4B modelde ölçülen kabul oranı, greedy'deki yüzde 67'e karşılık yüzde 28'di.
Doğru yaklaşım, yazıda Leviathan et al. ve Chen et al.'ye atfedilen rejection sampling: bir taslak token'ı min(1, p_main(dt) / q_draft(dt)) olasılığıyla kabul et ve reddedilirse, iki dağılımın kırpılıp yeniden ölçeklendirilmiş farkından bir yenisini çek. Bu değişiklik 4B kabul oranını yüzde 28'den yüzde 57'ye çıkardı ve throughput'u 0.87x'lik bir gerilemeden 1.11x'e taşıdı.
Kesme her iki tarafta eşleşmek zorunda
OptiQ, unsloth'un bu model sınıfı için yayımladığı yaklaşık yüzde 83'lük kabul oranının hâlâ gerisindeydi. Kalan boşluğun nedeni, taslak yolunun top_p ve top_k uygulaması, doğrulamanın ise kesilmemiş softmax kullanmasıydı. Her iki dağılımı aynı deste, yani en iyi 20 token ve kümülatif kütlenin en iyi 0.95'ine kısıtlamak aralarındaki örtüşmeyi artırır ve rejection-sampling kabul oranının ölçtüğü şey de tam olarak bu örtüşmedir. 9B modelde kabul oranı yüzde 32'den yüzde 63'e, throughput ise 1.00x'ten 1.28x'e çıktı. OptiQ ayrıca Qwen'ın generation_config.json dosyasındaki ayarları serve ve lab komutlarında varsayılan sampler yaptı; böylece yalnızca bir temperature bayrağı ayarlayan kullanıcılar aynı yayvan dağılım sorununa düşmeyecek.
Metal'de K=1 neden kazanır
vLLM, HuggingFace Transformers ve unsloth'un rehberi varsayılan olarak iki veya daha fazla taslak token kullanıyor. OptiQ, üç model boyutunda da K=1'den K=4'e kadar test etti ve K=1'in Apple Silicon'da tutarlı biçimde en iyisi olduğunu gördü: 9B için K=2'deki 1.19x'e karşılık 1.28x; K=3 ve K=4'te baseline'ın altına düşüyor. Nedeni donanım: CUDA'da ek tokenların doğrulanması neredeyse bedava, çünkü Tensor Cores tek token decode sırasında boşta kalan işlem gücüne sahip; Metal'in işlem gücü-bant genişliği oranı ise bir H100'ünkinden kabaca 10 kat düşük, dolayısıyla K=2 doğrulaması K=1 doğrulamasının yaklaşık iki katına mal oluyor. Tamamen kabul edilen döngülerden sonra K'yı yükselten HuggingFace'in dinamik derinlik buluşu, sabit K=1'e karşı yüzde 4 ile 17 arasında kaybettirdi.
Son sayılar
24 GB'lık bir M4 Pro'da, greedy decoding ve 512 üretilen token ile OptiQ 0.1.0, Qwen3.5-4B'de 1.20x (29.2'den 35.0 tok/s), 9B'de 1.32x (19.5'ten 25.8 tok/s) ve Qwen3.6-27B'de 1.40x (6.0'dan 8.4 tok/s) bildiriyor. Qwen'ın sampler'ıyla rakamlar 1.09x, 1.17x ve 1.30x oluyor. 27B greedy sonucu, aynı model sınıfı için bir RTX 6000 üzerinde unsloth'un yayımladığı 1.4x değerinin yüzde beşlik dilimine düşüyor.
Neden önemli
Qwen3.5 ve Qwen3.6'daki MTP head'i basitçe açtığınız bir bayrak değil. Bellek düzeni, sıcaklık altındaki doğrulama kuralı ve sampler kesme tutarlılığı, speculative decoding'in yardım mı edip etmediğini ya da doğrudan zarar mı verdiğini belirliyor ve bu sorunların hiçbiri ölçüm yapmadığınız sürece ortaya çıkmıyor. İki veya daha fazla K gibi ekosistem varsayılanları CUDA donanımına göre ayarlanmış ve Apple Silicon'da yanıltıcı; orada tek token taslağı çıkarmak en ideal nokta. Bu modelleri yerel olarak çalıştıranlar için pratik çıkarım şu: doğru bağlanmış bir MTP head'i, taslak ve doğrulama yolları aynı kesmeyi paylaştığı ve uygulama zaten yüklenmiş ağırlıkları yeniden kullandığı sürece, bir Mac'i iş istasyonu GPU hızlandırmalarının büyük bölümüne ulaştırıyor.
- #qwen
- #speculative-decoding
- #apple-silicon
- #mlx
- #llm-inference