Optimizacija inferencije na uređaju za Apple Silicon
Prilagođeni lokalni mehanizam koji poboljšava propusnost predpopunjavanja i dekodiranja.
Hibridno računanje na Apple siliconu koordinira zadatak između granične inteligencije u oblaku i lokalnog modela na Macu. Modeli u oblaku nose se s istraživanjem i zaključivanjem, dok lokalni model radi s privatnim datotekama i aplikacijama na Macu.
Da bi ova podjela rada djelovala besprijekorno, lokalno zaključivanje mora držati korak s ostatkom zadatka. To zahtijeva mehanizam koji može brzo obrađivati upite i održavati visoku stopu generiranja tokena.
Lily, naš lagani lokalni inferencijski mehanizam, napravljen je posebno za Apple Silicon i Qwen3.6-35B-A3B, uz zasebne optimizacije za pretpunjavanje i dekodiranje. Samostalna demo verzija javno je dostupna na GitHub.
Uvod
Uobičajeni način pokretanja jezičnih modela velikih mogućnosti (LLM) na Macu je s MLX-om, Appleovim open-source okvirom za strojno učenje za Apple silicon. Njegova prateća biblioteka, MLX-LM, dodaje komponente potrebne za učitavanje i generiranje teksta sa širokim rasponom jezičnih modela. Zajedno, MLX i MLX-LM pružaju gotov stog opće namjene za lokalno zaključivanje LLM-a.
Qwen3.6-35B-A3B je rijedak, hibridni model: koristi usmjeravanje mješavinom stručnjaka (MoE) i kombinuje stanja ponavljanja fiksne veličine s punom pažnjom. Ovi arhitekturni izbori smanjuju količinu potrebnog računanja, ali također stvaraju neregularna radna opterećenja. Tokeni se usmjeravaju prema različitim težinama stručnjaka, a stanja ponavljanja su po svojoj prirodi sekvencijalna.
MLX-LM već odabire optimizirane jezgre za faze zaključivanja i uobičajene oblike radnog opterećenja, ali njegove višekratne operacije moraju podržavati mnoge arhitekture modela. Mehanizam posvećen Qwenu može se specijalizirati na razini modela i izvođenja, koordinirajući jezgre, kretanje podataka i raspoređivanje oko fiksne strukture modela.
Lily implementira ovu specijalizaciju od kraja do kraja u jednom procesu. Rust izvođenje učitava kontrolnu točku modela i upravlja stanjem sesije i petljom generiranja, API za chat završetke kompatibilan s OpenAI-jem prihvaća zahtjeve i struji tokene, a prilagođene Metal jezgre izvršavaju operacije specifične za Qwen. Niti PyTorch niti MLX nisu na putu izvršavanja.
Mjerimo performanse predpopunjavanja i dekodiranja odvojeno. Propusnost predpopunjavanja bilježi koliko brzo mehanizam obrađuje upit; propusnost dekodiranja bilježi koliko brzo generira izlazne telefone.
Mjerimo Qwen3.6-35B-A3B na jednom MacBooku Pro pogonjenom M5 Max čipom sa 40-jezgrenim GPU-om i 128 GB objedinjene memorije. Kroz deset duljina prompta za prefill i deset duljina konteksta za decode, od 256 do 128K tokena (K = 1.024), engine u prosjeku postiže 1,22× MLX-LM-ov throughput prefilla i 1,32× njegov throughput dekodiranja. Pri promptu od 4K tokena i kontekstu dekodiranja od 4K tokena, prilagođeni engine postiže 5.749,9 tokena u sekundi za prefill i 186,6 tokena u sekundi za dekodiranje, u usporedbi s 4.737,5 i 140,9 kod MLX-LM-a. Kroz višekratnu sesiju, ta ušteda vremena kumulira se sa svakim dodatnim pozivom modelu.
Zatim objašnjavamo kako Qwenova arhitektura stvara prilike za optimizaciju specifične za model na Apple siliconu. Potom prolazimo kroz rezultirajuće promjene predpopunjavanja i dekodiranja. Također obuhvaćamo gdje dodatna optimizacija prestaje biti isplativa prije nego što zaključimo usporedbom od kraja do kraja s MLX-LM-om.
Mogućnosti optimizacije specifične za Qwen na Apple siliconu
Qwen stvara tri različita oblika radnog opterećenja
Qwen3.6-35B-A3B sadrži 35 milijardi parametara, ali aktivira samo oko 3 milijarde za svaki token. Usmjerivač ocjenjuje 256 podsustava stručnjaka i odabir osam, uz jednog dijeljenog stručnjaka koji obrađuje svaki token. Ovaj rijedak MoE dizajn smanjuje računarstvo, ali proizvodi neujednačen rad: stručnjaci primaju različit broj tokena, a svaki token zahtijeva težine iz različite kombinacije stručnjaka.
Qwen također kombinira 10 slojeva pune pažnje s 30 slojeva Gated DeltaNet. Ove dvije vrste slojeva zadržavaju ranije informacije na različite načine.
Slojevi pažnje koriste pažnju s grupiranim upitima (GQA). Qwen ima 16 glava upita i dvije glave ključ-vrijednost (KV), s osam glava upita koje dijele svaku KV glavu. Dijeljenje čini KV predmemoriju manjom i omogućuje ponovnu upotrebu predmemoriranih podataka preko glava upita. Predmemorija i dalje pohranjuje nove ključeve i vrijednosti za svaki token, tako da svaki korak dekodiranja čita više podataka kako kontekst raste.
Gated DeltaNet umjesto toga sažima ranije informacije u stanje ponavljanja fiksne veličine. Naučena vrata kontroliraju koliki dio postojećeg stanja treba zadržati, dok ažuriranje delta uključuje informacije iz trenutnog tokena. Model definira ova ažuriranja ponavljajuće, tako da svaki token ovisi o stanju koje proizvodi prethodni token. Međutim, tijekom predpopunjavanja, mehanizam može procijeniti isto izračunavanje na dva načina. Može skenirati kroz tokene izravno dok prenosi stanje naprijed ili reorganizirati ažuriranja u blokove koji izlažu više matričnih operacija i paralelizma na razini tokena. Koji je pristup brži ovisi o dimenzijama modela, radnom opterećenju i hardveru.
Zajedno ove strukture stvaraju tri računska uzorka: neujednačene skupine stručnjaka, pažnju nad rastućim predmemorijskim spremnikom i ponavljanje fiksne veličine koje se može procjenjivati izravno ili u blokovima.
Apple silicon nudi različite putove za različita radna opterećenja
Predpopunjavanje obrađuje mnoge retke aktivacije tokena upita odjednom. Ovdje razmatrano lokalno radno opterećenje obično dekodira jedan zahtjev u isto vrijeme (paket 1) i obrađuje jedan novi redak po koraku. Ova razlika mijenja način na koji se koriste iste težine modela. Predpopunjavanje može ponovno koristiti svaki blok težina kroz stotine ili tisuće redaka. Dekodiranje u velikoj mjeri ne može, budući da svaki novi token zahtijeva još jedan prolaz kroz težine.
Apple silicon postavlja CPU i GPU iza unificirane memorije, jednog fizičkog memorijskog bazena dostupnog objema stranama. To omogućuje modelu da ostane rezidentan bez održavanja zasebne GPU kopije, ali ne čini kretanje podataka besplatnim. Čitanje težina i međuvrijednosti i dalje troši memorijski pojas propusnosti, dok su registri i druga pohrana na čipu brži, ali mnogo manji.
M5 GPU također nudi različite računske putove. Linearni slojevi predpopunjavanja koriste opće množenje matrica-matrica (GEMM), primjenjujući matricu težina na mnogo redaka odjednom. Kompatibilni GEMM-ovi mogu koristiti neuronski akcelerator u svakoj GPU jezgri putem Metal 4 tenzorskih operacija. Dekodiranje paketa-1 umjesto toga koristi opće množenje matrica-vektora (GEMV), primjenjujući iste težine na jedan redak. Uz malu ponovnu upotrebu težina, GEMV je ograničen uglavnom memorijskim pojasom propusnosti i bolje odgovara GPU-ovim vektorskim aritmetičkim logičkim jedinicama (ALU) nego neuronskim akceleratorima dizajniranim za matrične operacije s većom ponovnom upotrebom podataka.
Ovi putovi izvršavanja nisu jedinstveni za Lily. MLX radi preko iste unificirane memorije i bira optimizirane matrične i vektorske jezgre prema obliku radnog opterećenja. MLX-LM-ova implementacija Qwena već grupira rad stručnjaka, procjenjuje Gated DeltaNet sa sjedinjenom rekurzivnom Metal jezgrom i koristi pažnju svjesnu GQA-a. Ove mogućnosti su zajednička polazna točka za učinkovito Qwen zaključivanje na Apple siliconu.
Strategija optimizacije
Lilyin uži opseg omogućuje joj koordinaciju ovih dijeljenih putova izvršavanja oko Qwenove točne arhitekture i dimenzija. Koristi GPU putove specifične za fazu, mapira Qwenova radna opterećenja stručnjaka, ponavljanja i pažnje kako bi se smanjilo kretanje podataka te bira jezgre i rasporede iz izmjerenog oblika radnog opterećenja. Strategija ima tri dijela:
- Uskladite GPU put s fazom zaključivanja. Koristite izvršavanje usmjereno na matrice kada predpopunjavanje može ponovno iskoristiti težine kroz mnoge retke, i izvršavanje usmjereno na vektore kada dekodiranje paketa-1 obrađuje jedan po jedan redak.
- Mapirajte Qwenovu strukturu na GPU uz minimalno kretanje podataka. Držite težine komprimiranim dok se ne upotrijebe, organizirajte rad usmjerenih stručnjaka bez vraćanja na CPU, zadržite stanje Gated DeltaNet-a na čipu kroz njegov rekurzivni sken i ponovno iskoristite KV podatke koje dijele grupirani upiti pažnje.
- Prilagodite jezgre obliku radnog opterećenja. Unutar svake faze odaberite veličine pločica, rasporede izvršavanja i putove pažnje iz dostupnog broja redaka, raspodjele redaka među stručnjacima, dimenzija operacije i trenutne duljine konteksta.
Sljedeći odjeljci objašnjavaju ove odabire. Za optimizacije procijenjene u usklađenim ablaciama na M5 Maxu, procjenjujemo njihove učinke usporedbom inače identičnih konfiguracija mehanizma koje se razlikuju samo u optimizaciji koja se proučava. Budući da ovi eksperimenti uspoređuju verzije našeg mehanizma same sa sobom, oni objašnjavaju mehanizme umjesto da rastavljaju konačne rezultate u odnosu na MLX-LM.
Predpopunjavanje: ponovno iskoristite težine i zadržite usmjeravanje na GPU-u
Predpopunjavanje izlaže mnoge retke tokena odjednom, ali Qwen te retke usmjerava neujednačeno među stručnjacima i ažurira stanje ponavljanja kroz slijed. Njegove optimizacije spadaju u tri skupine: organizirati rad rijetkih stručnjaka oko usmjerenih redaka, zadržati skeniranje Gated DeltaNet-a na čipu i podijeliti duge upite u ograničene komade.
Optimizirajte rijetko računanje stručnjaka
Dekvantizirajte težine tijekom množenja matrica
Kontrolna točka Qwen3.6-35B-A3B koristi grupnu afinu 4-bitnu kvantizaciju. Svaka težina pohranjena je kao 4-bitni cjelobrojni kod, dok svaka skupina od 64 težine dijeli bfloat16 skalu i pomak koji se koriste za rekonstrukciju njenih vrijednosti. Ovo smanjuje model s 35 milijardi parametara s otprilike 70 GB bfloat16 težina na kontrolnu točku od 19,4 GB, čime je praktično zadržati model rezidentnim na Macu.
Metal 4 tenzorska operacija koja se koristi za množenje matrica troši bfloat16 operande umjesto upakirane 4-bitne reprezentacije. Prije množenja, GPU mora rekonstruirati težine u bfloat16. Optimizirani grupirani GEMM u Lily izvodi ovu konverziju jednu malu pločicu težina u isto vrijeme i drži rezultat u memoriji grupe niti na čipu samo dovoljno dugo da ga pomnoži s usmjerenim redcima aktivacije. Akumulacija koristi 32-bitni pomični zarez, a izlaz je zapisan u bfloat16. Kompletan prošireni niz težina nikada se ne stvara u unificiranoj memoriji.
U ablaciji, dekvantizacija se izvodi kao zasebna operacija: proširuje 4-bitne težine u bfloat16 niz u unificiranoj memoriji, nakon čega matrična jezgra čita taj niz natrag. Pri upitu od 512 tokena, premještanje dekvantizacije u grupirani GEMM povećalo je propusnost predpopunjavanja od kraja do kraja za 77,4% eliminacijom ovog privremenog upisa i čitanja.
Zadržite usmjeravanje stručnjaka na GPU-u
Grupirani GEMM zahtijeva da retci aktivacije dodijeljeni svakom stručnjaku budu pohranjeni zajedno. Nakon odabira osam stručnjaka po tokenu, histogram broji koliko je dodjela otišlo svakom stručnjaku. Prefiksno skeniranje pretvara te brojeve u početne pomake, korak raspršenja postavlja retke u njihove skupine stručnjaka, a karta blokova navodi matrične blokove fiksne veličine koje grupirani GEMM mora obraditi.
Optimizirani put drži cijeli ovaj slijed u jednom međuspremniku naredbi, uređenoj seriji GPU operacija, za svaki komad upita. Ablacija umjesto toga pauzira kako bi CPU mogao provjeriti međurezultate usmjeravanja i podnijeti sljedeću operaciju. Zadržavanje histograma i prefiksnog skeniranja na GPU-u dodaje dvije jezgre, ali uklanja CPU-GPU sinkronizaciju unutar svakog MoE sloja.
Pri upitu od 512 tokena, omogućavanje usmjeravanja rezidentnog na GPU-u povećalo je predpopunjavanje od kraja do kraja za 89%. Ovo također pokazuje zašto samo broj jezgri može zavarati: brža ruta pokreće više jezgri, ali nikada ne čeka CPU unutar sloja.
Uskladite veličinu pločice s opterećenjem stručnjaka
Pri upitu od 2K tokena, usmjeravanje svakog tokena na osam od 256 stručnjaka proizvodi 16.384 dodjele token-stručnjak, ili prosječno 64 retka aktivacije po stručnjaku. Stvarna raspodjela je neujednačena: neki stručnjaci primaju mnogo redaka, dok drugi primaju malo.
Grupirani GEMM dijeli izlaz svakog stručnjaka na pločice, koje su mali pravokutni blokovi izlaza množenja matrica. Svaka pločica je dodijeljena jednoj GPU grupi niti. Na GPU-ovima Apple silicona, grupa niti sadrži jednu ili više simdgrupa, od kojih se svaka sastoji od 32 niti koje izvršavaju instrukcije u sinkroniziranom koraku.
Veće pločice šire trošak postavljanja na više redaka i izlažu više paralelnog rada, ali dio velike pločice ostaje neaktivan kada stručnjak primi samo nekoliko redaka. Veličina pločice i broj simdgrupa stoga su povezani.
Ablacija fiksira pločicu na 16 redaka. Naspram te kontrole, omogućavanje pločice od 32 retka s četiri simdgrupe poboljšalo je predpopunjavanje od kraja do kraja za 13,2% pri 2K tokena.
Zadržite stanje ponavljanja na čipu
Tijekom predpopunjavanja, svaki Gated DeltaNet sloj skenira upit redom dok prenosi svoje stanje ponavljanja naprijed. S onemogućenom rezidencijom u registru, ablacija koristi blokovsko skeniranje. Pri upitu od 2K tokena, taj put premješta 256 MiB (mebibajta) stanja po sloju i više puta zaustavlja niti koje surađuju na barijerama, točkama sinkronizacije gdje sve sudjelujuće niti moraju čekati jedna drugu.
Stanje ponavljanja je matrica. Optimizirana jezgra dodjeljuje svaki stupac jednoj simdgrupi. Simdgrupa dijeli stupac među svojim nitima, jednom učitava stupac u njihove registre i prenosi stanje kroz cijelo skeniranje. Niti razmjenjuju međurezultate putem operacija simdgrupe umjesto memorije grupe niti, pohrane na čipu koja se dijeli među grupom niti. Dovršeno stanje se zapisuje natrag tek nakon skeniranja.
Stanje i njegov prolaz koriste 32-bitni format s pomičnim zarezom jer se male pogreške zaokruživanja zbrajaju kroz uzastopna ažuriranja. Aktivacije upita i ključeva ostaju u bfloat16.
Pri upitu od 2K tokena, omogućavanje skeniranja rezidentnog u registru poboljšalo je predpopunjavanje od kraja do kraja za 5,6%. GEMM-ovi stručnjaka činili su oko 90% vremena predpopunjavanja. Sekvencijalno skeniranje ne izlaže dovoljno radnog matrica za višekratnu upotrebu da bi imalo koristi od neuronskih akceleratora.
Ograničite privremenu memoriju dijeljenjem upita na komade
Izvođenje obrađuje dugi upit kao niz ograničenih komada umjesto da drži privremene podatke za svaki token upita u memoriji odjednom. Težine modela ostaju rezidentne u unificiranoj memoriji, dok stanje ponavljanja i KV predmemorija nose kontekst s jednog komada na sljedeći. Nijedan raniji kontekst nije odbačen.
Bez dijeljenja na komade, privremena polja aktivacije rastu s cijelim upitom i natječu se s težinama modela, stanjem ponavljanja i KV predmemorijom za unificiranu memoriju. Dijeljenje na komade drži samo privremene vrijednosti jednog segmenta aktivnima u isto vrijeme, a zatim oslobađa ili ponovno koristi tu pohranu prije obrade sljedećeg segmenta. Ovo ograničava vršnu radnu memoriju i omogućuje mehanizmu obradu duljih upita bez promjene izlaza modela.
Predpopunjavanje u komadima popularno je u mnogim mehanizmima i ključno je za posluživanje dugih putanja s više okreta u ovim okruženjima ograničenim memorijom. Ukupno vrijeme predpopunjavanja za slojeve pažnje ostaje kvadratno u odnosu na duljinu upita, s određenim dodatnim režimom od ponovljenih KV učitavanja ranijih komada.
Dekodiranje: minimizirajte bajtove premještene po tokenu
Dekodiranje paketa-1 obrađuje jedan po jedan novi redak. Uz malu ponovnu upotrebu težina, njegova propusnost uglavnom ovisi o tome koliko bajtova mehanizam premješta za svaki token. Promjene dekodiranja spadaju u četiri skupine: optimizirati put težine s jednim retkom, zadržati svaki korak na GPU-u, smanjiti promet međurezultata i stanja te učinkovito pročitati predmemoriju pažnje.
Optimizirajte put težine s jednim retkom
MLX već raspoređuje rad s jednim retkom na specijalizirane matrice-vektorske jezgre. Budući da Lily ne koristi MLX, prilagođeno izvođenje mora pružiti istu osnovnu strategiju. Naš red-paralelni GEMV dizajniran je za jedan redak aktivacije. Simdgrupa surađuje na izlazu dok paralelno čita različite dijelove matrice težina.
Zadržite svaki korak dekodiranja na GPU-u
Zadržite predaju tokena na GPU-u
Svaki korak dekodiranja završava odabirom sljedećeg tokena; sljedeći korak započinje s tim tokenom kao ulazom. Slanje odabira na CPU, a zatim natrag na GPU dodaje točku sinkronizacije svakom tokenu. Naše izvođenje umjesto toga izmjenjuje se između dva međuspremnika naredbi i dva utora za tokene rezidentna na GPU-u. GPU odabire token s najvećim rezultatom i upisuje njegov ID tokena izravno u ulazni utor za sljedeći korak dekodiranja, dok CPU priprema naknadni rad.
Preklopite neovisni GPU rad
U jednom zabilježenom koraku dekodiranja paketa-1, generiranje tokena pokrenulo je 795 GPU jezgri. Njihove su ovisnosti tvorile 555 sekvencijalnih faza, ostavljajući neke jezgre slobodnima za istovremeno pokretanje. Metalov serijski način izvršavanja ipak je pokrenuo svaku jezgru po redu.
Optimizirani put dekodiranja bilježi stvarne ovisnosti podataka u istovremenom Metal prolazu. Neovisna pokretanja jezgri mogu se izvoditi istovremeno kada GPU resursi to dopuštaju. Barijera se umeće samo kada kasniji rad zahtijeva raniji rezultat.
Smanjite promet međurezultata i stanja
Zasebne jezgre često materijaliziraju međureztulat: jedna jezgra zapisuje privremeni rezultat u memoriju, a sljedeća čita rezultat natrag. Optimizirani put dekodiranja spaja četiri lanca: dvije ulazne projekcije stručnjaka s njihovom aktivacijom s vratima; izlaznu projekciju stručnjaka s njenom ocjenom usmjeravanja i rezultatom dijeljenog stručnjaka; pripremu upita i ključeva prije pažnje; te ponavljajuće ažuriranje s njegovom normalizacijom. Svaka sjedinjena jezgra drži privremene vrijednosti u registrima umjesto da ih šalje kroz memoriju.
Fuzija također skraćuje graf ovisnosti: kada privremeni zapis nestane, nestaje i barijera koja je štitila njegovog potrošača.
Učinkovito čitanje predmemorije pažnje
Stopite čitanja predmemorije pažnje
Pažnja čita ključeve i vrijednosti iz KV predmemorije tijekom svakog koraka dekodiranja. U ablaciji, susjedne GPU niti ne zahtijevaju uvijek susjedne bajtove, prisiljavajući memorijski sustav da poslužuje više zasebnih transakcija. Omogućavanje stopljenih učitavanja čini da susjedne niti zahtijevaju susjedne bajtove kako bi hardver mogao kombinirati njihova čitanja.
Na konfiguraciji bfloat16, stapanje je povećalo širinu pojasa ključeva s 33,8 na 47,9 GB/s, povećalo širinu pojasa vrijednosti s 42,0 na 61,8 GB/s i poboljšalo dekodiranje od kraja do kraja za 2,1% pri kontekstu od 3.840 tokena.
Spakirajte glave upita za ponovnu upotrebu KV redaka
Pažnja s grupiranim upitima omogućuje osam glava upita da dijele jednu glavu ključ-vrijednost (KV). U ablaciji, svaka glava upita se izvodi u zasebnoj simdgrupi, tako da svih osam neovisno zahtijeva isti predmemorirani KV redak. Optimizirana jezgra pakira četiri glave upita u jednu grupu niti, koja učitava svaki KV redak jednom i ponovno ga koristi u četiri izračuna pažnje. Druga grupa niti upravlja preostale četiri glave.
Ova tehnika, koja se obično naziva GQA pakiranje, izvodi istu aritmetiku i proizvodi identične izlazne bajtove dok smanjuje osam neovisnih KV zahtjeva na dva dijeljena učitavanja. U usporedbi s neupakiranom ablacijom, poboljšala je propusnost dekodiranja od kraja do kraja za 23,8% pri kontekstu od 32K tokena.
Prebacivanje rasporeda pažnje pri dugim kontekstima
Svaki korak dekodiranja u sloju pune pažnje skenira postojeću KV predmemoriju. Raspored fiksnih blokova dijeli tu predmemoriju na jednake dijelove koje GPU može paralelno obrađivati. Njeno dodatno planiranje nije isplativo kada je predmemorija mala, ali raspored fiksnih blokova ravnomjernije uravnotežuje posao kako kontekst raste.
Za ovaj model, izvođenje drži opći put pažnje ispod 32K tokena i koristi put fiksnog bloka na 32K ili više. Prekidač se primjenjuje kada svaka glava ima 256 vrijednosti i osam glava upita dijele KV glavu; drugi oblici ostaju na općem putu. Ablacija onemogućuje ovaj prekidač i uvijek koristi opći put. Omogućavanje rute fiksnog bloka poboljšalo je dekodiranje od kraja do kraja za 7,7% pri 32K, 27,4% pri 64K i 40,2% pri 128K.
Ograničenja daljnje optimizacije
Neke su promjene poboljšale izoliranu operaciju, ali nisu poboljšale zaključivanje od kraja do kraja.
Spekulativno dekodiranje, koje koristi manji model za predlaganje tokena koje će cijeli model provjeriti, učinilo je dekodiranje paketa-1 18% sporijim. Verifikacija je obrađivala skupine od dva do pet redaka, neučinkovit oblik za ovaj hardver, a retci su često birali različite stručnjake, povećavajući količinu pročitanih podataka težina stručnjaka. Smanjenje izlaznog rječnika izrađivača poboljšalo je propusnost izrađivača za 4,7–5,1%, ali nije učinilo cijelu spekulativnu petlju bržom. Ovaj rezultat je specifičan za radno opterećenje: naše grupirano Qwen primjenjivanje na Blackwellu koristi spekulativno dekodiranje pod različitim uvjetima.
Ostali eksperimenti uključivali su smanjenje pokretanja GPU-a, preklapanje cijelih faza, korištenje većih pločica predpopunjavanja, primjenu šire fuzije, ubrzavanje usmjerivača i kombiniranje izlazne projekcije s odabirom tokena. Nijedan nije poboljšao cijelu petlju zaključivanja.
Mjerenja hardverskih ograničenja također su pokazala malo preostalog prostora u glavnim operacijama predpopunjavanja i dekodiranja. MoE GEMM-ovi dosegnuli su 97,9% i 90,3% najbržih održivih brzina čitanja težina za svoje uzorke pristupa. Uklanjanje aritmetike iz rijetkog GEMV-a promijenilo je propusnost za samo 0,2%, potvrđujući da su čitanja težina, a ne računanje, bili ograničavajući resurs. Množenje matrica predpopunjavanja slično je dosegnulo 93% teoretske granice matrice u izolaciji i 80–86% unutar testiranih modela.
Performanse od kraja do kraja
Usporedba od kraja do kraja učitava identične 4-bitne kontrolne točke u oba mehanizma i pokreće jedan zahtjev u isto vrijeme na jednom M5 Maxu s 40 jezgri i 128 GB. Unutar svakog kruga, dva mehanizma rade na izmjenični redoslijed kako bi se smanjila pristranost zbog pozadinskog opterećenja i promjena temperature čipa. Uspoređujemo s najbržim putem izravnog generiranja MLX-LM-a, a ne s njegovim poslužiteljem, tako da je mjerenje usmjereno na izvršavanje modela, a ne na režim posluživanja.
Pregled obuhvaća deset duljina upita za predpopunjavanje i deset duljina konteksta za dekodiranje, od 256 do 128K tokena. Propusnost predpopunjavanja prvo raste kako mehanizam širi fiksne troškove postavljanja na više tokena. Predpopunjavanje doseže vrhunac oko upita od 4K tokena, a zatim pada jer deset slojeva pune pažnje obavlja više posla kako upit raste. Dekodiranje ostaje gotovo ravno na kratkim kontekstima i opada jednom kada čitanje rastuće KV predmemorije postane značajno. Prilagođeni mehanizam je brži pri svakoj zabilježenoj duljini.
Budući da specijalizirano izvršavanje može promijeniti redoslijed operacija s pomičnim zarezom, također smo provjerili brojčanu dosljednost u odnosu na MLX-LM. U usporedbi s prisilnim navođenjem nastavnika, oba su mehanizma predvidjela sljedeći token iz istog referentnog prefiksa na svakoj od 192 pozicije, sprječavajući da ranije razlike utječu na kasniji unos. Lilyna zbunjenost bila je samo 0,04% viša i odabrala je isti najbolje ocijenjeni token na 96,35% testiranih pozicija.
Izgrađeno za lokalnu platformu
Apple silicon nije manji GPU u podatkovnom centru. To je kompletna lokalna platforma za zaključivanje sa svojim vlastitim hardverskim i softverskim karakteristikama. Unificirana memorija daje jednom čvoru vrlo visoku gornju granicu u pogledu količine modela i stanja koje može pohraniti. M5 neuronski akceleratori apsorbiraju težak rad s matricama u predpopunjavanju. Vektorske ALU jedinice upravljaju ostatkom s ograničenim pojasom propusnosti i niskom ponovnom upotrebom u dekodiranju.
Qwen dodaje dodatne prilike za specijalizaciju: zadržite usmjeravanje stručnjaka i stanje ponavljanja na GPU-u, eliminirajte nepotrebne međurezultate, preklopite neovisni rad, ponovno iskoristite dijeljene KV podatke i prilagodite jezgre obliku radnog opterećenja.
Uz optimizaciju specifičnu za model i platformu, jedan Mac može učinkovito pokrenuti veliki rijedak model. Budući rad proširit će pokrivenost na modele, čipove i radna opterećenja posluživanja te pretvoriti ovdje potvrđene mehanizme na jednoj konfiguraciji u općenitiju politiku izvođenja.
Širi princip je uskladiti mehanizam s arhitekturom modela i specifičnim putovima računanja i memorije hardvera. Kako modeli s otvorenim težinama i hardver napreduju, lokalno zaključivanje visoke performanse sve će se više oslanjati na mehanizme prilagođene objema stranama, umjesto na one koji apstrahiraju njihove razlike.
Citiranje
@online{perplexity2026OptimizingOnDeviceInferenceForAppleSilicon,
author = {{Perplexity} and Yibo Wu and Lequn Chen and Kevin Hu and Phi Hoang and Claire Beamer and Jeremy Yang and Denis Yarats},
title = {{Optimizing on-device inference for Apple Silicon}},
date = {2026-09-01},
url = {https://www.perplexity.ai/hub/blog/optimizing-on-device-inference-for-apple-silicon}
}