AI-modeller og platforme

Microsofts Inferensramme bringer 1-bit store sprogmodeller til lokale enheder

mm
Føj Unite.AI til dine foretrukne kilder på Google

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.

Energieffektivitet

Inferencehastighed, Energieffektivitet (Apple M2)

 

Inferencehastighed: Hurtigere på begge CPU'er

Inferencehastighed, Energieffektivitet (i7-13700H)

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:


def bitlinear_forward(input, weight, scale):
# Kvantiser input ved hjælp af absmax kvantisation
input_q = quantize(input)

# Udfør binær matrixmultiplikation
output = binary_matmul(input_q, weight)

# Skaler output til at matche den oprindelige præcision
return output * scale

def quantize(x):
# Udfør absmax kvantisation
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale
[/code]

Understøttede modeller

Den aktuelle udgave af BitNet.cpp understøtter følgende 1-bit LLM'er tilgængelige på Hugging Face:

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

Disse modeller er offentligt tilgængelige for at demonstrere rammeværkets inferenskapaciteter. Selv om de ikke er officielt trænet eller udgivet af Microsoft, viser de rammeværkets fleksibilitet.

Installationsvejledning

For at komme i gang med BitNet.cpp, følg nedenstående trin:

Forudsætninger

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

For Windows-brugere skal Visual Studio installeres med følgende komponenter aktiveret:

  • Desktopudvikling med C++
  • C++-CMake-værktøjer til Windows
  • Git til Windows
  • C++-Clang-kompilator til Windows
  • MS-Build-understøttelse for LLVM-værktøjsæt (Clang)

For Debian/Ubuntu-brugere er der en automatisk installations-script tilgængelig:

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

Trin-for-trin-installation

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

    cd BitNet
  2. Install afhængigheder:
    # Opret en ny Conda-miljø (anbefales)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Byg og forbered projekt: Du kan downloade en model direkte fra Hugging Face og konvertere den til en kvantiseret format:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Alternativt kan du downloade 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

Kørsel af inferens med BitNet.cpp

For at køre inferens ved hjælp af rammeværket, brug følgende kommando:

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

Forklaring:

  • -m specificerer modelfilens sti.
  • -p definerer prompt-teksten.
  • -n angiver antallet af tokens at forudsige.
  • -temp justerer sampling-tilfældigheden (temperatur) under inferens.

Eksempel på output

Sandra rejste til køkkenet. Hvor er Sandra?

Svar: Sandra er i køkkenet.

Tekniske detaljer om BitNet.cpp

BitLineær lag

BitNet.cpp implementerer en modificeret Transformer-arkitektur, hvor standard matrixmultiplikationer erstattes med BitLineær operationer. Denne tilgang centraliserer vægte omkring nul før kvantisation og skalerer dem for at reducere approksimationsfejl. Den nøgletransformation funktion ser således ud:


<p># Binarisering af 1-bit vægte
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized</p>

Kombinationen af centraliserede vægte og skalaering sikrer, at kvantiseringsfejlen forbliver minimal, hvilket bevarede modellens præstation.

Brancheforfald

BitNet.cpp kan have langtrækkende implikationer for udrulning af LLM'er:

  • Tilgængelighed: Gør det muligt for LLM'er at køre på standardenheder, hvilket demokratiserer adgangen til kraftfuld AI.
  • Omstillingshastighed: Reducerer behovet for dyre GPU'er, hvilket sænker barrieren for antagelse.
  • Energieffektivitet: Sparer energi ved at udnytte standard CPU-baseret inferens.
  • Innovation: Åbner nye muligheder for on-device AI, som realtids sprogoversættelse, taleassistenter og privatlivsorienterede applikationer uden afhængighed af skyen.

Udfordringer og fremtidige retninger

Selv om 1-bit LLM'er har potentiale, er der flere udfordringer, der skal overvindes. Disse omfatter udviklingen af robuste 1-bit modeller til diverse opgaver, optimering af hardware til 1-bit beregning og opmuntring af udviklere til at antage denne nye paradigm. Desuden er udforskning af 1-bit kvantisation for computerseende eller lydopgaver en spændende fremtidig retning.

Konklusion

Microsofts lancering af BitNet.cpp er et betydeligt fremskridt. Ved at muliggøre effektiv 1-bit inferens på standard CPU'er, skaber BitNet.cpp adgang til og bæredygtighed af AI. Dette rammeværk sætter scenen for mere portable og omkostningseffektive LLM'er, hvilket åbner nye muligheder for on-device AI.

Jeg har brugt de sidste fem år på at dykke ned i den fascinerende verden af Machine Learning og Deep Learning. Min passion og ekspertise har ført mig til at bidrage til over 50 forskellige software-ingeniørprojekter, med en særlig fokus på AI/ML. Min fortsatte nysgerrighed har også ført mig mod Natural Language Processing, et felt jeg er ivrig efter at udforske yderligere.