Modely a platformy AI
Spuštění frameworku Microsoft pro inferenci 1-bit Large Language Models na místních zařízeních
Dne 17. října 2024 společnost Microsoft (MSFT ) oznámila BitNet.cpp, framework pro inferenci navržen pro běh 1-bit kvantizovaných Large Language Models (LLM). BitNet.cpp je významný pokrok v oblasti Gen AI, umožňující efektivní nasazení 1-bit LLM na standardních CPU bez nutnosti drahých GPU. Tento vývoj demokratizuje přístup k LLM,使je dostupné na širokém spektru zařízení a nabízí nové možnosti pro aplikace s umělou inteligencí na zařízení.
Pochopení 1-bit Large Language Models
Large Language Models (LLM) tradičně vyžadovaly značné výpočetní zdroje kvůli použití vysokopřesných čísel s plovoucí desetinnou čárkou (obvykle FP16 nebo BF16) pro modelové váhy. Tato nutnost činila nasazení LLM drahými a energeticky náročnými.
V jádru 1-bit LLM používají extrémní kvantizační techniky pro reprezentaci modelových vah pomocí pouze tří možných hodnot: -1, 0 a 1, odtud pochází termín “1,58-bit” (protože vyžaduje slightly více než jeden bit pro kódování tří stavů).
Ternární systém vah
Koncept
1-bit kvantizace v BitNet.cpp je ternární systém vah. BitNet operuje s pouze třemi možnými hodnotami pro každý parametr:
- -1 (negativní)
- 0 (neutrální)
- 1 (pozitivní)
To vede k požadavku na úložiště kolem 1,58 bitu na parametr, odtud pochází název BitNet b1.58. Tato drastická redukce šířky bitu parametrů vede k výraznému snížení paměťového využití a výpočetní složitosti, protože většina operací s plovoucí desetinnou čárkou je nahrazena jednoduchými operacemi sčítání a odčítání.
Matematický základ
1-bit kvantizace zahrnuje transformaci vah a aktivací do jejich ternární reprezentace prostřednictvím následujících kroků:
1. Binarizace vah
Binarizace vah zahrnuje centralizaci kolem průměru (α), což vede k ternární reprezentaci. Transformace je matematicky vyjádřena jako:
Wf=Sign(W−α)
Kde:
- W je původní maticová váha.
- α je průměr vah.
- Sign(x) vrací +1 pokud x > 0 a -1 jinak.
2. Kvantizace aktivací
Kvantizace aktivací zajišťuje, že vstupy jsou omezeny na specifikovanou šířku bitu:
x^e=Quant(x)=Clip(γx×Qb,−Qb+ϵ,Qb−ϵ)
Kde:
- Qb = 2(b−1)2^{(b-1)} je maximální kvantizační úroveň pro b-bit šířku.
- γ je maximální absolutní hodnota x (označená jako ∣∣x∣∣∞).
- ε je malý počet, který zabraňuje přetečení během výpočtů.
3. BitLinear operace
BitLinear vrstva nahrazuje tradiční maticové násobení zjednodušenými operacemi:
y=Wf×x^e×(Qbβγ)
Kde:
- β je měřítkový faktor, který se používá pro minimalizaci aproximálních chyb.
- γ měřítkuje aktivační funkce.
- Q_b je kvantizační faktor.
Tato transformace umožňuje efektivní výpočty, zatímco zachovává výkon modelu.
Výkonové důsledky
Paměťová efektivita
Ternární systém vah významně snižuje požadavky na paměť:
- Tradiční LLM: 16 bitů na váhu
- BitNet.cpp: 1,58 bitu na váhu
Tato redukce se překládá do úspory paměti přibližně 90% ve srovnání s tradičními 16bitovými modely, což umožňuje větší modely ve stejných hardwarových omezeních.

Rychlost inferencí, Energetická efektivita (Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)
1. Rychlost inferencí: Rychlejší na obou CPU
Rychlost inferencí je reprezentována jako počet tokenů zpracovaných za sekundu. Zde je rozbor pozorování:
- Na Apple M2 Ultra: BitNet.cpp dosahuje až 5,07x urychlení pro větší modely (30B) ve srovnání s Llama.cpp, s maximální rychlostí 593,43 tokenů za sekundu pro model 125M, což je 1,37x urychlení. Pro větší modely, jako je 3,8B a 7B, BitNet.cpp udržuje rychlost nad 84,77 tokeny za sekundu, což ukazuje jeho efektivitu napříč škálami.
- Na Intel (INTC ) i7-13700H: BitNet.cpp dosahuje ještě dramatičtějších zlepšení rychlosti. Při velikosti modelu 7B BitNet.cpp dodává neuvěřitelné 5,68x urychlení ve srovnání s Llama.cpp. Pro menší modely, jako je 125M, zpracovává 389,08 tokenů za sekundu, což je 2,37x rychlejší než Llama.cpp.
2. Energetická efektivita: Hračka pro edge zařízení
Poskytnuté grafy také zahrnují srovnání energetických nákladů, které ukazuje významné snížení spotřeby energie na token:
- Na Apple M2 Ultra: Úspory energie BitNet.cpp jsou podstatné. Pro model 700M spotřebuje 55,4% méně energie na token ve srovnání s Llama.cpp, klesající z 0,314 na 0,140. Tento trend pokračuje pro větší modely, s modelem 70B ukazujícím 70,0% snížení spotřeby energie.
- Na Intel i7-13700H: BitNet.cpp dodává 71,9% úspory energie pro model 700M, se spotřebou klesající z 1,367 na 0,384. Ačkoli údaje o spotřebě energie pro model 70B v Llama.cpp nejsou k dispozici, BitNet.cpp zůstává efektivní, se spotřebou energie na 17,33 pro model 70B.
3. Překročení hranice lidské čtecí rychlosti
Jednou z nejzajímavějších poznatků z těchto grafů je odkaz na lidskou čtecí rychlost, označenou na 5-7 tokenů za sekundu. Tato červená linie ukazuje, že obě implementace, zejména BitNet.cpp, mohou pohodlně překročit lidskou čtecí rychlost i pro největší modely:
- Na Apple M2 Ultra, BitNet.cpp překročí lidskou čtecí rychlost pro všechny velikosti modelů, s nejnižší rychlostí 8,67 tokenů za sekundu pro model 70B.
- Na Intel i7-13700H, model 100B stále dosahuje 1,70 tokenů za sekundu, téměř se dotýkající spodní hranice lidské čtecí rychlosti, zatímco všechny menší modely tuto hranici překračují.
Zvažování během trénování
Přímý odhad (STE)
Jelikož 1-bit kvantizace zavádí nediferencovatelné funkce, trénování zahrnuje specializovanou techniku nazývanou Přímý odhad (STE). V tomto přístupu gradienty protékají nezměněny přes nediferencovatelné body. Zde je zjednodušená implementace v Pythonu:
class StraightThroughEstimator(Function): @staticmethod def forward(ctx, input): return input.sign() <p>@staticmethod def backward(ctx, grad_output): return grad_output
Mixed Precision Training
Pro udržení stability během trénování se používá smíšená přesnost:
- Váhy a aktivační funkce: Kvantizovány na 1-bit přesnost.
- Gradienty a stav optimizátoru: Uloženy v vyšší přesnosti.
- Latentní váhy: Udržovány v vysoké přesnosti pro umožnění přesných aktualizací během trénování.
Strategie velkého učebního koeficientu
Jedná se o jedinečnou výzvu pro 1-bit modely, že malé aktualizace nemusí ovlivnit binarizované váhy. Pro zmírnění tohoto se zvyšuje učební koeficient, zajišťující rychlejší konvergenci a lepší optimalizaci ve srovnání s tradičními přístupy.
Skupinová kvantizace a normalizace
BitNet.cpp zavádí Skupinovou kvantizaci a normalizaci pro zlepšení modelové paralelizace. Místo výpočtu parametrů pro celou matici vah BitNet dělí váhy a aktivační funkce do více skupin (G).
Toto seskupování umožňuje efektivní paralelní zpracování bez dodatečné meziskupinové komunikace, umožňující velké škálám modelového trénování a inferencí.
Poznámky k implementaci a optimalizacím
Optimalizace CPU
BitNet.cpp využívá několik nízkoúrovňových optimalizací pro dosažení maximálního výkonu CPU:
- Vektorizované operace: Utilizuje SIMD instrukce pro efektivní bitové manipulace.
- Cache-friendly přístup k paměti: Strukturuje data pro minimalizaci cache chyb.
- Paralelní zpracování: Distribuuje pracovní zátěž napříč několika CPU jádry efektivně.
Zde je příklad klíčové funkce, která implementuje kvantizaci a inferenci v BitNet:













