Apple Silikon İçin Cihaz Üstü Çıkarımı Optimize Etme
Ön doldurma ve kod çözme verimliliğini artıran özel bir yerel motor.
Apple silikon üzerinde Hibrit Hesaplama, buluttaki öncü zeka ile Mac üzerindeki yerel bir model arasında bir görevi koordine eder. Bulut modelleri araştırma ve akıl yürütmeyi yönetirken, yerel bir model Mac üzerindeki özel dosyalar ve uygulamalarla çalışır.
Bu iş bölümünün kusursuz hissettirmesi için yerel çıkarımın görevin geri kalanıyla aynı hızda gitmesi gerekir. Bu, istemleri hızlı bir şekilde işleyebilen ve yüksek bir kelime parçacığı üretim oranını sürdürebilen bir motor gerektirir.
Hafif yerel çıkarım motorumuz Lily, ön doldurma ve kod çözme için ayrı optimizasyonlarla özellikle Apple silikon ve Qwen3.6-35B-A3B için oluşturulmuştur. Motor yakında açık kaynaklı hale getirilecektir.
Giriş
Bir Mac üzerinde LLM çalıştırmanın yaygın bir yolu, Apple'ın Apple silikon için açık kaynaklı makine öğrenimi çerçevesi olan MLX ile gerçekleşir. Yardımcı kitaplığı MLX-LM, çok çeşitli dil modelleriyle metin yüklemek ve üretmek için gereken bileşenleri ekler. MLX ve MLX-LM birlikte yerel LLM çıkarımı için kullanıma hazır, genel amaçlı bir yığın sağlar.
Qwen3.6-35B-A3B, seyrek (sparse) ve hibrit bir modeldir: uzmanların karışımı (MoE) yönlendirmesini kullanır ve sabit boyutlu yinelenen durumları tam dikkat ile birleştirir. Bu mimari tercihler gereken hesaplama miktarını azaltır, ancak aynı zamanda düzensiz iş yükleri de oluşturur. Kelime parçacıkları farklı uzman ağırlıklarına yönlendirilir ve yinelenen durumlar doğası gereği sıralıdır.
MLX-LM, çıkarım aşamaları ve ortak iş yükü şekilleri için halihazırda optimize edilmiş çekirdekler seçer, ancak yeniden kullanılabilir işlemleri birçok model mimarisini desteklemelidir. Qwen'e adanmış bir motor, model ve çalışma zamanı düzeyinde uzmanlaşabilir; modelin sabit yapısı etrafında çekirdekleri, veri hareketini ve zamanlamayı koordine edebilir.
Lily bu uzmanlaşmayı tek bir süreçte uçtan uca uygular. Bir Rust çalışma zamanı model kontrol noktasını yükler ve oturum durumunu ile üretim döngüsünü yönetir, OpenAI uyumlu bir sohbet tamamlama API'si istekleri kabul eder ve kelime parçacıklarını akıtır ve özel Metal çekirdekleri Qwen'e özel işlemleri yürütür. Yürütme yolunda ne PyTorch ne de MLX vardır.

Ön doldurma ve kod çözme performansını ayrı ayrı ölçüyoruz. Ön doldurma verimliliği, motorun istemi ne kadar hızlı işlediğini yakalar; kod çözme verimliliği ise çıkış kelime parçacıklarını ne kadar hızlı ürettiğini yakalar.
Qwen3.6-35B-A3B modelini 40 çekirdekli GPU'ya ve 128 GB birleştirilmiş belleğe sahip M5 Max destekli tek bir MacBook Pro üzerinde kıyaslıyoruz. Ön doldurma (prefill) için on ve kod çözme (decode) için on istem uzunluğu genelinde, 256'dan 128K kelime parçacığına (K = 1.024) kadar olan aralıkta motor, MLX-LM'nin ön doldurma verimliliğinin ortalama 1,23 katına ve kod çözme verimliliğinin 1,35 katına ulaşıyor. 4K kelime parçacıklı bir istemde ve 4K kelime parçacıklı bir kod çözme bağlamında, özel motor saniyede 5.749,9 ön doldurma kelime parçacığına ve saniyede 186.6 kod çözme kelime parçacığına ulaşıyor; MLX-LM'de ise bu rakamlar sırasıyla 4.737,5 ve 140.9 idi. Çok turlu bir oturum boyunca bu zaman tasarrufları, eklenen her model çağrısıyla birlikte birikir.

Sonraki aşamada, Qwen'in mimarisinin Apple silikon üzerinde modele özel optimizasyon fırsatlarını nasıl yarattığını açıklıyoruz. Ardından ortaya çıkan ön doldurma ve kod çözme değişikliklerini ele alıyoruz. MLX-LM ile uçtan uca bir karşılaştırma ile bitirmeden önce, ek optimizasyonların getirgesinin bittiği noktaları da ele alıyoruz.
Apple silikon üzerinde Qwen'e özel optimizasyon fırsatları
Qwen üç farklı iş yükü şekli oluşturur
Qwen3.6-35B-A3B, 35 milyar parametre içerir ancak her kelime parçacığı için yalnızca yaklaşık 3 milyarını etkinleştirir. Bir yönlendirici 256 uzman alt ağını puanlar ve her kelime parçacığını işleyen paylaşılan bir uzmanla birlikte sekizini seçer. Bu seyrek MoE tasarımı hesaplamayı azaltır ancak düzensiz iş üretir: uzmanlar farklı sayıda kelime parçacığı alır ve her kelime parçacığı farklı bir uzman kombinasyonundan ağırlıklar gerektirir.
Qwen ayrıca 10 tam dikkat katmanını 30 Gated DeltaNet katmanıyla birleştirir. Bu iki katman türü, daha önceki bilgileri farklı şekillerde saklar.
Dikkat katmanları gruplandırılmış sorgu dikkati (GQA) kullanır. Qwen'in 16 sorgu başlığı ve iki anahtar-değer (KV) başlığı vardır; her KV başlığını paylaşan sekiz sorgu başlığı bulunur. Paylaşım, KV önbelleğini daha küçük hale getirir ve önbelleğe alınmış verilerin sorgu başlıkları arasında yeniden kullanılmasına olanak tanır. Önbellek her kelime parçacığı için hâlâ yeni anahtarlar ve değerler saklar, bu nedenle bağlam büyüdükçe her kod çözme adımı daha fazla veri okur.
Bunun yerine Gated DeltaNet, önceki bilgileri sabit boyutlu yinelenen bir duruma sıkıştırır. Öğrenilmiş bir geçit, mevcut durumun ne kadarının korunacağını kontrol ederken bir delta güncellemesi mevcut kelime parçacığından gelen bilgileri birleştirir. Model bu güncellemeleri yinelenen bir şekilde tanımlar, bu nedenle her kelime parçacığı önceki kelime parçacığı tarafından üretilen duruma bağlıdır. Ancak ön doldurma sırasında bir motor aynı hesaplamayı iki şekilde değerlendirebilir. Durumu ileriye doğru taşırken kelime parçacıkları boyunca doğrudan tarama yapabilir veya güncellemeleri daha fazla matris işlemini ve kelime parçacığı düzeyinde paralelliği ortaya çıkaran bloklar halinde yeniden organize edebilir. Hangi yaklaşımın daha hızlı olduğu model boyutlarına, iş yüküne ve donanıma bağlıdır.
Bu yapılar bir araya gelerek üç hesaplama modeli oluşturur: düzensiz uzman grupları, büyüyen bir önbellek üzerinde dikkat (attention) ve doğrudan veya bloklar halinde değerlendirilebilen sabit boyutlu bir yineleme.
Apple silikon, farklı iş yükleri için farklı yollar sağlar
Ön doldurma, birçok istem kelime parçacığı aktivasyon satırını aynı anda işler. Burada ele alınan yerel iş yükü tipik olarak aynı anda bir isteği çözer (batch 1) ve adım başına yeni bir satır işler. Bu fark, aynı model ağırlıklarının nasıl kullanıldığını değiştirir. Ön doldurma, her ağırlık bloğunu yüzlerce veya binlerce satırda yeniden kullanabilir. Kod çözme büyük ölçüde bunu yapamaz, çünkü her yeni kelime parçacığı ağırlıklar üzerinden başka bir geçiş gerektirir.
Apple silikon; CPU ve GPU'yu, her ikisinin de erişebileceği tek bir fiziksel bellek havuzu olan birleştirilmiş bellek arkasına yerleştirir. Bu, modelin ayrı bir GPU kopyası tutulmadan yerleşik kalmasına olanak tanır, ancak veri hareketini ücretsiz hale getirmez. Ağırlıkları ve ara değerleri okumak yine de bellek bant genişliği tüketirken, kayıt defterleri ve diğer çip üstü depolama daha hızlı ancak çok daha küçüktür.
M5 GPU ayrıca farklı hesaplama yolları sağlar. Ön doldurmanın doğrusal katmanları, bir ağırlık matrisini aynı anda birçok satıra uygulayan genel matris-matris çarpımını (GEMM) kullanır. Uyumlu GEMM'ler, Metal 4 tensör işlemleri aracılığıyla her GPU çekirdeğindeki Nöral Hızlandırıcıyı kullanabilir. Batch-1 kod çözme bunun yerine aynı ağırlıkları tek bir satıra uygulayan genel matris-vektör çarpımını (GEMV) kullanır. Düşük ağırlık yeniden kullanımıyla GEMV, esas olarak belleğin bant genişliği ile sınırlıdır ve daha yüksek veri yeniden kullanımına sahip matris işlemleri için tasarlanmış Nöral Hızlandırıcılardan ziyade GPU'nun vektör aritmetik mantık birimlerine (ALU'lar) daha uygundur.
Bu yürütme yolları yalnızca Lily'ye özgü değildir. MLX aynı birleştirilmiş bellek üzerinde çalışır ve iş yükü şekline göre optimize edilmiş matris ve vektör çekirdekleri seçer. MLX-LM'nin Qwen uygulaması halihazırda uzman çalışmalarını gruplandırır, Gated DeltaNet'i birleştirilmiş yinelenen Metal çekirdeği ile değerlendirir ve GQA bilincine sahip dikkat kullanır. Bu yetenekler, Apple silikon üzerinde verimli Qwen çıkarımı için paylaşılan başlangıç noktasıdır.
Optimizasyon stratejisi
Lily'nin daha dar kapsamı, bu paylaşılan yürütme yollarını Qwen'in tam mimarisi ve boyutları etrafında koordine etmesine olanak tanır. Aşamaya özel GPU yolları kullanır; veri hareketini en aza indirmek için Qwen'in uzman, yinelenen ve dikkat iş yüklerini eşler; ayrıca ölçülen iş yükü şeklinden çekirdekleri ve düzenleri seçer. Strateji üç parçadan oluşur:
- GPU yolunu çıkarım aşamasına eşleyin. Ön doldurma ağırlıkları birçok satır arasında yeniden kullanabildiğinde matris odaklı yürütmeyi kullanın ve batch-1 kod çözme her seferinde bir satır işlediğinde vektör odaklı yürütmeyi kullanın.
- Veri hareketini en aza indirirken Qwen'in yapısını GPU'ya eşleyin. Ağırlıkları kullanılana kadar sıkıştırılmış tutun, yönlendirilen uzman çalışmasını CPU'ya dönmeden düzenleyin, Gated DeltaNet durumunu yinelenen taraması boyunca çip üzerinde tutun ve gruplandırılmış sorgu dikkati tarafından paylaşılan KV verilerini yeniden kullanın.
- Çekirdekleri iş yükü şekline uyarlayın. Her aşamada; mevcut satır sayısından, satırların uzmanlar arasındaki dağılımından, işlemin boyutlarından ve mevcut bağlam uzunluğundan döşeme boyutlarını, yürütme düzenlerini ve dikkat yollarını seçin.
Aşağıdaki bölümlerde bu tercihler açıklanmaktadır. Bir M5 Max üzerinde eşleşen abilasyonlarda değerlendirilen optimizasyonlar için etkilerini, yalnızca incelenen optimizasyonda farklılık gösteren aksi takdirde aynı motor yapılandırmalarını karşılaştırarak tahmin ediyoruz. Bu deneyler motorumuzun sürümlerini kendiyle karşılaştırdığından, nihai sonuçları MLX-LM'ye göre ayrıştırmaktan ziyade mekanizmaları açıklar.
Ön doldurma: ağırlıkları yeniden kullanın ve yönlendirmeyi GPU üzerinde tutun
Ön doldurma aynı anda birçok kelime parçacığı satırını ortaya çıkarır, ancak Qwen bu satırları uzmanlar arasında düzensiz bir şekilde yönlendirir ve dizi boyunca yinelenen durumu günceller. Optimizasyonları üç gruba ayrılır: seyrek uzman çalışmasını yönlendirilen satırlar etrafında düzenlemek, Gated DeltaNet taramasını çip üzerinde tutmak ve uzun istemleri sınırlı yığınlara bölmek.

Seyrek uzman hesaplamasını optimize edin
Matris çarpımı sırasında ağırlıkları kuantizasyondan arındırın (dequantize)
Qwen3.6-35B-A3B kontrol noktası, grup tabanlı afin 4 bit kuantizasyon kullanır. Her ağırlık 4 bitlik bir tamsayı kodu olarak saklanırken, 64 ağırlıktan oluşan her grup, değerlerini yeniden oluşturmak için kullanılan bir bfloat16 ölçeğini ve sapmasını (bias) paylaşır. Bu, 35 milyar parametreli modeli kabaca 70 GB bfloat16 ağırlıktan 19.4 GB'lık bir kontrol noktasına indirgeyerek modelin Mac üzerinde kalmasını pratik hale getirir.
Matris çarpımı için kullanılan Metal 4 tensör işlemi, paketlenmiş 4 bitlik temsil yerine bfloat16 işlenenleri (operands) tüketir. Çarpımdan önce GPU ağırlıkları bfloat16 olarak yeniden oluşturmalıdır. Lily'deki optimize edilmiş gruplandırılmış GEMM bu dönüşümü her seferinde küçük bir ağırlık döşemesi (tile) olacak şekilde gerçekleştirir ve sonucu, yönlendirilen aktivasyon satırlarıyla çarpacak kadar uzun süre çip üstü iş parçacığı grubu belleğinde (threadgroup memory) tutar. Biriktirme 32 bitlik kayan nokta kullanır ve çıktı bfloat16 olarak yazılır. Eksiksiz genişletilmiş ağırlık dizisi birleştirilmiş bellekte asla oluşturulmaz.
Abilasyonda kuantizasyondan arındırma ayrı bir işlem olarak çalışır: 4 bitlik ağırlıkları birleştirilmiş bellekte bfloat16 dizisine genişletir, ardından matris çekirdeği bu diziyi geri okur. 512 kelime parçacıklı bir istemde, kuantizasyondan arındırmayı gruplandırılmış GEMM'e taşımak, bu ara yazma ve okumayı ortadan kaldırarak uçtan uca ön doldurma verimliliğini %77,4 oranında artırdı.
Uzman yönlendirmesini GPU üzerinde tutun
Gruplandırılmış GEMM, her uzmana atanan aktivasyon satırlarının birlikte saklanmasını gerektirir. Kelime başına sekiz uzman seçildikten sonra, bir histogram her uzmana kaç atama gittiğini sayar. Bir önek taraması bu sayıları başlangıç ofsetlerine dönüştürür, bir dağıtma (scatter) adımı satırları uzman gruplarına yerleştirir ve bir blok haritası gruplandırılmış GEMM'in işlemesi gereken sabit boyutlu matris bloklarını listeler.
Optimize edilmiş yol, her istem parçası için bu dizinin tamamını tek bir komut arabelleğinde, yani sıralı bir GPU işlemleri grubunda tutar. Bunun yerine bir abilasyon duraklayarak CPU'nun yönlendirme ara maddelerini incelemesine ve sonraki işlemi göndermesine olanak tanır. Histogramı ve önek taramasını GPU'da tutmak iki çekirdek ekler ancak her MoE katmanı içindeki CPU-GPU senkronizasyonunu ortadan kaldırır.
512 kelime parçacıklı bir istemde, GPU yerleşik yönlendirmenin etkinleştirilmesi uçtan uca ön doldurmayı %89 oranında artırdı. Bu aynı zamanda çekirdek sayısının tek başına neden yanıltıcı olabileceğini de göstermektedir: daha hızlı rota daha fazla çekirdek başlatır ancak katman içinde asla CPU'yu beklemez.
Döşeme boyutunu uzman yüküyle eşleştirin
2K kelime parçacıklı bir istemde, her kelime parçacığını 256 uzmandan sekizine yönlendirmek 16.384 kelime parçacığı-uzman ataması veya uzman başına ortalama 64 aktivasyon satırı üretir. Gerçek dağılım düzensizdir: bazı uzmanlar çok sayıda satır alırken diğerleri az sayıda alır.
Gruplandırılmış GEMM, her uzmanın çıktısını matris çarpımının çıktısının küçük dikdörtgen blokları olan döşemelere (tiles) böler. Her döşeme (tile) bir GPU iş parçacığı grubuna (threadgroup) atanır. Apple silikonun GPU'larında bir iş parçacığı grubu (threadgroup), talimatları eş kilitli (lockstep) olarak yürüten 32 konu başlığından (threads) oluşan bir veya daha fazla simdgroup içerir.
Daha büyük döşemeler (tiles) kurulum maliyetini daha fazla satıra yayar ve daha fazla paralel çalışmayı ortaya çıkarır, ancak bir uzman yalnızca birkaç satır aldığında büyük bir döşemenin bir kısmı boş kalır. Bu nedenle döşeme boyutu ve simdgroup sayısı birbirine bağlıdır.
Bir abilasyon döşemeyi 16 satırda sabitler. Bu kontrole karşı, dört simdgroup ile 32 satırlık döşemenin etkinleştirilmesi 2K kelime parçacığında uçtan uca ön doldurmayı %13,2 oranında iyileştirdi.
Yinelenen durumu çip üzerinde tutun
Ön doldurma sırasında, her Gated DeltaNet katmanı yinelenen durumunu ileriye doğru taşırken istemi sırayla tarar. Kayıt defteri ikameti devre dışı bırakıldığında, abilasyon bloklu bir tarama kullanır. 2K kelime parçacıklı bir istemde, bu yol katman başına 256 MiB (mebibayt) durum taşır ve katılımcı tüm konu başlıklarının (threads) diğerini beklemek zorunda olduğu senkronizasyon noktaları olan bariyerlerde işbirliği yapan konu başlıklarını (threads) defalarca durdurur.
Yinelenen durum bir matristir. Optimize edilmiş çekirdek, her sütunu bir simdgroup'a atar. Simdgroup, sütunu kendi konu başlıkları (threads) arasında böler, sütunu bir kez konu başlıkları (threads) kayıt defterlerine yükler ve tarama boyunca durumu taşır. Konu başlıkları (threads), iş parçacığı grubu genelinde paylaşılan on-chip depolama olan iş parçacığı grubu belleği yerine simdgroup işlemleri aracılığıyla ara sonuçları değiş tokuş eder. Tamamlanan durum yalnızca taramadan sonra geri yazılır.
Durum ve geçidi, sıralı güncellemeler boyunca küçük yuvarlama hataları biriktiği için 32 bitlik kayan noktalı format kullanır. Sorgu ve anahtar aktivasyonları bfloat16 kalır.
2K kelime parçacıklı bir istemde, kayıt defteri tabanlı taramanın etkinleştirilmesi uçtan uca ön doldurmayı %5,6 oranında iyileştirdi. Uzman GEMM'leri ön doldurma süresinin yaklaşık %90'ını oluşturdu. Sıralı tarama, Nöral Hızlandırıcılardan yararlanmak için yeterince yeniden kullanılabilir matris çalışmasını ortaya çıkarmaz.
İstem yığınıyla geçici belleği sınırlandırın
Çalışma zamanı, uzun bir istemi, her istem kelime parçacığı için geçici verileri aynı anda bellekte tutmak yerine sınırlı yığınlar dizisi olarak işler. Model ağırlıkları birleştirilmiş bellekte kalırken, yinelenen durum ve KV önbelleği bağlamı bir yığından diğerine taşır. Hiçbir önceki bağlam atılmaz.
Parçalama (chunking) olmadan geçici aktivasyon dizileri tam istemle birlikte büyür ve birleştirilmiş bellek için model ağırlıkları, yinelenen durum ve KV önbelleğiyle yarışır. Parçalama (chunking), aynı anda yalnızca bir segmentin geçici değerlerini canlı tutar, ardından sonraki segmenti işlemeden önce bu depolamayı serbest bırakır veya yeniden kullanır. Bu, tepe çalışma belleğini sınırlar ve motorun modelin çıktısını değiştirmeden daha uzun istemleri işlemesine olanak tanır.
Parçalanmış ön doldurma birçok motor arasında popülerdir ve bu belleğe duyarlı ortamlarda uzun çok turlu yörüngeleri sunmak için çok önemlidir. Dikkat katmanları için toplam ön doldurma süresi, önceki yığınların tekrar eden KV yüklemelerinden kaynaklanan bazı ek yüklerle birlikte istem uzunluğuna göre karesel kalır.
Kod çözme: kelime parçacığı başına taşınan bayt sayısını en aza indirin
Batch-1 kod çözme her seferinde bir yeni satır işler. Düşük ağırlık yeniden kullanımıyla, verimliliği esas olarak motorun her kelime parçacığı için kaç bayt taşıdığına bağlıdır. Kod çözme değişiklikleri dört gruba ayrılır: tek satırlı ağırlık yolunu optimize etmek, her adımı GPU'da tutmak, ara ve durum trafiğini azaltmak ve dikkat önbelleğini verimli bir şekilde okumak.

Tek satırlı ağırlık yolunu optimize edin
MLX, tek satırlık çalışmaları halihazırda özelleştirilmiş matris-vektör çekirdeklerine dağıtır. Lily, MLX kullanmadığı için özel çalışma zamanı aynı temel stratejiyi sağlamalıdır. Satır paralel GEMV'miz bir aktivasyon satırı için tasarlanmıştır. Bir simdgroup, ağırlık matrisinin farklı kısımlarını paralel olarak okurken çıktı üzerinde işbirliği yapar.
Her kod çözme adımını GPU üzerinde tutun
Kelime parçacığı devrini GPU üzerinde tutun
Her kod çözme adımı bir sonraki kelime parçacığını seçerek sona erer; sonraki adım bu kelime parçacığını girdi olarak alarak başlar. Seçimi CPU'ya ve ardından tekrar GPU'ya göndermek her kelime parçacığına bir senkronizasyon noktası ekler. Çalışma zamanımız bunun yerine iki komut arabelleği ve iki GPU yerleşik kelime parçacığı yuvası arasında geçiş yapar. GPU en yüksek puana sahip kelime parçacığını seçer ve kimliğini doğrudan sonraki kod çözme adımı için girdi yuvasına yazar, bu sırada CPU sonraki çalışmaları hazırlar.
Bağımsız GPU çalışmalarını örtüştürün
Kaydedilen batch-1 kod çözme adımlarından birinde, bir kelime parçacığı üretmek 795 GPU çekirdeği başlattı. Bağımlılıkları 555 sıralı aşama oluşturarak bazı çekirdeklerin eşzamanlı çalışmasına izin verdi. Yine de Metal'in seri yürütme modu her çekirdeği sırayla çalıştırdı.
Optimize edilmiş kod çözme yolu, eşzamanlı bir Metal geçişinde gerçek veri bağımlılıklarını kaydeder. GPU kaynakları izin verdiğinde bağımsız çekirdek başlatmaları aynı anda çalışabilir. Bir bariyer yalnızca sonraki çalışmalar önceki bir sonucu gerektirdiğinde eklenir.
Ara ve durum trafiğini azaltın
Ayrı çekirdekler sıklıkla bir ara değer somutlaştırır: bir çekirdek geçici bir sonucu belleğe yazar ve sonrakiler sonucu geri okur. Optimize edilmiş kod çözme yolu dört zinciri birleştirir: geçitli aktivasyonlarıyla iki uzman girdi projeksiyonu; yönlendirme puanı ve paylaşılan uzman sonucuyla uzman çıktı projeksiyonu; dikkat öncesi sorgu ve anahtar hazırlığı; ve normalleştirmesiyle yinelenen güncelleme. Birleştirilmiş her çekirdek, geçici değerleri bellekten göndermek yerine kayıt defterlerinde tutar.
Birleştirme ayrıca bağımlılık grafiğini kısaltır: ara yazma ortadan kalktığında, tüketicisini koruyan bariyer de ortadan kalkar.
Dikkat önbelleğini verimli bir şekilde okuyun
Dikkat önbelleği okumalarını birleştirin
Dikkat, her kod çözme adımı sırasında KV önbelleğinden anahtarları ve değerleri okur. Abilasyonda, komşu GPU konu başlıkları (threads) her zaman komşu baytları istemez ve bellek sistemini daha fazla ayrı işlemi sunmaya zorlar. Birleştirilmiş yüklemelerin etkinleştirilmesi, bitişik konu başlıklarının (threads) bitişik baytları istemesini sağlar, böylece donanım okumalarını birleştirebilir.
Bfloat16 yapılandırmasında birleştirme (coalescing), anahtar bant genişliğini 33.8'den 47.9 GB/sn'ye çıkardı, değer bant genişliğini 42.0'dan 61.8 GB/sn'ye çıkardı ve 3.840 kelime parçacıklı bir bağlamda uçtan uca kod çözmeyi %2,1 oranında iyileştirdi.
KV satırlarını yeniden kullanmak için sorgu başlıklarını paketleyin
Gruplandırılmış sorgu dikkati, sekiz sorgu başlığının bir KV başlığını paylaşmasına olanak tanır. Abilasyonda her sorgu başlığı ayrı bir simdgroup'ta çalışır, dolayısıyla sekizinin tümü aynı önbelleğe alınmış KV satırını bağımsız olarak talep eder. Optimize edilmiş çekirdek, dört sorgu başlığını her KV satırını bir kez yükleyen ve bunu dört dikkat hesaplaması arasında yeniden kullanan tek bir iş parçacığı grubunda (threadgroup) toplar. İkinci bir iş parçacığı grubu ise kalan dört başlığı yönetir.
Genellikle GQA paketleme olarak adlandırılan bu teknik, aynı aritmetiği gerçekleştirir ve sekiz bağımsız KV isteğini iki paylaşılan yüklemeye indirgerken aynı çıktı baytlarını üretir. Paketlenmemiş abilasyona karşı, 32K kelime parçacıklı bir bağlamda uçtan uca kod çözme verimliliğini %23,8 oranında iyileştirdi.
Uzun bağlamlarda dikkat düzenlerini değiştirin
Tam dikkat katmanındaki her kod çözme adımı mevcut KV önbelleğini tarar. Sabit blok düzeni, bu önbelleği GPU'nun paralel olarak işleyebileceği eşit parçalara böler. Önbellek küçük olduğunda ekstra zamanlaması çok anlamlı değildir, ancak bağlam büyüdükçe sabit blok düzeni işi daha dengeli bir şekilde dağıtır.
Bu model için çalışma zamanı, genel dikkat yolunu 32K kelime parçacığının altında tutar ve 32K veya daha uzununda sabit blok yolunu kullanır. Geçiş, her başlık 256 değere sahip olduğunda ve sekiz sorgu başlığı bir KV başlığını paylaştığında geçerli olur; diğer şekiller genel yolda kalır. Bir abilasyon bu geçişi devre dışı bırakır ve her zaman genel yolu kullanır. Sabit blok rotasının etkinleştirilmesi, uçtan uca kod çözmeyi 32K'da %7,7, 64K'da %27,4 ve 128K'da %40,2 oranında iyileştirdi.
Daha fazla optimizasyonun sınırları
Bazı değişiklikler izole edilmiş bir işlemi iyileştirdi ancak uçtan uca çıkarımı iyileştirmedi.
Tam modelin doğrulaması için kelime parçacığı önermek amacıyla daha küçük bir model kullanan spekülatif kod çözme (speculative decoding), batch-1 kod çözmeyi %18 daha yavaş hale getirdi. Doğrulama iki ila beş satırlık grupları işledi; bu donanım için verimsiz bir şekildi ve satırlar genellikle farklı uzmanları seçerek okunan uzman ağırlığı veri miktarını artırdı. Taslak oluşturucunun çıktı dağarcığını azaltmak taslak oluşturucu verimliliğini %4,7–5,1 oranında iyileştirdi, ancak eksiksiz spekülatif döngüyü daha hızlı hale getirmedi. Bu sonuç iş yüküne özgüdür: Blackwell üzerindeki toplu Qwen dağıtımımız farklı koşullar altında spekülatif kod çözme kullanır.
Diğer deneyler arasında GPU başlatmalarını azaltmak, tüm aşamaları örtüştürmek, daha büyük ön doldurma döşemeleri kullanmak, daha geniş birleştirme uygulamak, yönlendiriciyi hızlandırmak ve çıkış projeksiyonunu kelime parçacığı seçimiyle birleştirmek yer aldı. Hiçbiri eksiksiz çıkarım döngüsünü iyileştirmedi.
Donanım sınırlarına ilişkin ölçümler de ana ön doldurma ve kod çözme işlemlerinde çok az kalan pay olduğunu gösterdi. MoE GEMM'leri ve GEMV'leri, erişim kalıpları için en hızlı sürdürülebilir ağırlık okuma hızlarının %97,9 ve %90,3'üne ulaştı. Seyrek GEMV'den aritmetiğin kaldırılması verimliliği yalnızca %0,2 değiştirdi; bu da hesaplamadan ziyade ağırlık okumalarının sınırlayıcı kaynak olduğunu doğruladı. Ön doldurmanın matris çarpımı da benzer şekilde izole durumda teorik matris sınırının %93'üne ve test edilen modeller içinde %80–86'sına ulaştı.
Uçtan uca performans
Uçtan uca karşılaştırma, her iki motorda aynı 4 bitlik kontrol noktası baytlarını yükler ve tek bir 40 çekirdekli, 128 GB M5 Max üzerinde aynı anda tek bir istek çalıştırır. Her turun içinde iki motor, arka plan yükünden ve çip sıcaklığındaki değişikliklerden kaynaklanan önyargıyı azaltmak için alternatif sırayla çalışır. Sunucusuyla değil, MLX-LM'nin en hızlı doğrudan üretim yoluyla karşılaştırma yapıyoruz, böylece ölçüm sunucu yükü yerine model yürütmeye odaklanıyor.
Tarama, 256'dan 128K kelime parçacığına kadar ön doldurma için on istem uzunluğunu ve kod çözme için on bağlam uzunluğunu kapsar. Motor sabit kurulum maliyetlerini daha fazla kelime parçacığına yaydıkça ön doldurma verimliliği önce yükselir. Ön doldurma 4K kelime parçacıklı bir istem civarında zirve yapar, ardından on tam dikkat katmanı istem büyüdükçe daha fazla iş gerçekleştirdiği için düşer. Kod çözme kısa bağlamlarda neredeyse düz kalır ve büyüyen KV önbelleğini okumak önemli hale geldiğinde azalır. Özel motor kaydedilen her uzunlukta daha hızlıdır.
Özelleştirilmiş yürütme kayan nokta işlemlerinin sırasını değiştirebileceğinden, MLX-LM'ye karşı sayısal tutarlılığı da kontrol ettik. Öğretmen zorlamalı bir karşılaştırmada, her iki motor da 192 konumun her birinde aynı referans önekten sonraki kelime parçacığını tahmin ederek önceki farkların sonraki girdileri etkilemesini önledi. Lily'nin şaşkınlığı (perplexity) yalnızca %0,04 daha yüksekti ve test edilen konumların %96,35'inde aynı üst sıradaki kelime parçacığını seçti.

Yerel platform için üretildi
Apple silikon, daha küçük bir veri merkezi GPU'su değildir. Kendi donanım ve yazılım özelliklerine sahip eksiksiz bir yerel çıkarım platformudur. Birleştirilmiş bellek, tek bir düğüme tutabileceği model ve durum miktarı konusunda çok yüksek bir sınır sağlar. M5 Nöral Hızlandırıcılar, ön doldurmadaki yoğun matris çalışmasını üstlenir. Vektör ALU'ları ise kod çözmedeki bant genişliği sınırlı, düşük yeniden kullanımlı kalanı yönetir.
Qwen ek özelleştirme fırsatları sunar: uzman yönlendirmesini ve yinelenen durumu GPU üzerinde tutun, gereksiz ara maddeleri ortadan kaldırın, bağımsız çalışmaları örtüştürün, paylaşılan KV verilerini yeniden kullanın ve çekirdekleri iş yükü şekline uyarlayın.
Model ve platform özelinde optimizasyonla tek bir Mac, büyük bir seyrek modeli verimli bir şekilde çalıştırabilir. Gelecekteki çalışmalar; modeller, yongalar ve sunum iş yükleri genelindeki kapsamı genişletecek ve burada tek bir yapılandırmada doğrulanan mekanizmaları daha genel bir çalışma zamanı politikasına dönüştürecektir.
Daha geniş ilke, motoru hem modelin mimarisiyle hem de donanımın özel hesaplama ve bellek yollarıyla eşleştirmektir. Sınır açık ağırlıklı modeller ve donanım geliştikçe, yüksek performanslı yerel çıkarım, aralarındaki farkları soyutlayanlardan ziyade her ikisine göre uyarlanmış motorlara giderek daha fazla bağımlı hale gelecektir.