AI-modeller og plattformer

Microsofts Inferensramme bringer 1-bit store språkmodeller til lokale enheter

mm
Legg til Unite.AI blant dine foretrukne kilder på Google

Den 17. oktober 2024 kunngjorde Microsoft BitNet.cpp (MSFT ), et inferensrammeverk designet for å kjøre 1-bit kvantiserte store språkmodeller (LLM). BitNet.cpp er et betydelig fremsteg i Gen AI, som muliggjør effektiv deployering av 1-bit LLM på standard CPU, uten å kreve dyre GPU. Denne utviklingen demokratiserer tilgangen til LLM, gjør dem tilgjengelige på en rekke enheter og åpner nye muligheter for på-enhet AI-applikasjoner.

Forstå 1-bit store språkmodeller

Store språkmodeller (LLM) har tradisjonelt krevd betydelige beregningsressurser på grunn av deres bruk av høy-presisjons flyttall (vanligvis FP16 eller BF16) for modellvekt. Dette har gjort det dyrt og energikrevende å deployere LLM.

I kjernen bruker 1-bit LLM ekstreme kvantiseringsteknikker for å representere modellvekt med kun tre mulige verdier: -1, 0 og 1, derav betegnelsen “1,58-bit” (da det krever litt mer enn en bit for å kode tre tilstander).

Ternær vekt-system

Konseptet

1-bit kvantisering i BitNet.cpp er et ternært vekt-system. BitNet opererer med kun tre mulige verdier for hver parameter:

  • -1 (negativ)
  • 0 (nøytral)
  • 1 (positiv)

Dette resulterer i en lagringskrav på omtrent 1,58 bit per parameter, derav navnet BitNet b1.58. Denne drastiske reduksjonen i parameter-bit-bredde fører til en imponerende reduksjon i minnebruk og beregningskompleksitet, da de fleste flyttalls-multiplikasjoner erstattes med enkle addisjoner og subtraksjoner.

Matematisk grunnlag

1-bit kvantisering innebærer å transformere vekt og aktiveringer til deres ternære representasjon gjennom følgende trinn:

1. Vekt-binarisering

Binarisering av vektene innebærer å sentrere dem rundt gjennomsnittet (α), noe som resulterer i en ternær representasjon. Transformasjonen uttrykkes matematisk som:

Wf​=Sign(W−α)

Hvor:

  • W er den opprinnelige vektmatrisen.
  • α er gjennomsnittet av vektene.
  • Sign(x) returnerer +1 hvis x > 0 og -1 ellers.

2. Aktivering-kvantisering

Kvantisering av aktiveringer sikrer at inndata er begrenset til en bestemt bit-bredde:

x^e​=Quant(x)=Clip(γx×Qb​​,−Qb​+ϵ,Qb​−ϵ)

Hvor:

  • Qb = 2(b−1)2^{(b-1)} er den maksimale kvantiseringen for b-bit bredde.
  • γ er den maksimale absoluttverdien av x (betegnet som ∣∣x∣∣∞).
  • ε er et lite tall for å forhindre overflyt under beregninger.

3. BitLineær operasjon

BitLineær laget erstatter tradisjonelle matrisemultiplikasjoner med en forenklet operasjon:

y=Wf​×x^e​×(Qb​βγ​)

Hvor:

  • β er en skaleringsfaktor som brukes til å minimere approksimasjonsfeil.
  • γ skalerer aktiveringer.
  • Q_b er kvantiseringsfaktoren.

Denne transformasjonen muliggjør effektive beregninger samtidig som modellprestasjonene behandles.

Ytelsesimplikasjoner

Minneeffektivitet

Ternært vekt-system reduserer betydelig minnekrav:

  • Tradisjonelle LLM: 16 bit per vekt
  • BitNet.cpp: 1,58 bit per vekt

Denne reduksjonen oversettes til en minnesparing på omtrent 90% sammenlignet med tradisjonelle 16-bit modeller, noe som gjør det mulig å få større modeller innenfor samme hårdvarerestriksjoner.

Energi-effektivitet

Innsiktshastighet, Energi-effektivitet (Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)

 

Innsiktshastighet: Raskere på begge CPU

Innsiktshastighet, Energi-effektivitet (i7-13700H)

1. Innsiktshastighet: Raskere på begge CPU

Innsiktshastighet representeres som antall token prosessert per sekund. Her er en oppsummering av observasjonene:

  • På Apple M2 Ultra: BitNet.cpp oppnår opptil 5,07 ganger hastighetsforbedring for større modeller (30B) sammenlignet med Llama.cpp, med en topphastighet på 593,43 token per sekund for en 125M-modell, noe som er en 1,37 ganger hastighetsforbedring. For større modeller som 3,8B og 7B, beholder BitNet.cpp en hastighet over 84,77 token per sekund, noe som viser dens effektivitet over skalaene.
  • På Intel (INTC ) i7-13700H: BitNet.cpp oppnår enda mer dramatiske hastighetsforbedringer. Ved 7B-modellstørrelse, leverer BitNet.cpp en 5,68 ganger hastighetsforbedring sammenlignet med Llama.cpp. For mindre modeller som 125M, prosesserer det 389,08 token per sekund, noe som er 2,37 ganger raskere enn Llama.cpp.

2. Energi-effektivitet: En game-changer for kant-enheter

Grafene inkluderer også energi-kost-sammenligninger, som viser en betydelig reduksjon i energiforbruk per prosessert token:

  • På Apple M2 Ultra: BitNet.cpps energibesparelse er betydelig. For 700M-modellen, forbruker det 55,4% mindre energi per token sammenlignet med Llama.cpp, fra 0,314 til 0,140. Denne trenden fortsetter for større modeller, med 70B-modellen som viser en 70,0% reduksjon i energiforbruk.
  • På Intel i7-13700H: BitNet.cpp leverer 71,9% energibesparelse for 700M-modellen, med forbruk som faller fra 1,367 til 0,384. Selv om energidata for 70B-modellen i Llama.cpp ikke er tilgjengelig, forblir BitNet.cpp effektiv, med energiforbruk på 17,33 for 70B-modellen.

3. Krysser menneskeleseshastighets-benchmarket

En av de mest interessante innsiktene fra disse grafene er referansen til menneskeleseshastighet, markert ved 5-7 token per sekund. Denne røde linjen viser at begge implementeringer, spesielt BitNet.cpp, kan komfortabelt overstige menneskeleseshastigheter selv for de største modellene:

  • Apple M2 Ultra, overstiger BitNet.cpp menneskeleseshastighet for alle modellstørrelser, med den laveste hastigheten på 8,67 token per sekund for en 70B-modell.
  • Intel i7-13700H, oppnår 100B-modellen en hastighet på 1,70 token per sekund, nære den nedre grensen for menneskeleseshastighet, mens alle mindre modeller overstiger denne benchmarken.

Treningsoverveielser

Rett gjennom-estimatoren (STE)

Ettersom 1-bit kvantisering introduserer ikke-differensierbare funksjoner, involverer trening en spesialisert teknikk kjent som Rett gjennom-estimatoren (STE). I denne tilnærmingen, flyter gradientene uendret gjennom ikke-differensierbare punkt. Her er en forenklet implementering i Python:

class RettGjennomEstimatoren(Function):
@staticmethod
def forward(ctx, input):
return input.sign()

@staticmethod
def backward(ctx, grad_output):
return grad_output

Blandet presisjonstrening

For å opprettholde stabilitet under trening, brukes blandet presisjon:

  • Vekter og aktiveringer: Kvantisert til 1-bit presisjon.
  • Gradier og optimizer-tilstander: Lagret i høyere presisjon.
  • Latente vekter: Vedlikeholdes i høy presisjon for å muliggjøre nøyaktige oppdateringer under trening.

Stor læringshastighetsstrategi

En unik utfordring med 1-bit modeller er at små oppdateringer kanskje ikke påvirker binariserte vekter. For å motvirke dette, økes læringshastigheten for å sikre raskere konvergens og bedre optimalisering sammenlignet med tradisjonelle tilnærminger.

Gruppe-kvantisering og normalisering

BitNet.cpp innfører gruppe-kvantisering og normalisering for å forbedre modell-parallellisering. I stedet for å beregne parametre for hele vektmatrisen, deler BitNet vekter og aktiveringer inn i flere grupper (G).
Dette gruppering tillater effektiv parallellprosessering uten ekstra mellom-gruppe-kommunikasjon, muliggjører stor-skala modell-trening og inferens.

Implementeringsnotater og optimaliseringer

CPU-optimalisering

BitNet.cpp utnytter flere lav-nivå-optimaliseringer for å oppnå topp-CPU-ytelse:

  • Vektoriserte operasjoner: Utnytter SIMD-instruksjoner for å utføre bit-manipulasjoner effektivt.
  • Cache-vennlig minne-tilgang: Strukturerer data for å minimere cache-miss.
  • Parallell prosessering: Fordeler arbeidsbelastning effektivt over flere CPU-kjerner.

Her er et eksempel på en nøkelfunksjon som implementerer kvantisering og inferens i BitNet:

def bitlineær_forward(input, weight, scale):
# Kvantisér inndata ved hjelp av absmax-kvantisering
input_q = kvantisér(input)

# Utfør binær matrisemultiplikasjon
output = binær_matmul(input_q, weight)

# Skaler output for å matche original presisjon
return output * scale

def kvantisér(x):
# Utfør absmax-kvantisering
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale

Støttede modeller

Den nåværende utgaven av BitNet.cpp støtter følgende 1-bit LLMs tilgjengelige på Hugging Face:

  • bitnet_b1_58-large (0,7 milliarder parametre)
  • bitnet_b1_58-3B (3,3 milliarder parametre)
  • Llama3-8B-1.58-100B-tokens (8,0 milliarder parametre)

Disse modellene er offentlig tilgjengelige for å demonstrere rammeverkets inferens-egenskaper. Selv om de ikke er offisielt trent eller utgitt av Microsoft, viser de rammeverkets fleksibilitet.

Installasjonsveiledning

For å komme i gang med BitNet.cpp, følg disse trinnene:

Forutsetninger

  1. Python >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda (høyt anbefalt)

For Windows-brukere bør Visual Studio være installert med følgende komponenter aktivert:

  • Skrivebordsutvikling med C++
  • C++-CMake-verktøy for Windows
  • Git for Windows
  • C++-Clang-kompilator for Windows
  • MS-Build-støtte for LLVM-verktøysett (Clang)

For Debian/Ubuntu-brukere er det tilgjengelig et automatisert installasjonsskript:

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

Trinn-for-trinn installasjon

  1. Klon repository:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Install avhengigheter:
    # Opprett en ny Conda-miljø (anbefalt)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Bygg og forbered prosjekt:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Alternativt kan du laste ned og konvertere modellen manuelt:

    huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens

    python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s

Kjøre inferens med BitNet.cpp

For å kjøre inferens med rammeverket, bruk følgende kommando:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra reiste til kjøkkenet. Hvor er Sandra?" -n 6 -temp 0.7

Forklaring:

  • -m spesifiserer modellfilbane.
  • -p definerer prompt-teksten.
  • -n setter antall token å forutsi.
  • -temp justerer sampling-tilfeldighet (temperatur) under inferens.

Eksempel på utdata

Sandra reiste til kjøkkenet. Hvor er Sandra?

Svar: Sandra er i kjøkkenet.

Tekniske detaljer om BitNet.cpp

BitLineær lag

BitNet.cpp implementerer en modifisert Transformer-arkitektur, som erstatter standard matrisemultiplikasjoner med BitLineær-operasjoner. Denne tilnærmingen sentrerer vekter rundt null før kvantisering og skalerer dem for å redusere approksimasjonsfeil. Nøkkeltransformasjonsfunksjonen ser slik ut:


# Binarisering av 1-bit vekter
def binarisér_vekter(W):
alpha = W.mean()
W_binarisert = np.sign(W - alpha)
return W_binarisert

Kombinasjonen av sentrerte vekter og skaleringsfaktorer sikrer at kvantisfeilene forblir minimale, og prestasjonene beholdes.

Industriell påvirkning

BitNet.cpp kan ha langtrekkende implikasjoner for deployering av LLM:

  • Tilgjengelighet: Muliggjør at LLM kjører på standard enheter, demokratiserer tilgangen til kraftig AI.
  • Kost-effektivitet: Reduserer behovet for dyre GPU, senker barrieren for adopsjon.
  • Energi-effektivitet: Sparer energi ved å utnytte standard CPU-basert inferens.
  • Innovasjon: Åpner nye muligheter for på-enhet AI, som sanntids språk-oversettelse, tale-assistenter og privatlivs-fokusert applikasjoner uten avhengighet av skytjenester.

Utlendingsutfordringer og fremtidige retninger

Selv om 1-bit LLM har potensiale, finnes det flere utfordringer. Disse inkluderer utvikling av robuste 1-bit modeller for diverse oppgaver, optimalisering av maskinvare for 1-bit beregning og oppmuntring av utviklere til å adoptere denne nye paradigmen. I tillegg representerer utforskning av 1-bit kvantisering for datavisjon eller lyd-oppgaver en spennende fremtidig retning.

Konklusjon

Microsofts lansering av BitNet.cpp er et betydelig fremsteg. Ved å muliggjøre effektiv 1-bit inferens på standard CPU, skaper BitNet.cpp tilgjengelighet og bærekraft for AI. Dette rammeverket setter scenen for mer portable og kost-effektive LLM, og åpner opp for nye muligheter med på-enhet AI.

Jeg har brukt de siste fem årene på å dykke ned i den fasiniserende verden av Maskinlæring og Dypt Læring. Min lidenskap og ekspertise har ledet meg til å bidra til over 50 ulike programvareprosjekter, med særlig fokus på AI/ML. Min pågående nysgjørhet har også trukket meg mot Naturlig Språkbehandling, et felt jeg er ivrig etter å utforske videre.