Seadmesisese järelduse optimeerimine Apple'i kiibile
Kohandatud kohalik mootor, mis parandab eeltöötluse ja dekodeerimise läbilaskevõimet.
Hübriidarvutus Apple siliconil korraldab ülesannet pilves oleva piiri peal oleva intelligentsuse ja Macis asuva kohaliku mudeli vahel. Pilvemudelid käsitlevad uurimistööd ja arutluskäiku, samas kui kohalik mudel töötab Macis privaatsete failide ja rakendustega.
Selle tööjaotuse sujuvaks tundmiseks peab kohalik järeldus ülejäänud ülesandega sammu pidama. See nõuab mootorit, mis suudab viipasid kiiresti töödelda ja säilitada kõrge tokeni genereerimise kiiruse.
Lily, meie kerge kohalik järeldusmootor, on ehitatud spetsiaalselt Apple'i kiibile ja Qwen3.6-35B-A3B jaoks, eraldi optimeeringutega eeltäiteks ja dekodeerimiseks. Eraldiseisev demo on avalikult saadaval GitHubis.
Sissejuhatus
Tavaline viis LLM-ide käitamiseks Macis on MLX abil, mis on Apple'i avatud lähtekoodiga masinõppe raamistik Apple siliconile. Selle kaasrakenduskogu MLX-LM lisab komponendid, mis on vajalikud teksti laadimiseks ja genereerimiseks mitmesuguste keelemudelitega. Koos pakuvad MLX ja MLX-LM valmis, üldotstarbelist virna kohalike LLM-ide järelduseks.
Qwen3.6-35B-A3B on hõre hübriidmudel: see kasutab ekspertide segu (MoE) marsruutimist ja ühendab fikseeritud suurusega korduvad olekud täieliku tähelepanuga. Need arhitektuurivalikud vähendavad vajalike arvutuste mahtu, kuid tekitavad ka ebaregulaarseid töökoormusi. Tokenid suunatakse erinevatele eksperdiraskustele ja korduvad olekud on oma olemuselt järjestikused.
MLX-LM valib juba optimeeritud kernelid järeldusfaaside ja tavaliste töökoormuse kujude jaoks, kuid selle korduvkasutatavad operatsioonid peavad toetama paljusid mudeliarhitektuure. Qwenile pühendatud mootor saab spetsialiseeruda mudeli ja käituskeskkonna tasemel, koordineerides kerneleid, andmeliikumist ja ajastamist mudeli fikseeritud struktuuri ümber.
Lily rakendab seda spetsialiseerumist lõpp-lõpuni ühes protsessis. Rusti käituskeskkond laadib mudeli kontrollpunkti ja haldab seansi olekut ja genereerimistsüklit, OpenAI-ga ühilduv vestluse lõpetamise API aktsepteerib päringuid ja voogedastab tokeneid ning kohandatud Metal kernelid täidavad Qwen-spetsiifilisi toiminguid. Täitmisteel ei ole ei PyTorch ega MLX.
Mõõdame eeltöötluse ja dekodeerimise jõudlust eraldi. Eeltöötluse läbilaskevõime jäädvustab, kui kiiresti mootor viipa töötleb; dekodeerimise läbilaskevõime jäädvustab, kui kiiresti see väljundtokeneid genereerib.
Mõõdame Qwen3.6-35B-A3B jõudlust ühel MacBook Pro’l, mida toidab M5 Max koos 40-tuumalise GPU ja 128 GB ühtse mäluga. Prefill’i ja decode’i jaoks kümnel prompti pikkusel ning kümnel konteksti pikkusel, vahemikus 256 kuni 128K tokenit (K = 1,024), saavutab mootor keskmiselt 1,22× MLX-LM-i prefill’i läbilaskevõimest ja 1,32× selle decode’i läbilaskevõimest. 4K-tokenilise prompti ja 4K-tokenilise decode’i konteksti korral jõuab kohandatud mootor 5,749.9 prefill-tokenini sekundis ja 186.6 decode-tokenini sekundis, võrreldes MLX-LM-i vastavalt 4,737.5 ja 140.9-ga. Mitme pöördega seansi jooksul kuhjuvad need ajasäästud iga täiendava mudelikutsungiga.
Järgmisena selgitame, kuidas Qweni arhitektuur loob Apple siliconil mudelispetsiifilisi optimeerimisvõimalusi. Seejärel teeme läbi sellest tulenevad eeltöötluse ja dekodeerimise muudatused. Samuti käsitleme seda, kus täiendav optimeerimine lakkab end ära tasumast, enne kui lõpetame lõpp-lõpuni võrdlusega MLX-LM-iga.
Qwen-spetsiifilised optimeerimisvõimalused Apple siliconil
Qwen loob kolm erinevat töökoormuse kuju
Qwen3.6-35B-A3B sisaldab 35 miljardit parameetrit, kuid aktiveerib iga tokeni jaoks ainult umbes 3 miljardit. Ruuter hindab 256 eksperdi alavõrku ja valib kaheksa, koos ühe jagatud eksperdiga, mis töötleb iga tokeni. See hõre MoE disain vähendab arvutust, kuid tekitab ebaühtlast tööd: eksperdid saavad erineva arvu tokeneid ja iga token nõuab raskusi erinevast ekspertide kombinatsioonist.
Qwen ühendab samuti 10 täieliku tähelepanu kihti 30 Gated DeltaNet kihiga. Need kaks kihatüüpi säilitavad varasemat teavet erinevatel viisidel.
Tähelepanukihtides kasutatakse rühmitatud päringu tähelepanu (GQA). Qwenil on 16 päringupead ja kaks võtme-väärtuse (KV) pead, kus kaheksa päringupead jagavad iga KV-pead. Jagamine muudab KV-vahemälu väiksemaks ja võimaldab vahemällu salvestatud andmeid päringupeade vahel taaskasutada. Vahemälu salvestab endiselt uusi võtmeid ja väärtusi iga tokeni jaoks, nii et iga dekodeerimisetapp loeb konteksti kasvades rohkem andmeid.
Gated DeltaNet tihendab selle asemel varasema teabe fikseeritud suurusega korduvaks olekuks. Õpitud värav kontrollib, kui palju olemasolevast olekust säilitada, samas kui delta värskendus sisaldab teavet praegusest tokenist. Mudel määratleb need värskendused korduvalt, nii et iga token sõltub eelneva tokeni toodetud olekust. Eeltöötluse ajal saab mootor siiski sama arvutust hinnata kahel viisil. See saab skannida läbi tokenite otse, kandes samal ajal olekut edasi, või korraldada värskendused ümber plokkideks, mis paljastavad rohkem maatriksoperatsioone ja tokeni tasemel paralleelsust. See, kumb lähenemine on kiirem, sõltub mudeli mõõtmetest, töökoormusest ja riistvarast.
Koos loovad need struktuurid kolm arvutusmustrit: ebaühtlased eksperdirühmad, tähelepanu kasvavale vahemälule ja fikseeritud suurusega kordus, mida saab hinnata otse või plokkidena.
Apple silicon pakub erinevate töökoormuste jaoks erinevaid teid
Eeltöötlus töötleb korraga palju viibatokeni aktiveerimisrida. Siin vaadeldud kohalik töökoormus dekodeerib tavaliselt ühte päringut korraga (partii 1) ja töötleb ühe uue rea sammu kohta. See erinevus muudab seda, kuidas samu mudeli raskusi kasutatakse. Eeltöötlus saab iga raskuste plokki taaskasutada sadade või tuhandete ridade ulatuses. Dekodeerimine seda suuremas osas ei saa, kuna iga uus token nõuab uut läbimist raskuste kaudu.
Apple silicon paigutab CPU ja GPU ühismälu taha, mis on ühine füüsiline mäluujur, mis on mõlemale juurdepääsetav. See võimaldab mudelil püsida residendina ilma eraldi GPU koopiat säilitamata, kuid see ei tee andmeliikumist tasuta. Raskuste ja vaheväärtuste lugemine tarbib endiselt mäluribalaiust, samas kui registrid ja muu kiibipõhine salvestusruum on kiiremad, kuid palju väiksemad.
M5 GPU pakub ka erinevaid arvutusteid. Eeltöötluse lineaarsed kihid kasutavad üldist maatriks-maatrikskorrutist (GEMM), rakendades raskusmaatriksit paljudele ridadele korraga. Ühilduvad GEMM-id saavad kasutada neurokiirendit igas GPU tuumas Metal 4 tensorioperatsioonide kaudu. Partii 1 dekodeerimine kasutab selle asemel üldist maatriks-vektorkorrutist (GEMV), rakendades samu raskusi ühele reale. Vähese raskuste taaskasutusega on GEMV piiratud peamiselt mäluribalaiusega ja sobib paremini GPU vektoraritmeetika loogikaüksustele (ALU) kui neurokiirenditele, mis on loodud suurema data taaskasutusega maatriksoperatsioonide jaoks.
Need täitmisteed ei ole Lily jaoks ainulaadsed. MLX töötab sama ühismälu kaudu ja valib optimeeritud maatriks- ja vektorernelid vastavalt töökoormuse kujule. MLX-LM-i Qweni rakendus rühmitab juba eksperditööd, hindab Gated DeltaNeti liidetud korduva Metal kerneli abil ja kasutab GQA-teadlikku tähelepanu. Need võimalused on jagatud lähtepunktiks tõhusaks Qweni järelduseks Apple siliconil.
Optimeerimisstrateegia
Lily kitsam ulatus võimaldab koordineerida neid jagatud täitmisteid Qwen'i täpse arhitektuuri ja mõõtmete ümber. See kasutab faasipõhiseid GPU-teid, kaardistab Qweni ekspertide, korduva ja tähelepanu töökoormuse andmeliikumise minimeerimiseks ning valib kernelid ja paigutused mõõdetud töökoormuse kuju järgi. Strateegial on kolm osa:
- Sobitage GPU tee järeldusfaasiga. Kasutage maatriksile orienteeritud täitmist, kui eeltöötlus saab raskusi paljude ridade vahel taaskasutada, ja vektorile orienteeritud täitmist, kui partii 1 dekodeerimine töötleb ühte rida korraga.
- Kaardistage Qweni struktuur GPU-le, minimeerides samal ajal andmeliikumist. Hoidke raskused pakituna kuni nende kasutamiseni, korraldage suunatud eksperditöö ilma CPU-le naasmata, säilitage Gated DeltaNeti olek kiibil läbi selle korduva skannimise ja taaskasutage rühmitatud päringu tähelepanu jagatud KV-andmeid.
- Kohandage kernelid töökoormuse kujuga. Valige igas faasis plaadi suurused, täitepaigutused ja tähelepanuteed saadaolevate ridade arvu, ridade jaotuse eksperditi, toimingu mõõtmete ja praeguse konteksti pikkuse põhjal.
Järgmised jaotised selgitavad neid valikuid. M5 Maxi sobitatud ablatsioonides hinnatud optimeerimiste puhul hindame nende mõjusid, võrreldes muidu identseid mootori konfiguratsioone, mis erinevad ainult uuritava optimeerimise poolest. Kuna need eksperimendid võrdlevad meie mootori versioone iseendaga, selgitavad need mehhanisme, mitte ei lagunda lõpptulemusi MLX-LM-i suhtes.
Eeltöötlus: taaskasutage raskusi ja hoidke marsruutimist GPU-l
Eeltöötlus paljastab palju tokeniridu korraga, kuid Qwen suunab need read eksperditi ebaühtlaselt ja värskendab korduvat olekut läbi jada. Selle optimeerimised jagunevad kolme rühma: korraldage hõre eksperditöö suunatud ridade ümber, hoidke Gated DeltaNeti skannimist kiibil ja jagage pikad viidad piiratud tükkideks.
Optimeerige hõredat eksperdiarvutust
Dekvantigeerige raskused maatrikskorrutise ajal
Qwen3.6-35B-A3B kontrollpunkt kasutab rühmapõhist afiinset 4-bitist kvantimist. Iga raskus salvestatakse 4-bitise täisarvukoodina, samas kui iga 64 raskuse rühm jagab bfloat16 skaalat ja nihet, mida kasutatakse selle väärtuste rekonstrueerimiseks. See vähendab 35 miljardi parameetriga mudeli umbes 70 GB bfloat16 raskustest 19,4 GB kontrollpunktiks, muutes mudeli Macis hoidmise praktiliseks.
Maatrikskorrutiseks kasutatav Metal 4 tensorioperatsioon tarbib bfloat16 operande pakitud 4-bitise esituse asemel. Enne korrutamist peab GPU raskused bfloat16-s rekonstrueerima. Lily optimeeritud rühmitatud GEMM teeb selle teisenduse ühe väikese raskusplaadi kaupa ja hoiab tulemust kiibipõhises lõimerühma mälus vaid seni, kuni see korrutatakse suunatud aktiveerimisridadega. Kogumiseks kasutatakse 32-bitist ujukoma ja väljund kirjutatakse bfloat16-s. Täielikku laiendatud raskuste massiivi ei looda ühismälus kunagi.
Ablatsioonis töötab dekvantigeerimine eraldi toiminguna: see laiendab 4-bitised raskused bfloat16 massiiviks ühismälus, mille järel maatrikskernel loeb selle massiivi tagasi. 512-tokenise viiba korral suurendas dekvantigeerimise viimine rühmitatud GEMM-i eeltöötluse läbilaskevõimet 77,4%, kõrvaldades selle vahepealse kirjutamise ja lugemise.
Hoidke ekspertide marsruutimist GPU-l
Rühmitatud GEMM nõuab, et igale eksperdile määratud aktiveerimisread salvestataks koos. Pärast kaheksa eksperdi valimist tokeni kohta loeb histogramm, mitu määramist igale eksperdile läks. Eesliite skannimine muudab need loendused algusniheteks, hajutamissamm paigutab read nende eksperdirühmadesse ja plokikaart loetleb fikseeritud suurusega maatriksplokid, mida rühmitatud GEMM peab töötlema.
Optimeeritud tee hoiab kogu seda jada ühes käskpuhvris, mis on GPU toimingute tellitud partii, iga viibatüki jaoks. Ablatsioon teeb selle asemel pausi, et CPU saaks kontrollida marsruutimise vaheühendeid ja esitada järgmise toimingu. Histogrammi ja eesliite skannimise hoidmine GPU-s lisab kaks kerneleid, kuid eemaldab CPU–GPU sünkroonimise igas MoE kihis.
512-tokenise viiba korral suurendas GPU-residente marsruutimise lubamine lõpp-lõpuni eeltöötlust 89%. See näitab ka seda, miks kerneli arv üksi võib eksitada: kiirem tee käivitab rohkem kerneleid, kuid ei oota kihi sees kunagi CPU-d.
Sobitage plaadi suurus eksperdi koormusega
2K-tokenise viiba korral annab iga tokeni suunamine kaheksale 256 eksperdist 16 384 tokeni-eksperdi määramist ehk keskmiselt 64 aktiveerimisrida eksperdi kohta. Tegelik jaotus on ebaühtlane: mõned eksperdid saavad palju ridu, teised aga vähe.
Rühmitatud GEMM jagab iga eksperdi väljundi plaatideks, mis on maatrikskorrutise väljundi väikesed ristkülikukujulised plokid. Iga plaat määratakse ühele GPU lõimerühmale. Apple siliconi GPU-del sisaldab lõimerühm ühte või mitut simd-rühma, millest igaüks koosneb 32 lõimest, mis täidavad juhiseid sünkroonselt.
Suuremad plaadid jaotavad seadistuskulud rohkemate ridade vahel ja paljastavad rohkem paralleelset tööd, kuid osa suurest plaadist jääb jõude, kui ekspert saab ainult mõned read. Plaadi suurus ja simd-rühmade arv on seega seotud.
Ablatsioon fikseerib plaadi 16 reale. Selle kontrolli vastu parandas 32-realise plaadi lubamine nelja simd-rühmaga lõpp-lõpuni eeltöötlust 13,2% 2K tokeni juures.
Hoidke korduvat olekut kiibil
Eeltöötluse ajal skannib iga Gated DeltaNeti kiht viipa järjest, kandes samal ajal oma korduvat olekut edasi. Ilma registriresidentsuseta kasutab ablatsioon plokipõhist skannimist. 2K-tokenise viiba korral liigutab see tee 256 MiB (mebibaiti) olekut kihi kohta ja peatab korduvalt koostööd tegevad lõimed tõketel, sünkroonimispunktidel, kus kõik osalevad lõimed peavad üksteist ootama.
Korduv olek on maatriks. Optimeeritud kernel määrab iga veeru ühele simd-rühmale. Simd-rühm jagab veeru oma lõimede vahel, laadib veeru nende registritesse ühekorra ja kannab olekut läbi kogu skannimise. Lõimed vahetavad vahetulemusi simd-rühma operatsioonide kaudu, mitte lõimerühma mälu, kiibipõhise salvestusruumi kaudu, mida jagatakse lõimerühma vahel. Lõpetatud olek kirjutatakse tagasi alles pärast skannimist.
Olek ja selle värav kasutavad 32-bitist ujukomaformaati, kuna väikesed ümardusvead liituvad järjestikuste värskenduste käigus. Päringu ja võtme aktiveerimised jäävad bfloat16-sse.
2K-tokenise viiba korral parandas registris residentse skannimise lubamine lõpp-lõpuni eeltöötlust 5,6%. Eksperdi GEMM-id moodustasid umbes 90% eeltöötlusajast. Järjestikune skannimine ei paljasta piisavalt korduvkasutatavat maatriksitööd, et neurokiirenditest kasu saada.
Piirake ajutist mälu viibaplokkidena
Käituskeskkond töötleb pika viiba piiratud tükkide jadana, selle heaks, et hoida ajutisi andmeid iga viibatokeni jaoks mälus korraga. Mudeli raskused jäävad ühismällu püsima, samas kui korduv olek ja KV-vahemälu kannavad konteksti ühest tükist teise. Varasemat konteksti ei visata ära.
Ilma tükeldamiseta kasvavad ajutised aktiveerimismassiivid täieliku viibaga ja konkureerivad ühismälu nimel mudeli raskuste, korduva oleku ja KV-vahemäluga. Tükeldamine hoiab korraga aktiivsena ainult ühe segmendi ajutisi väärtusi, vabastades või taaskasutades selle salvestusruumi enne järgmise segmendi töötlemist. See seab piirangu tipus olevale töömälule ja võimaldab mootoril töödelda pikemaid viipasid ilma mudeli väljundit muutmata.
Tükeldatud eeltöötlus on paljudes mootorites populaarne ja on ülioluline pika mitme pöördega trajektooride teenindamiseks nendes mälupiirangutega keskkondades. Tähelepanukihtide eeltöötluse koguaeg jääb viiba pikkuse suhtes ruutvõrrandiks, mõningase lisakuluga varasemate tükkide korduvatest KV-laadimistest.
Dekodeerimine: viige iga tokeni kohta liigutatud baidid miinimumini
Partii 1 dekodeerimine töötleb ühte uut rida korraga. Vähese raskuste taaskasutusega sõltub selle läbilaskevõime peamiselt sellest, kui palju baite mootor iga tokeni jaoks liigutab. Dekodeerimise muudatused jagunevad nelja rühma: optimeerige üherealist raskuste teed, hoidke iga sammu GPU-l, vähendage vahepealset ja olekuliiklust ning lugege tähelepanu vahemälu tõhusalt.
Optimeerige üherealist raskuste teed
MLX saadab juba üherealise töö spetsialiseeritud maatriks-vektorernelitele. Kuna Lily ei kasuta MLX-i, peab kohandatud käituskeskkond pakkuma sama põhistrateegiat. Meie reaparalleelne GEMV on loodud ühe aktiveerimisrea jaoks. Simd-rühm teeb väljundi osas koostööd, lugedes samal ajal raskuste maatriksi erinevaid osi paralleelselt.
Hoidke iga dekodeerimisetapp GPU-l
Hoidke tokeni üleandmist GPU-l
Iga dekodeerimisetapp lõpeb järgmise tokeni valimisega; järgmine etapp algab selle tokeni sisendina. Valiku saatmine CPU-le ja seejärel tagasi GPU-le lisab igale tokenile sünkroonimispunkti. Meie käituskeskkond vaheldub selle asemel kahe käskpuhvri ja kahe GPU-residente tokeni pesa vahel. GPU valib kõrgeima skooriga tokeni ja kirjutab selle tokeni ID otse järgmise dekodeerimisetapi sisendpesasse, samas kui CPU valmistab ette järgnevat tööd.
Kattuvad sõltumatud GPU tööd
Ühes salvestatud partii 1 dekodeerimisetapis käivitas tokeni genereerimine 795 GPU kerneleid. Nende sõltuvused moodustasid 555 järjestikust etappi, jättes mõned kernelid vabaks samaaegselt töötama. Metalli järjestikuse täitmise režiim käivitas sellegipoolest iga kerneli järjekorras.
Optimeeritud dekodeerimustee salvestab tegelikud andmesõltuvused samaaegses Metalli läbimises. Sõltumatud kerneli käivitamised võivad töötada samal ajal, kui GPU ressursid seda lubavad. Tõke sisestatakse ainult siis, kui hilisem töö nõuab varasemat tulemust.
Vähendage vahepealset ja olekuliiklust
Eraldi kernelid materialiseerivad sageli vaheühendi: üks kernel kirjutab ajutise tulemuse mällu ja järgmine loeb tulemuse tagasi. Optimeeritud dekodeerimustee liidab neli ahelat: kaks eksperdi sisendprojektsiooni koos nende väravaga aktiveerimisega; eksperdi väljundi projektsiooni koos selle marsruutimisskoori ja jagatud eksperdi tulemusega; päringu ja võtme ettevalmistust enne tähelepanu; ning korduvat värskendust koos selle normaliseerimisega. Iga liidetud kernel hoiab ajutisi väärtusi registrites, selle asemel et neid läbi mälu saata.
Liitmine lühendab ka sõltuvusgraafikut: kui vahepealne kirjutus kaob, kaob ka tõke, mis kaitses selle tarbijat.
Lugege tähelepanu vahemälu tõhusalt
Ühendage tähelepanu vahemälu lugemised
Tähelepanu loeb võtmeid ja väärtusi KV-vahemälust iga dekodeerimisetapi ajal. Ablatsioonis ei taotle naabruses asuvad GPU lõimed alati naaberbaite, sundides mälusüsteemi teenindama rohkem eraldi tehinguid. Ühendatud laadimiste lubamine paneb külgnevad lõimed taotlema külgnevaid baite, et riistvara saaks nende lugemisi kombineerida.
Bfloat16 konfiguratsioonis suurendas ühendamine võtme ribalaiust 33,8-lt 47,9 GB/s-ni, väärtuse ribalaiust 42,0-lt 61,8 GB/s-ni ja parandas lõpp-lõpuni dekodeerimist 2,1% 3840-tokenise konteksti juures.
Pakkige päringupead KV-ridade taaskasutamiseks
Rühmitatud päringu tähelepanu võimaldab kaheksal päringupeal jagada ühte KV-pead. Ablatsioonis töötab iga päringupea eraldi simd-rühmas, nii et kõik kaheksa taotlevad iseseisvalt sama vahemällu salvestatud KV-rida. Optimeeritud kernel pakub neli päringupead ühte lõimerühma, mis laadib iga KV-rida üks kord ja taaskasutab seda neljas tähelepanuarvutuses. Teine lõimerühm haldab ülejäänud nelja pead.
See tehnikat, mida tavaliselt nimetatakse GQA pakkimiseks, teeb sama aritmeetikat ja toodab identseid väljundbaite, vähendades samal ajal kaheksa sõltumatut KV-taotlust kaheks jagatud laadimiseks. Pakkimata ablatsiooni vastu parandas see lõpp-lõpuni dekodeerimise läbilaskevõimet 23,8% 32K-tokenise konteksti juures.
Lülitage pikkade kontekstide korral tähelepanu paigutusi
Iga dekodeerimisetapp täieliku tähelepanu kihis skannib olemasolevat KV-vahemälu. Fikseeritud ploki paigutus jagab selle vahemälu võrdseteks osadeks, mida GPU saab paralleelselt töödelda. Selle täiendav ajastamine ei ole väärt, kui vahemälu on väike, kuid fikseeritud ploki paigutus tasakaalustab tööd ühtlasemalt konteksti kasvades.
Selle mudeli jaoks hoiab käituskeskkond üldise tähelepanu tee alla 32K tokeni ja kasutab fikseeritud ploki teed 32K või pikema puhul. Lülitus kehtib siis, kui igal peal on 256 väärtust ja kaheksa päringupead jagavad KV-pead; muud kujud jäävad üldisele teele. Ablatsioon keelab selle lüliti ja kasutab alati üldist teed. Fikseeritud ploki marsruudi lubamine parandas lõpp-lõpuni dekodeerimist 7,7% 32K juures, 27,4% 64K juures ja 40,2% 128K juures.
Edasise optimeerimise piirid
Mõned muudatused parandasid isoleeritud toimingut, kuid ei parandanud lõpp-lõpuni järeldust.
Spekulatiivne dekodeerimine, mis kasutab väiksemat mudelit tokenite pakkumiseks täielikule mudelile kontrollimiseks, muutis partii 1 dekodeerimise 18% aeglasemaks. Kontrollimine töötles kahe kuni viie rea rühmi, mis on selle riistvara jaoks ebatõhus kuju, ja read valisid sageli erinevaid eksperte, suurendades loetud eksperdi raskuste andmete hulka. Koostaja väljundsõnavara vähendamine parandas koostaja läbilaskevõimet 4,7–5,1%, kuid ei teinud täielikku spekulatiivset tsüklit kiiremaks. See tulemus on töökoormuspõhine: meie partii Qweni juurutus Blackwellil kasutab spekulatiivset dekodeerimist erinevatel tingimustel.
Muud eksperimendid hõlmasid GPU käivitamiste vähendamist, tervete faaside katmist, suuremate eeltöötlusplaatide kasutamist, laiema liitmise rakendamist, ruuteri kiirendamist ja väljundi projektsiooni ühendamist tokeni valikuga. Ükski neist ei parandanud täielikku järeldustsüklit.
Riistvarapiirangute mõõtmised näitasid samuti vähe järelejäänud pearuumi peamistes eeltöötluse ja dekodeerimise toimingutes. MoE GEMM-id ja GEMV-d jõudsid 97,9% ja 90,3%-ni kiireimatest püsivatest raskuste lugemise määradest oma juurdepääsumustrite jaoks. Aritmeetika eemaldamine hõredast GEMV-st muutis läbilaskevõimet vaid 0,2%, mis kinnitab, et piiravaks ressursiks olid raskuste lugemised, mitte arvutused. Eeltöötluse maatrikskorrutis saavutas sarnaselt 93% teoreetilisest maatriksipiirist isoleeritult ja 80–86% testitud mudelites.
Lõpp-lõpuni jõudlus
Lõpp-lõpuni võrdlus laeb mõlemas mootoris identsed 4-bitised kontrollpunkti baidid ja käitab ühte päringut korraga ühel 40-tuumalisel, 128 GB M5 Maxil. Iga vooru raames töötavad kaks mootorit vaheldumisi, et vähendada taustakoormuse ja kiibi temperatuuri muutuste põhjustatud eelarvamusi. Võrdleme MLX-LM-i kiireima otsegeneratsiooni teega, mitte selle serveriga, nii et mõõtmine keskendub mudeli täitmisele, mitte teenindusülevaatusele.
Läbivaatus hõlmab kümmet viiba pikkust eeltöötluse jaoks ja kümmet konteksti pikkust dekodeerimise jaoks, alates 256-st kuni 128K tokenini. Eeltöötluse läbilaskevõime tõuseb esialgu, kuna mootor jaotab fikseeritud seadistuskulud rohkemate tokenite vahel. Eeltöötlus saavutab haripunkti umbes 4K-tokenise viiba juures, seejärel langeb, kuna kümme täieliku tähelepanu kihti teevad viiba kasvades rohkem tööd. Dekodeerimine jääb lühikestes kontekstides peaaegu tasaseks ja langeb pärast kasvava KV-vahemälu lugemise muutumist oluliseks. Kohandatud mootor on kiirem igal registreeritud pikkusel.
Kuna spetsialiseeritud täitmine võib muuta ujukomaoperatsioonide järjekorda, kontrollisime ka numbrilist järjepidevust MLX-LM-i suhtes. Õpetaja sunnitud võrdluses ennustasid mõlemad mootorid järgmise tokeni samast viiteeesliitest igas 192 positsioonis, vältides varasemate erinevuste mõjutamist hilisematele sisenditele. Lily perplexity oli vaid 0,04% kõrgem ja see valis sama kõrgeima asetusega tokeni 96,35%-l testitud positsioonidest.
Ehitatud kohaliku platvormi jaoks
Apple silicon ei ole väiksem andmekeskuse GPU. See on täielik kohalik järeldusplatvorm oma riist- ja tarkvaraomadustega. Ühismälu annab ühele sõlmele väga kõrge lae sellele, kui palju mudelit ja olekut see mahutada suudab. M5 neurokiirendid neelavad eeltöötluses tiheda maatriksitöö. Vektori ALU-d haldavad dekodeerimisel ribalaiusega seotud, madala taaskasutusega ülejääki.
Qwen lisab täiendavaid võimalusi spetsialiseerumiseks: hoidke ekspertide marsruutimist ja korduvat olekut GPU-l, kõrvaldage mittevajalikud vaheühendid, katke sõltumatu töö, taaskasutage jagatud KV-andmeid ja kohandage kernelid töökoormuse kujuga.
Mudeli- ja platvormispetsiifilise optimeerimisega saab üks Mac käitada suurt hõredat mudelit tõhusalt. Tulevane töö laiendab katvust erinevate mudelite, kiipide ja teenindustöökoormuste vahel ning muudab siin ühel konfiguratsioonil kinnitatud mehhanismid üldisemaks käituskeskkonna poliitikaks.
Laiem põhimõte on sobitada mootor nii mudeli arhitektuuri kui ka riistvara spetsiifiliste arvutus- ja mäluteedega. Piiri peal olevate avatud kaaluga mudelite ja riistvara arenedes sõltub suure jõudlusega kohalik järeldus üha enam mootoritest, mis on kohandatud mõlemale, mitte neist, mis nende erinevused abstraktselt kõrvaldavad.
Tsitaat
@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}
}