Trumpas atsakymas: norint optimizuoti dirbtinio intelekto modelius, pasirinkite vieną pagrindinį apribojimą (vėlavimo laiką, kainą, atmintį, kokybę, stabilumą arba pralaidumą), tada prieš ką nors keisdami užfiksuokite patikimą bazinį lygį. Pirmiausia pašalinkite gamybos srauto kliūtis, tada pritaikykite mažos rizikos veiksnius, pvz., mišrų tikslumą ir paketavimą; jei kokybė išlieka, pereikite prie kompiliatoriaus / vykdymo laiko įrankių ir tik tada, kai reikia, sumažinkite modelio dydį kiekybiškai arba distiliuodami.
Svarbiausios išvados:
Apribojimas : pasirinkite vieną ar du tikslinius rodiklius; optimizavimas yra kompromisų, o ne nemokamų pergalių, laukas.
Matavimas : profiliuokite realius darbo krūvius su p50/p95/p99, pralaidumu, panaudojimu ir atminties pikais.
Vamzdynas : prieš liečiant modelį, ištaisykite žetonų iššifravimą, duomenų įkėlimo programas, išankstinį apdorojimą ir paketavimą.
Pateikimas : naudokite talpyklą, sąmoningą paketavimą, lygiagretumo derinimą ir atidžiai stebėkite uodegos delsą.
Apsauginiai turėklai : po kiekvieno našumo pakeitimo paleiskite auksinius raginimus, užduočių metriką ir atsitiktinius patikrinimus.

🔗 Kaip efektyviai įvertinti dirbtinio intelekto modelius.
Pagrindiniai kriterijai ir žingsniai, skirti modeliams teisingai ir patikimai įvertinti.
🔗 Kaip išmatuoti dirbtinio intelekto našumą naudojant realius rodiklius.
Palyginimui naudokite etalonus, delsos laiką, kainą ir kokybės signalus.
🔗 Kaip išbandyti dirbtinio intelekto modelius prieš pradedant gamybą.
Praktinis testavimo procesas: duomenų skaidymas, streso atvejai ir stebėjimas.
🔗 Kaip naudoti dirbtinį intelektą turiniui kurti.
Greičiau paverskite idėjas juodraščiais naudodami struktūrizuotus raginimus ir iteraciją.
1) Ką „Optimizuoti“ reiškia praktiškai (nes kiekvienas tai naudoja skirtingai) 🧠
Kai žmonės sako „optimizuoti dirbtinio intelekto modelį“, jie gali turėti omenyje:
-
Padarykite jį greitesnį (mažesnis delsos laikas)
-
Pigiau (mažiau GPU valandų, mažesnės išlaidos debesijos technologijoms)
-
Sumažinkite (atminties naudojimas, diegimas periferiniuose tinkluose)
-
Padarykite jį tikslesnį (pagerinkite kokybę, sumažinkite haliucinacijų skaičių)
-
Padaryti jį stabilesnį (mažiau dispersijos, mažiau gedimų gamyboje)
-
Palengvinti aptarnavimą (pralaidumas, paketavimas, nuspėjamas našumas)
Štai šiek tiek erzinanti tiesa: negalite visų šių dalykų maksimaliai išnaudoti vienu metu. Optimizavimas yra tarsi baliono suspaudimas – įstumiate vieną pusę, o kita iššoka. Ne visada, bet pakankamai dažnai, kad turėtumėte planuoti kompromisus.
Taigi, prieš ką nors paliesdami, pasirinkite pagrindinį apribojimą :
-
Jei aptarnaujate vartotojus tiesiogiai, jums rūpi p95 delsa ( AWS CloudWatch procentiliai ) ir uodegos našumas ( „uodegos delsos“ geriausia praktika ) 📉
-
Jei mokotės, jums rūpi kokybės pasiekimo laikas ir GPU panaudojimas 🔥
-
Jei diegiate įrenginiuose, jums rūpi RAM ir galia 🔋
2) Kaip atrodo gera dirbtinio intelekto modelių optimizavimo versija ✅
Geras optimizavimo variantas nėra tiesiog „pritaikyti kvantavimą ir melstis“. Tai sistema. Geriausios konfigūracijos paprastai turi:
-
Patikimas atskaitos taškas.
Jei negalite atkurti dabartinių rezultatų, negalite žinoti, kad ką nors pagerinote. Paprasta... bet žmonės tai praleidžia. Tada jie suklumpa. -
Aiškus tikslinis rodiklis
„Greitesnis“ yra miglotas. „Sumažinti p95 delsą nuo 900 ms iki 300 ms išlaikant tą patį kokybės balą“ yra realus tikslas. -
Kokybės apsaugos priemonės.
Kiekviena našumo pergalė rizikuoja tyliu kokybės nuosmukiu. Jums reikia testų, vertinimų ar bent jau sveiko proto rinkinio. -
Aparatinės įrangos suvokimas.
„Greitas“ modelis viename GPU gali nuskaityti kitame. CPU yra savotiškas chaosas. -
Iteraciniai pakeitimai, o ne staigus perrašymas.
Kai vienu metu pakeičiate penkis dalykus ir našumas pagerėja, nežinote, kodėl. O tai... kelia nerimą.
Optimizavimas turėtų jaustis kaip gitaros derinimas – nedideli pakeitimai, atidžiai klausykis, kartok 🎸. Jei jautiesi kaip žongliravimas peiliais, kažkas negerai.
3) Palyginimo lentelė: populiarios dirbtinio intelekto modelių optimizavimo parinktys 📊
Žemiau pateikiama trumpa ir šiek tiek netvarkinga dažniausiai naudojamų optimizavimo įrankių / metodų palyginimo lentelė. Ne, ji nėra visiškai „sąžininga“ – realus gyvenimas taip pat nėra.
| Įrankis / parinktis | Auditorija | Kaina | Kodėl tai veikia |
|---|---|---|---|
„PyTorch“ torch.compile ( PyTorch dokumentacija ) |
PyTorch žmonės | Nemokama | Grafų fiksavimas ir kompiliavimo gudrybės gali sumažinti išlaidas... kartais tai magija ✨ |
| ONNX vykdymo aplinka ( ONNX vykdymo aplinkos dokumentai ) | Dislokavimo komandos | Laisvas | Stiprus išvadų optimizavimas, platus palaikymas, tinka standartizuotam pateikimui |
| „TensorRT“ ( NVIDIA „TensorRT“ dokumentai ) | NVIDIA diegimas | Mokamos vibracijos (dažnai įtraukiamos į paketus) | Agresyvus branduolių suliejimas + tikslus valdymas, labai greitas spragtelėjus |
| „DeepSpeed“ ( ZeRO dokumentai ) | Mokymo komandos | Nemokama | Atminties ir pralaidumo optimizavimas (ZeRO ir kt.). Gali jaustis kaip reaktyvinis variklis |
| FSDP (PyTorch) ( PyTorch FSDP dokumentai ) | Mokymo komandos | Nemokama | Shards parametrai / gradientai, todėl dideli modeliai tampa mažiau bauginantys |
| bitų ir baitų kvantavimas ( bitai ir baitai ) | LLM meistrai | Nemokama | Mažas bitų svoris, didžiulės atminties santaupos – kokybė priklauso nuo aplinkybių, bet vau 😬 |
| Distiliavimas ( Hinton ir kt., 2015 ) | Produktų komandos | „Laiko sąnaudos“ | Mažesnis studentų modelis paveldi elgseną, paprastai užtikrina geriausią ilgalaikę investicijų grąžą |
| Genėjimas ( PyTorch genėjimo pamoka ) | Tyrimai + produkcija | Nemokama | Pašalina nereikalingą svorį. Veikia geriau, kai derinama su perkvalifikavimu |
| „Flash Attention“ / sulieti branduoliai ( „FlashAttention“ popierius ) | Spektaklio entuziastai | Nemokama | Greitesnis dėmesys, geresnė atmintis. Tikra pergalė transformeriams |
| „Triton“ išvadų serveris ( dinaminis paketavimas ) | Operacijos / infrastruktūra | Nemokama | Gamybos aptarnavimas, partijų apdorojimas, kelių modelių srautai – atrodo, kad tai įmonės lygio procesas |
Formatavimo keistenybės prisipažinimas: „Kaina“ yra netvarkinga, nes atvirojo kodo programinė įranga vis tiek gali kainuoti savaitgalį derinimo, o tai yra... kaina. 😵💫
4) Pradėkite nuo matavimo: kurkite profilį tokį, kokio norite 🔍
Jei iš viso šio vadovo darote tik vieną dalyką, darykite tai: tinkamai išmatuokite.
Mano paties bandymuose didžiausi „optimizavimo proveržiai“ atsirado atradus kažką gėdingai paprasto, pavyzdžiui:
-
duomenų įkroviklis apkrauna GPU
-
CPU išankstinio apdorojimo kliūtis
-
maži partijų dydžiai, dėl kurių padidėja branduolio paleidimo išlaidos
-
lėtas tokenizavimas (tokenizatoriai gali būti tylūs piktadariai)
-
atminties fragmentacija ( PyTorch CUDA atminties paskirstytojo pastabos )
-
vieno sluoksnio dominuojantis skaičiavimas
Ką matuoti (minimalus rinkinys)
-
Latencija (p50, p95, p99) ( SRE latencijos procentilėse )
-
Pralaidumas (žetonai/sek., užklausos/sek.)
-
GPU panaudojimas (skaičiavimas + atmintis)
-
VRAM / RAM piko vertės
-
Kaina už 1 tūkst. žetonų (arba už išvadą)
Praktinis profiliavimo mąstymas
-
Aprašykite vieną jums rūpimą scenarijų (ne žaislo tema).
-
Viską užsirašykite mažame „perf žurnale“.
Taip, tai nuobodu... bet tai apsaugo jus nuo vėlesnio savęs apgaudinėjimo.
(Jei norite pradėti nuo konkretaus įrankio: dažniausiai pasitaikantys įtariamieji yra „PyTorch Profiler“ ( „torch.profiler“ dokumentacija ) ir „Nsight Systems“ ( „NVIDIA Nsight Systems
5) Duomenys + Treniruočių optimizavimas: Tylioji supergalia 📦🚀
Žmonės pernelyg susitelkia ties modelių architektūra ir pamiršta apie patį konvejerį. Tuo tarpu šis tyliai sunaudoja pusę GPU.
Lengvos pergalės, kurios pasirodo greitai
-
Naudokite mišrų tikslumą (FP16/BF16, kur stabilus) ( PyTorch AMP / torch.amp ).
Paprastai greičiau, dažnai gerai, bet atkreipkite dėmesį į skaitinius trūkumus. -
Gradiento kaupimas , kai partijos dydis yra ribotas ( 🤗 Pagreitinimo vadovas )
Išlaiko optimizavimo stabilumą neišnaudojant atminties. -
Gradiento kontrolinis taškas ( torch.utils.checkpoint ).
Pakeičia skaičiavimo pajėgumus į atmintį – leidžia naudoti didesnius kontekstus. -
Efektyvus tokenizavimas ( 🤗 Tokenizatoriai ).
Tokenizavimas gali tapti kliūtimi dideliu mastu. Tai ne žavinga, o svarbu. -
Duomenų įkėlimo įrenginio derinimas.
Daugiau darbuotojų, prisegta atmintis, išankstinis įkėlimas – negražu, bet efektyvu 😴➡️💪 ( „PyTorch“ našumo derinimo vadovas )
Tikslus parametrų derinimas
Jei tiksliai derinate didelius modelius, PEFT metodai (pvz., LoRA stiliaus adapteriai) gali gerokai sumažinti mokymo išlaidas, tuo pačiu išlikdami stebėtinai patikimi ( 🤗 „Transformers PEFT“ vadovas , LoRA straipsnis ). Tai vienas iš tų momentų, kai kyla klausimas „kodėl mes to nepadarėme anksčiau?“.
6) Architektūros lygio optimizavimas: tinkamo dydžio modelis 🧩
Kartais geriausias būdas optimizuoti yra... nustoti naudoti per didelį modelį. Žinau, šventvagystė 😄.
Paskambinkite atlikdami kelis pagrindinius veiksmus:
-
Nuspręskite, ar jums reikia visiško bendrosios žvalgybos išsilavinimo, ar specialisto.
-
Kontekstinio lango dydį palaikykite tokį, kokio reikia, o ne didesnį.
-
Naudokite konkrečiam darbui parengtą modelį (klasifikavimo modelius klasifikavimo darbui ir pan.).
Praktinės tinkamo dydžio strategijos
-
Daugumai užklausų
perjunkite į mažesnį magistralinį tinklą. Tada „sunkias užklausas“ nukreipkite į didesnį modelį. -
Naudokite dviejų etapų nustatymą.
Greiti modelio juodraščiai, geresni modelio patikrinimai arba redagavimai.
Tai tarsi rašymas su išrankiu draugu – erzina, bet efektyvu. -
Sumažinkite išvesties ilgį.
Išvesties žetonai kainuoja pinigus ir laiką. Jei jūsų modelis klaidžioja, jūs mokate už tą klaidžiojimą.
Mačiau, kaip komandos smarkiai sumažino išlaidas, taikydamos trumpesnius rezultatus. Atrodo, kad tai smulkmena, bet veikia.
7) Kompiliatoriaus + grafikų optimizavimas: iš kur kyla greitis 🏎️
Tai yra sluoksnis „priversti kompiuterį atlikti protingesnius kompiuterinius darbus“.
Įprasti metodai:
-
Operatoriaus suliejimas (branduolių sujungimas) ( „NVIDIA TensorRT“ „sluoksnių suliejimas“ )
-
Pastovus lankstymas (fiksuotų verčių išankstinis apskaičiavimas) ( ONNX vykdymo laiko grafikų optimizavimas )
-
Branduolio pasirinkimas suderintas su aparatine įranga
-
Grafų fiksavimas siekiant sumažinti Python sąnaudas (
torch.compileapžvalga )
Paprastai tariant: jūsų modelis gali būti greitas matematiškai, bet lėtas operaciškai. Kompiliatoriai iš dalies tai ištaiso.
Praktiniai patarimai (dar žinomi kaip randai)
-
Šie optimizavimai gali būti jautrūs modelio formos pokyčiams.
-
Kai kurie modeliai labai pagreitėja, kiti vos pajuda.
-
Kartais pasitaiko pagreitėjimas ir mįslinga klaida – tarsi įsikraustė gremlinas 🧌
Vis dėlto, kai tai veikia, tai viena švariausių pergalių.
8) Kvantavimas, genėjimas, distiliavimas: mažesnis be verkimo (per daug) 🪓📉
Štai tokios skilties žmonės nori... nes tai skamba kaip nemokamas pasirodymas. Gali būti, bet į tai reikia žiūrėti kaip į operaciją.
Kvantavimas (mažesnio tikslumo svoriai / aktyvacijos)
-
Puikiai tinka išvadų darymo greičiui ir atminčiai
-
Rizika: kokybė krenta, ypač kraštutiniais atvejais
-
Geriausia praktika: vertinkite naudodami realų testų rinkinį, o ne vibracijas
Įprasti skoniai, apie kuriuos išgirsite:
-
INT8 (dažnai kietas) ( TensorRT kvantiniai tipai )
-
INT4 / žemas bitų skaičius (didelės santaupos, kokybės rizika didėja) ( bitų ir baitų k bitų kvantavimas )
-
Mišrus kiekybinis (ne viskam reikalingas vienodas tikslumas)
Genėjimas (parametrų pašalinimas)
-
Pašalina „nesvarbius“ svorius arba struktūras ( „PyTorch“ genėjimo pamoka )
-
Paprastai reikia perkvalifikuoti, kad būtų atkurta kokybė
-
Veikia geriau, nei žmonės mano... kai daroma atsargiai
Distiliavimas (mokinys mokosi iš mokytojo)
Tai mano mėgstamiausias ilgalaikis svertas. Distiliavimas gali sukurti mažesnį modelį, kuris elgiasi panašiai ir dažnai yra stabilesnis nei ekstremalus kvantavimas („ Žinių distiliavimas neuroniniame tinkle “).
Netobula metafora: distiliavimas yra tarsi sudėtingos sriubos pilimas per filtrą ir... mažesnės sriubos gavimas. Sriuba taip nedirbama, bet mintį suprantate 🍲.
9) Padavimai ir išvados: tikroji mūšio zona 🧯
Galite „optimizuoti“ modelį ir vis tiek jį prastai aptarnauti. Pateikimas yra ta vieta, kur vėlavimas ir kaina tampa realūs.
Svarbios pergalės padavimo metu
-
Paketavimas
pagerina pralaidumą. Tačiau padidina delsą, jei persistengiate. Subalansuokite. ( „Triton“ dinaminis paketavimas ) -
Kaupimas talpykloje. Greitas
kaupimas talpykloje ir KV talpyklos pakartotinis naudojimas gali būti labai svarbus pasikartojantiems kontekstams. ( KV talpyklos paaiškinimas ) -
Srautinio perdavimo išvestis.
Vartotojai mano, kad tai greičiau, net jei bendras laikas yra panašus. Suvokimas yra svarbus 🙂. -
Žetonų išlaidų mažinimas
Kai kurie stekai atlieka papildomą darbą su kiekvienu žetonu. Sumažinkite šias išlaidas ir laimėsite daug.
Saugokitės uodegos vėlavimo
Jūsų vidurkis gali atrodyti puikiai, o p99 – katastrofa. Deja, vartotojai gyvena uodegoje. ( „Uodegos delsa“ ir kodėl vidurkiai meluoja )
10) Aparatinės įrangos optimizavimas: suderinkite modelį su įrenginiu 🧰🖥️
Optimizavimas nežinant apie techninę įrangą yra tas pats, kas lenktyninio automobilio derinimas netikrinus padangų. Žinoma, galite tai padaryti, bet tai šiek tiek kvaila.
GPU aspektai
-
Atminties pralaidumas dažnai yra ribojantis veiksnys, o ne neapdoroti skaičiavimai
-
Didesnės partijos gali padėti, kol jos nebepadeda
-
Branduolio suliejimas ir dėmesio optimizavimas yra labai svarbūs transformatoriams ( „FlashAttention“: IO-aware tikslus dėmesys )
CPU aspektai
-
Sriegimas, vektorizavimas ir atminties lokalumas yra labai svarbūs
-
Tokenizavimo pridėtinės išlaidos gali dominuoti ( 🤗 „greiti“ tokenizatoriai )
-
Jums gali prireikti kitokių kvantavimo strategijų nei naudojant GPU
Apsvarstymai dėl periferinių / mobiliųjų įrenginių
-
Atminties pėdsakas tampa svarbiausiu prioritetu
-
Vėlavimo dispersija yra svarbi, nes įrenginiai yra… nuotaikingi
-
Mažesni, specializuoti modeliai dažnai pranoksta didelius, bendrus modelius
11) Kokybiški apsauginiai turėklai: neoptimizuokite savęs į klaidą 🧪
Kiekvieną greičio pergalę turėtų lydėti kokybės patikrinimas. Priešingu atveju švęsite, išsiųsite prekę ir gausite pranešimą, pavyzdžiui, „kodėl asistentas staiga prabilo kaip piratas?“ 🏴☠️
Pragmatiški apsauginiai turėklai:
-
Auksiniai raginimai (fiksuotas raginimų rinkinys, kurį visada išbandote)
-
Užduoties metrikos (tikslumas, F1, BLEU, kas tinka)
-
Žmonių atliekami atsitiktiniai patikrinimai (taip, rimtai)
-
Regresijos ribos („leidžiamas ne didesnis kaip X % sumažėjimas“)
Taip pat sekite gedimų režimus:
-
formatavimo poslinkis
-
atsisakymo elgesio pokyčiai
-
haliucinacijų dažnis
-
atsako ilgio infliacija
Optimizavimas gali pakeisti elgesį netikėtais būdais. Keistai. Erzinančiai. Nuspėjamai, žvelgiant atgal.
12) Kontrolinis sąrašas: kaip žingsnis po žingsnio optimizuoti dirbtinio intelekto modelius ✅🤖
Jei norite aiškios operacijų tvarkos, kaip optimizuoti dirbtinio intelekto modelius , pateikiame darbo eigą, kuri padeda žmonėms išlikti sveiko proto:
-
Apibrėžkite sėkmę.
Pasirinkite 1–2 pagrindinius rodiklius (vėlavimo laiką, kainą, pralaidumą, kokybę). -
Išmatuokite bazinio
profilio realius darbo krūvius, įrašykite p50/p95, atmintį, kainą. ( „PyTorch Profiler “) -
srauto kliūčių šalinimas.
Duomenų įkėlimas, tokenizavimas, išankstinis apdorojimas, paketavimas. -
Taikyti mažos rizikos skaičiavimo laimėjimus.
Mišrus tikslumas, branduolio optimizavimas, geresnis paketavimas. -
Išbandykite kompiliatoriaus / vykdymo aplinkos optimizavimą:
grafų fiksavimą, išvadų vykdymo aplinką, operatorių suliejimą. (torch.compilepamoka , ONNX vykdymo aplinkos dokumentai ) -
Sumažinkite modelio kainą.
Kruopščiai įvertinkite kiekybiškai, jei įmanoma, distiliuokite ir, jei reikia, apkarpykite. -
Tune aptarnavimo
talpyklos, lygiagretumo, apkrovos testavimo, uodegos delsos pataisymai. -
Patvirtinkite kokybę.
Atlikite regresinius testus ir palyginkite rezultatus greta. -
Kartoti.
Maži pakeitimai, aiškios pastabos, kartoti. Nedemonstratyvu – efektyvu.
Ir taip, tai vis dar yra „Kaip optimizuoti dirbtinio intelekto modelius“, net jei tai labiau panašu į „Kaip nustoti mindžioti ant grėblių“. Tas pats.
13) Dažniausios klaidos (kad jų nekartotumėte kaip mes visi) 🙃
-
Optimizavimas prieš vertinimą.
Sugaišite laiką. O tada užtikrintai optimizuosite netinkamą dalyką... -
Vieno etalono vaikymasis.
Etalonai meluoja dėl praleidimo. Jūsų darbo krūvis yra tiesa. -
Atminties problemų ignoravimas
sukelia sulėtėjimą, gedimus ir virpėjimą. ( CUDA atminties naudojimo supratimas „PyTorch“ programoje ) -
Per ankstyvas per didelis kvantavimas.
Mažo bitų kiekio kvantavimas gali būti nuostabus, bet pirmiausia pradėkite nuo saugesnių žingsnių. -
Nėra atšaukimo plano.
Jei negalite greitai atšaukti, kiekvienas diegimas tampa įtemptas. Stresas sukelia klaidų.
Baigiamosios pastabos: Žmogiškas būdas optimizuoti 😌⚡
Dirbtinio intelekto modelių optimizavimas nėra vienas triukas. Tai daugiasluoksnis procesas: išmatuokite, taisykite srautą, naudokite kompiliatorius ir vykdymo aplinkas, sureguliuokite pateikimą, tada, jei reikia, sumažinkite modelį kvantavimo arba distiliavimo būdu. Darykite tai žingsnis po žingsnio, išlaikykite kokybės apsaugos priemones ir nepasikliaukite „jaučiasi greičiau“ kaip metrika (jūsų jausmai yra puikūs, jūsų jausmai nėra profiliavimo įrankis).
Jei norite trumpiausio išsineštinio maisto:
-
Pirmiausia išmatuokite 🔍
-
Optimizuokite vamzdyną toliau 🧵
-
Tada optimizuokite modelį 🧠
-
Tada optimizuokite patiekimą 🏗️
-
Nuolat tikrinkite kokybę ✅
Ir jei tai padeda, priminkite sau: tikslas nėra „tobulas modelis“. Tikslas yra modelis, kuris yra greitas, įperkamas ir pakankamai patikimas, kad galėtumėte miegoti naktį... daugumą naktų 😴.
DUK
Ką praktiškai reiškia dirbtinio intelekto modelio optimizavimas
„Optimizuoti“ paprastai reiškia vieno pagrindinio apribojimo – delsos, kainos, atminties naudojimo, tikslumo, stabilumo arba aptarnavimo našumo – gerinimą. Sunkiausia dalis yra kompromisai – vienos srities spaudimas gali pakenkti kitai. Praktiškas būdas – pasirinkti aiškų tikslą (pvz., p95 delsą arba kokybės pasiekimo laiką) ir optimizuoti pagal jį. Neturint tikslo, lengva „tobulėti“ ir vis tiek prarasti.
Kaip optimizuoti dirbtinio intelekto modelius nepakenkiant kokybei
Kiekvieną greičio ar kainos pokytį traktuokite kaip potencialią tylią regresiją. Naudokite apsaugines priemones, tokias kaip auksiniai raginimai, užduočių metrikos ir greiti žmonių atliekami patikrinimai. Nustatykite aiškią priimtinos kokybės svyravimo ribą ir palyginkite rezultatus greta. Taip išvengsite, kad po pateikimo „tai greičiau“ nevirstų „kodėl gamyboje tai staiga pasidarė keista?“.
Ką reikia išmatuoti prieš pradedant optimizuoti
Pradėkite nuo delsos procentilių (p50, p95, p99), pralaidumo (žetonų/sek. arba užklausų/sek.), GPU panaudojimo ir didžiausios VRAM/RAM atminties. Stebėkite kainą už išvadą arba už 1000 žetonų, jei kaina yra apribojimas. Apibūdinkite realų jūsų aptarnaujamą scenarijų, o ne žaislinę užduotį. Trumpas „našumo žurnalas“ padės išvengti spėlionių ir klaidų kartojimo.
Greitos, mažos rizikos pergalės treniruočių rezultatams
Mišrus tikslumas (FP16/BF16) dažnai yra greičiausias pirmasis svertas, tačiau atkreipkite dėmesį į skaitinius niuansus. Jei paketo dydis ribotas, gradiento kaupimas gali stabilizuoti optimizavimą neeikvojant atminties. Gradiento kontrolinis taškas atima papildomus skaičiavimus, kad būtų mažesnė atmintis, taip įgalinant didesnius kontekstus. Neignoruokite tokenizavimo ir duomenų įkėlimo įrenginio derinimo – jie gali tyliai apkrauti GPU.
Kada naudoti „torch.compile“, „ONNX Runtime“ arba „TensorRT“
Šie įrankiai skirti operacinėms išlaidoms spręsti: grafų fiksavimui, branduolio suliejimui ir vykdymo laiko grafų optimizavimui. Jie gali užtikrinti aiškų išvadų pagreitinimą, tačiau rezultatai skiriasi priklausomai nuo modelio formos ir aparatinės įrangos. Kai kurie nustatymai veikia magiškai, kiti vos juda. Tikėkitės jautrumo formos pokyčiams ir retkarčiais pasitaikančių „gremlinų“ klaidų – išmatuokite prieš ir po realaus darbo krūvio.
Ar verta kvantizuoti ir kaip neperžengti ribos
Kvantavimas gali sumažinti atminties kiekį ir pagreitinti išvadų darymą, ypač naudojant INT8, tačiau kraštutiniais atvejais kokybė gali suprastėti. Mažesnio bitų skaičiaus parinktys (pvz., INT4/k-bit) leidžia sutaupyti daugiau, tačiau rizikuoja labiau. Saugiausias įprotis yra vertinti realiame bandymų rinkinyje ir palyginti rezultatus, o ne nuojautą. Pirmiausia pradėkite nuo saugesnių žingsnių, o tada, jei reikia, mažinkite tikslumą.
Skirtumas tarp genėjimo ir distiliavimo siekiant sumažinti modelio dydį
Genėjimas pašalina „nepanaudoto svorio“ parametrus ir dažnai reikalauja pakartotinio mokymo, kad būtų atkurta kokybė, ypač kai tai daroma agresyviai. Distiliavimas apmoko mažesnį mokinio modelį imituoti didesnio mokytojo elgesį, ir tai gali būti didesnė ilgalaikė investicijų grąža nei ekstremalus kvantavimas. Jei norite mažesnio modelio, kuris elgtųsi panašiai ir išliktų stabilus, distiliavimas dažnai yra švaresnis kelias.
Kaip sumažinti išvadų kainą ir delsą patobulinus pateikimą
Optimizavimas tampa apčiuopiamas aptarnaujant: paketavimas padidina pralaidumą, tačiau per didelis gali pakenkti delsai, todėl jį reikia atidžiai koreguoti. Talpyklos kaupimas (greitas kaupimas talpykloje ir KV talpyklos pakartotinis naudojimas) gali būti labai svarbus, kai kontekstai kartojasi. Srautinio perdavimo išvestis pagerina suvokiamą greitį, net jei bendras laikas yra panašus. Taip pat atkreipkite dėmesį į kiekvieno žetono pridėtinę vertę savo steke – nedidelis darbas su vienu žetonu greitai kaupiasi.
Kodėl uodegos delsa yra tokia svarbi optimizuojant dirbtinio intelekto modelius
Vidurkiai gali atrodyti puikiai, o „p99“ yra katastrofa, o vartotojai linkę gyventi „uodegoje“. „Uodegos delsa“ dažnai kyla dėl trikdžių: atminties fragmentacijos, procesoriaus išankstinio apdorojimo šuolių, tokenizavimo sulėtėjimo arba prasto paketavimo elgesio. Štai kodėl vadove pabrėžiami procentiliai ir realūs darbo krūviai. Optimizuodami tik „p50“, vis tiek galite teikti patirtį, kuri „atsitiktinai atrodo lėta“
Nuorodos
-
„Amazon Web Services“ (AWS) – AWS „CloudWatch“ procentiliai (statistikos apibrėžimai) – docs.aws.amazon.com
-
„Google“ – „The Tail at Scale“ (geriausios praktikos uodegos delsa) – sre.google
-
„Google“ – paslaugų lygio tikslai (SRE knyga) – delsos procentiliai – sre.google
-
PyTorch - torch.compile - docs.pytorch.org
-
„PyTorch“ – „FullyShardedDataParallel“ (FSDP) – docs.pytorch.org
-
PyTorch – PyTorch Profiler – docs.pytorch.org
-
PyTorch - CUDA semantika: atminties valdymas (CUDA atminties paskirstytojo pastabos) - docs.pytorch.org
-
„PyTorch“ – automatinis mišrus tikslumas (torch.amp / AMP) – docs.pytorch.org
-
PyTorch - torch.utils.checkpoint - docs.pytorch.org
-
„PyTorch“ – našumo derinimo vadovas – docs.pytorch.org
-
PyTorch – Genėjimo pamoka – docs.pytorch.org
-
„PyTorch“ – CUDA atminties naudojimo „PyTorch“ supratimas – docs.pytorch.org
-
„PyTorch“ – „torch.compile“ pamoka / apžvalga – docs.pytorch.org
-
ONNX vykdymo aplinka – ONNX vykdymo aplinkos dokumentacija – onnxruntime.ai
-
NVIDIA – „TensorRT“ dokumentacija – docs.nvidia.com
-
NVIDIA – „TensorRT“ kvantiniai tipai – docs.nvidia.com
-
NVIDIA – „Nsight Systems“ – kūrėjas.nvidia.com
-
NVIDIA – „Triton Inference Server“ – dinaminis paketavimas – docs.nvidia.com
-
„DeepSpeed“ – „ZeRO Stage 3“ dokumentacija – deepspeed.readthedocs.io
-
bitsandbytes (bitsandbytes-foundation) - bitsandbytes - github.com
-
Apkabinantis veidas – pagreitėjimas: gradiento kaupimo vadovas – huggingface.co
-
„Hugging Face“ – Tokenizerių dokumentacija – huggingface.co
-
Apkabinantis veidas – Transformeriai: PEFT vadovas – huggingface.co
-
Apkabinantis veidas – Transformeriai: KV talpyklos paaiškinimas – huggingface.co
-
Apkabinantis veidas – Transformeriai: „Greiti“ tokenizatoriai (tokenizatorių klasės) – huggingface.co
-
arXiv – Žinių išgryninimas neuroniniame tinkle (Hinton ir kt., 2015) – arxiv.org
-
arXiv – LoRA: didelių kalbų modelių žemo rango adaptacija – arxiv.org
-
arXiv – „FlashAttention“: greitas ir atmintį taupantis tikslus dėmesys su IO-Awareness – arxiv.org