AI-modeller og platforme
Microsofts Inferensramme bringer 1-bit store sprogmodeller til lokale enheder
Den 17. oktober 2024 annoncerede Microsoft (MSFT ) BitNet.cpp, en inferensramme designet til at køre 1-bit kvantiserede store sprogmodeller (LLM’er). BitNet.cpp er et betydeligt skridt fremad i Gen AI, da det muliggør effektivt at deployere 1-bit LLM’er på standard CPU’er uden at kræve dyre GPU’er. Denne udvikling demokratiserer adgangen til LLM’er og gør dem tilgængelige på en bred vifte af enheder, og åbner nye muligheder for on-device AI-applikationer.
Forståelse af 1-bit store sprogmodeller
Store sprogmodeller (LLM’er) har traditionelt krævet betydelige beregningsressourcer på grund af deres brug af højpræcisions flydende punkt tal (typisk FP16 eller BF16) til modelvægte. Denne nødvendighed har gjort det dyrt og energikrævende at deployere LLM’er.
I deres kerne bruger 1-bit LLM’er ekstreme kvantisationsteknikker til at repræsentere modelvægte ved hjælp af kun tre mulige værdier: -1, 0 og 1, hvorfra betegnelsen “1,58-bit” (da det kræver lidt mere end en bit til at kodificere tre tilstande).
Ternær vægtsystem
Konceptet
1-bit kvantisationen i BitNet.cpp er et ternært vægtsystem. BitNet opererer med kun tre mulige værdier for hver parameter:
- -1 (negativ)
- 0 (neutral)
- 1 (positiv)
Dette resulterer i en lagerkrav på omkring 1,58 bit per parameter, hvorfra navnet BitNet b1,58. Denne drastiske reduktion i parameterbitbredde fører til en imponerende reduktion i hukommelsesbrug og beregningskompleksitet, da de fleste flydende punkt multiplikationer erstattes med simple additioner og subtraktioner.
Matematisk grundlag
1-bit kvantisation indebærer transformation af vægte og aktiveringer til deres ternære repræsentation gennem følgende trin:
1. Vægtbinarisering
Binarisering af vægte indebærer centralisering af dem omkring middelværdien (α), hvilket resulterer i en ternær repræsentation. Transformationen udtrykkes matematisk som:
Wf=Sign(W−α)
Hvor:
- W er den oprindelige vægtmatrix.
- α er middelværdien af vægte.
- Sign(x) returnerer +1 hvis x > 0 og -1 ellers.
2. Aktiveringskvantisation
Kvantisation af aktiveringer sikrer, at input er begrænset til en specificeret bitbredde:
x^e=Quant(x)=Clip(γx×Qb,−Qb+ϵ,Qb−ϵ)
Hvor:
- Qb = 2(b−1)2^{(b-1)} er den maksimale kvantiseringsniveau for b-bit bredde.
- γ er den maksimale absolutte værdi af x (beteget som ∣∣x∣∣∞).
- ε er et lille tal for at forhindre overflydning under beregninger.
3. BitLineær operation
BitLineær laget erstatter traditionelle matrixmultiplikationer med en simplificeret operation:
y=Wf×x^e×(Qbβγ)
Hvor:
- β er en skalaeringsfaktor, der bruges til at minimere approksimationsfejl.
- γ skalerer aktiveringerne.
- Q_b er kvantiseringsfaktoren.
Denne transformation muliggør effektive beregninger, mens den bevarede modellens præstation.
Ydelsesimplikationer
Hukommelseseffektivitet
Det ternære vægtsystem reducerer betydeligt hukommelseskravene:
- Traditionelle LLM’er: 16 bit per vægt
- BitNet.cpp: 1,58 bit per vægt
Denne reduktion oversætter sig til en hukommelsesbesparelse på ca. 90% i forhold til traditionelle 16-bit modeller, hvilket tillader større modeller at passe inden for de samme hardwarebegrænsninger.
1. Inferencehastighed: Hurtigere på begge CPU’er
Inferencehastighed repræsenteres som antallet af tokens behandlet per sekund. Her er en gennemgang af observationerne:
- På Apple M2 Ultra: BitNet.cpp opnår op til 5,07 gange hurtigere hastighed for større modeller (30B) i forhold til Llama.cpp, med en topphastighed på 593,43 tokens per sekund for en 125M-model, hvilket er en 1,37 gange hurtigere hastighed. For større modeller som 3,8B og 7B, opretholder BitNet.cpp en hastighed over 84,77 tokens per sekund, hvilket viser dens effektivitet på tværs af størrelser.
- På Intel i7-13700H: BitNet.cpp opnår endnu mere dramatiske hastighedsforbedringer. Ved 7B-modelstørrelse leverer BitNet.cpp en utrolig 5,68 gange hurtigere hastighed i forhold til Llama.cpp. For mindre modeller som 125M, behandler den 389,08 tokens per sekund, hvilket er 2,37 gange hurtigere end Llama.cpp.
2. Energieffektivitet: En spilvender for edge-enheder
De tilførte grafer indeholder også energieomkostningskomparationer, som viser en betydelig reduktion i energiforbrug per token behandlet:
- På Apple M2 Ultra: BitNet.cpp’s energibesparelse er betydelig. For 700M-modellen forbruger den 55,4% mindre energi per token i forhold til Llama.cpp, faldende fra 0,314 til 0,140. Denne tendens fortsætter for større modeller, med 70B-modellen visende en 70,0% reduktion i energiforbrug.
- På Intel i7-13700H: BitNet.cpp leverer 71,9% energibesparelse for 700M-modellen, med forbrug faldende fra 1,367 til 0,384. Selv om energidata for 70B-modellen i Llama.cpp ikke er tilgængelig, forbliver BitNet.cpp effektiv, med energiforbrug på 17,33 for 70B-modellen.
3. Overskridelse af menneske-læsningsskalaen
En af de mest interessante indsighter fra disse grafer er henvisningen til menneske-læsningsskalaen, markeret ved 5-7 tokens per sekund. Denne røde linje viser, at begge implementationer, især BitNet.cpp, kan komfortabelt overstige menneske-læsningsskalaen, selv for de største modeller:
- På Apple M2 Ultra, overstiger BitNet.cpp menneske-læsningsskalaen for alle modelstørrelser, med den laveste hastighed på 8,67 tokens per sekund for en 70B-model.
- På Intel i7-13700H, opnår 100B-modellen 1,70 tokens per sekund, næsten på niveau med den lavere del af menneske-læsningsskalaen, mens alle mindre modeller overstiger denne skala.
Træningsovervejelser
Straight-Through Estimator (STE)
Da 1-bit kvantisation introducerer ikke-differentiable funktioner, indebærer træning en specialiseret teknik kendt som Straight-Through Estimator (STE). I denne tilgang flyder gradienter uændret gennem ikke-differentiable punkter. Her er en forenklet implementering i Python:
class StraightThroughEstimator(Function): @staticmethod def forward(ctx, input): return input.sign() <p>@staticmethod def backward(ctx, grad_output): return grad_output
Blandet præcisionstræning
For at opretholde stabilitet under træning, anvendes blandet præcision:
- Vægte og aktiveringer: Kvantiseret til 1-bit præcision.
- Gradienter og optimizer-tilstande: Gemt i højere præcision.
- Latente vægte: Vedligeholdt i høj præcision for at lette nøjagtige opdateringer under træning.
Stor læringsratestrategi
En unik udfordring med 1-bit modeller er, at små opdateringer måske ikke påvirker de binariserede vægte. For at imødegå dette, øges læringsraten, hvilket sikrer hurtigere konvergens og bedre optimering i forhold til traditionelle tilgange.
Gruppekvantisation og normalisering
BitNet.cpp introducerer gruppekvantisation og normalisering for at forbedre modellens parallelisme. I stedet for at beregne parametre for hele vægtmatricen, dividerer BitNet vægte og aktiveringer i multiple grupper (G).
Dette gruppering tillader effektiv parallelbehandling uden ekstra grupperingskommunikation, hvilket muliggør stor skala modeltræning og inferens.
Implementeringsnoter og optimeringer
CPU-optimering
BitNet.cpp udnytter flere lavniveausoptimeringer for at opnå top-CPU-ydelse:
- VEktorisering af operationer: Udnytter SIMD-instruktioner til at udføre bitmanipulationer effektivt.
- Cache-venlig hukommelsesadgang: Strukturerer data for at minimere cache-miss.
- Parallelbehandling: Fordeler arbejdsbyrden effektivt over multiple CPU-kerner.
Her er et eksempel på en nøglefunktion, der implementerer kvantisation og inferens i BitNet:














