Connect with us

Microsofts Inference Framework Brengt 1-Bit Large Language Models naar Lokale Apparaten

Kunstmatige intelligentie

Microsofts Inference Framework Brengt 1-Bit Large Language Models naar Lokale Apparaten

mm
Understanding 1-bit LLMs and Microsoft's BitNet.cpp Framework

Op 17 oktober 2024 kondigde Microsoft BitNet.cpp aan, een inference-framework ontworpen om 1-bit gequantificeerde Large Language Models (LLM’s) uit te voeren. BitNet.cpp is een significante vooruitgang in Gen AI, waardoor de implementatie van 1-bit LLM’s efficiënt mogelijk is op standaard CPU’s, zonder dat dure GPU’s nodig zijn. Deze ontwikkeling democratiseert de toegang tot LLM’s, waardoor ze beschikbaar zijn op een breed scala aan apparaten en nieuwe mogelijkheden biedt voor on-device AI-toepassingen.

1-Bit Large Language Models Begrijpen

Large Language Models (LLM’s) hebben traditioneel aanzienlijke rekenbronnen nodig vanwege het gebruik van hoge precisie drijvende komma-getallen (meestal FP16 of BF16) voor modelgewichten. Deze noodzaak heeft het implementeren van LLM’s duur en energievretend gemaakt.

In hun kern gebruiken 1-bit LLM’s extreme quantificatietechnieken om modelgewichten weer te geven met behulp van slechts drie mogelijke waarden: -1, 0 en 1, vandaar de term “1,58-bit” (aangezien het iets meer dan één bit vereist om drie staten te coderen).

Ternary Weight Systeem

Het Concept

De 1-bit quantificatie in BitNet.cpp is een ternair weight-systeem. BitNet werkt met slechts drie mogelijke waarden voor elke parameter:

  • -1 (negatief)
  • 0 (neutraal)
  • 1 (positief)

Dit resulteert in een opslagvereiste van ongeveer 1,58 bits per parameter, vandaar de naam BitNet b1.58. Deze drastische reductie in parameterbitbreedte leidt tot een indrukwekkende reductie in geheugengebruik en berekeningscomplexiteit, aangezien de meeste drijvende komma-vermenigvuldigingen worden vervangen door eenvoudige optellingen en aftrekkingen.

Wiskundige Grondslag

1-bit quantificatie omvat het transformeren van gewichten en activaties naar hun ternaire representatie door de volgende stappen:

1. Gewicht Binarisatie

Het binariseren van de gewichten houdt in dat ze worden gecentreerd rond de gemiddelde waarde (α), waardoor een ternaire representatie ontstaat. De transformatie wordt wiskundig uitgedrukt als:

Wf=Sign(Wα)

Waar:

  • W is de oorspronkelijke gewichtsmatrix.
  • α is het gemiddelde van de gewichten.
  • Sign(x) retourneert +1 als x > 0 en -1 anders.

2. Activatie Quantificatie

Het quantificeren van activaties zorgt ervoor dat de invoer wordt beperkt tot een gespecificeerde bitbreedte:

Waar:

  • Qb = 2(b−1)2^{(b-1)} is de maximale quantificatieniveau voor b-bit breedte.
  • γ is de maximale absolute waarde van x (aangeduid als ∣∣x∣∣∞).
  • ε is een kleine waarde om overloop tijdens berekeningen te voorkomen.

3. BitLinear Operatie

De BitLinear-laag vervangt traditionele matrixvermenigvuldigingen door een vereenvoudigde operatie:

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

Waar:

  • β is een schaalfactor die wordt gebruikt om benaderingsfouten te minimaliseren.
  • γ schaalt de activaties.
  • Q_b is de quantificatiefactor.

Deze transformatie maakt efficiënte berekeningen mogelijk terwijl de prestaties van het model behouden blijven.

Prestatiegevolgen

Geheugenefficiëntie

Het ternaire weight-systeem reduceert de geheugenvereisten aanzienlijk:

  • Traditionele LLM’s: 16 bits per gewicht
  • BitNet.cpp: 1,58 bits per gewicht

Deze reductie vertaalt zich in een geheugenbesparing van ongeveer 90% ten opzichte van traditionele 16-bit modellen, waardoor grotere modellen binnen dezelfde hardwarebeperkingen passen.

Energie-efficiëntie

Inference-snelheid, Energie-efficiëntie (Apple M2)

 

Inference-snelheid: Sneller op zowel CPU's

Inference-snelheid, Energie-efficiëntie (i7-13700H)

1. Inference-snelheid: Sneller op zowel CPU’s

De inference-snelheid wordt weergegeven als het aantal tokens dat per seconde wordt verwerkt. Hieronder volgt een overzicht van de observaties:

  • Op Apple M2 Ultra: BitNet.cpp bereikt een snelheidswinst van maximaal 5,07x voor grotere modellen (30B) in vergelijking met Llama.cpp, met een pieksnelheid van 593,43 tokens per seconde voor een 125M-model, wat een 1,37x snelheidswinst is. Voor grotere modellen zoals 3,8B en 7B behoudt BitNet.cpp een snelheid van meer dan 84,77 tokens per seconde, waarmee het zijn efficiëntie over verschillende schalen aantoont.
  • Op Intel i7-13700H: BitNet.cpp bereikt nog dramatischere snelheidswinsten. Bij een modelgrootte van 7B levert BitNet.cpp een ongelooflijke 5,68x snelheidswinst op in vergelijking met Llama.cpp. Voor kleinere modellen zoals 125M verwerkt het 389,08 tokens per seconde, wat 2,37x sneller is dan Llama.cpp.

2. Energie-efficiëntie: Een Game-Changer voor Edge-apparaten

De grafieken tonen ook energiekostenvergelijkingen, die een aanzienlijke reductie in energieverbruik per verwerkt token laten zien:

  • Op Apple M2 Ultra: BitNet.cpp’s energiewinsten zijn aanzienlijk. Voor het 700M-model verbruikt het 55,4% minder energie per token in vergelijking met Llama.cpp, dalend van 0,314 naar 0,140. Deze trend zet zich voort voor grotere modellen, met het 70B-model dat een 70,0% reductie in energieverbruik laat zien.
  • Op Intel i7-13700H: BitNet.cpp levert 71,9% energiewinst voor het 700M-model, met een verbruik dat daalt van 1,367 naar 0,384. Hoewel energiedata voor het 70B-model in Llama.cpp niet beschikbaar is, blijft BitNet.cpp efficiënt, met een energieverbruik van 17,33 voor het 70B-model.

3. De Menselijke Leessnelheid overschrijden

Een van de meest interessante inzichten uit deze grafieken is de verwijzing naar menselijke leessnelheid, gemarkeerd bij 5-7 tokens per seconde. Deze rode lijn toont aan dat beide implementaties, vooral BitNet.cpp, de menselijke leessnelheid comfortabel kunnen overschrijden, zelfs voor de grootste modellen:

  • Op Apple M2 Ultra overschrijdt BitNet.cpp de menselijke leessnelheid voor alle modelgroottes, met de laagste snelheid van 8,67 tokens per seconde voor een 70B-model.
  • Op Intel i7-13700H bereikt het 100B-model 1,70 tokens per seconde, wat net onder de ondergrens van de menselijke leessnelheid ligt, terwijl alle kleinere modellen deze benchmark overschrijden.

Trainingsoverwegingen

Straight-Through Estimator (STE)

Aangezien 1-bit quantificatie niet-differentieerbare functies introduceert, omvat de training een gespecialiseerde techniek genaamd de Straight-Through Estimator (STE). In deze aanpak stromen de gradiënten ongewijzigd door niet-differentieerbare punten. Hieronder volgt een vereenvoudigde implementatie in Python:

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

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

Gemengde Precisietraining

Om de stabiliteit tijdens de training te behouden, wordt gemengde precisie gebruikt:

  • Gewichten en Activaties: Gequantificeerd naar 1-bit precisie.
  • Gradiënten en Optimizer Statussen: Opgeslagen in hogere precisie.
  • Latente Gewichten: Onderhouden in hoge precisie om accurate updates tijdens de training te faciliteren.

Grote Leerstrate Strategie

Een unieke uitdaging met 1-bit modellen is dat kleine updates de gebinariseerde gewichten mogelijk niet beïnvloeden. Om dit te mitigeren, wordt de leerstrate verhoogd, waardoor snellere convergentie en betere optimalisatie mogelijk zijn in vergelijking met traditionele benaderingen.

Groepsquantificatie en Normalisatie

BitNet.cpp introduceert groepsquantificatie en normalisatie om modelparallelisme te verbeteren. In plaats van parameters voor de hele gewichtsmatrix te berekenen, deelt BitNet gewichten en activaties op in meerdere groepen (G).
Dit groeperen maakt efficiënte parallelverwerking mogelijk zonder extra communicatie tussen groepen, waardoor grote modeltraining en inferentie mogelijk wordt.

Implementatiedetails en Optimalisaties

CPU-optimalisatie

BitNet.cpp maakt gebruik van verschillende lage-niveau-optimalisaties om de maximale CPU-prestaties te bereiken:

  • Gevectoriseerde Operaties: Maakt gebruik van SIMD-instructies om bitmanipulaties efficiënt uit te voeren.
  • Cache-vriendelijke Geheugen_toegang: Structureert gegevens om cache-misses te minimaliseren.
  • Parallel Verwerking: Distribueert de workload effectief over meerdere CPU-kernen.

Hieronder volgt een voorbeeld van een belangrijke functie die quantificatie en inferentie in BitNet implementeert:

def bitlinear_forward(input, weight, scale):
# Quantizeer de invoer met behulp van absmax-quantificatie
input_q = quantize(input)

# Voer binaire matrixvermenigvuldiging uit
output = binary_matmul(input_q, weight)

# Schaal de uitvoer om overeen te komen met de oorspronkelijke precisie
return output * scale

def quantize(x):
# Voer absmax-quantificatie uit
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale

Ondersteunde Modellen

De huidige release van BitNet.cpp ondersteunt de volgende 1-bit LLM’s beschikbaar op Hugging Face:

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

Deze modellen zijn openbaar beschikbaar om de inferentiecapaciteiten van het framework te demonstreren. Hoewel ze niet officieel zijn getraind of uitgebracht door Microsoft, illustreren ze de veelzijdigheid van het framework.

Installatiehandleiding

Om aan de slag te gaan met BitNet.cpp, volg de onderstaande stappen:

Vereisten

  1. Python >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda (sterk aanbevolen)

Voor Windows-gebruikers moet Visual Studio zijn geïnstalleerd met de volgende onderdelen ingeschakeld:

  • Desktopontwikkeling met C++
  • C++-CMake-hulpmiddelen voor Windows
  • Git voor Windows
  • C++-Clang-compiler voor Windows
  • MS-Build-ondersteuning voor LLVM-hulpmiddelset (Clang)

Voor Debian/Ubuntu-gebruikers is een automatische installatiescript beschikbaar:

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

Stap-voor-stap Installatie

  1. Kloon het Repository:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Installeer Afhankelijkheden:
    # Maak een nieuwe Conda-omgeving (aanbevolen)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Bouw en Bereid het Project voor: U kunt een model rechtstreeks van Hugging Face downloaden en naar een gequantificeerd formaat converteren:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Alternatief kunt u het model handmatig downloaden en converteren:

    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

Inferentie Uitvoeren met BitNet.cpp

Om inferentie uit te voeren met het framework, gebruikt u de volgende opdracht:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra journeyed to the kitchen. Where is Sandra?" -n 6 -temp 0.7

Uitleg:

  • -m specificeert het modelbestandpad.
  • -p definieert de prompttekst.
  • -n stelt het aantal tokens in dat moet worden voorspeld.
  • -temp past de steekproefonzekerheid (temperatuur) aan tijdens de inferentie.

Uitvoer Voorbeeld

Sandra journeyed to the kitchen. Where is Sandra?

Antwoord: Sandra is in the kitchen.

Technische Details van BitNet.cpp

BitLinear Laag

BitNet.cpp implementeert een gewijzigde Transformer-architectuur, waarbij standaard matrixvermenigvuldigingen worden vervangen door BitLinear-operaties. Deze benadering centreert gewichten rond nul voordat ze worden gequantificeerd en schaalt ze om benaderingsfouten te verminderen. De sleuteltransformatiefunctie ziet er als volgt uit:


# Binarisatiefunctie voor 1-bit gewichten
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized

De combinatie van gecentreerde gewichten en schaling zorgt ervoor dat de quantificatiefout minimaal blijft, waardoor de prestaties van het model behouden blijven.

Industriële Impact

BitNet.cpp kan verstrekkende gevolgen hebben voor de implementatie van LLM’s:

  • Toegankelijkheid: Staat LLM’s toe om te draaien op standaardapparaten, waardoor toegang tot krachtige AI wordt gedemocratiseerd.
  • Kostenefficiëntie: Vermindert de behoefte aan dure GPU’s, waardoor de drempel voor adoptie lager wordt.
  • Energie-efficiëntie: Bespaart energie door standaard CPU-gebaseerde inferentie te gebruiken.
  • Innovatie: Opent nieuwe mogelijkheden voor on-device AI, zoals realtime taalvertaling, spraakassistenten en privacygerichte toepassingen zonder afhankelijkheid van de cloud.

Uitdagingen en Toekomstige Richtingen

Hoewel 1-bit LLM’s veelbelovend zijn, blijven er verschillende uitdagingen bestaan. Deze omvatten de ontwikkeling van robuuste 1-bit modellen voor diverse taken, het optimaliseren van hardware voor 1-bit berekeningen en het stimuleren van ontwikkelaars om deze nieuwe paradigma te omarmen. Bovendien biedt het verkennen van 1-bit quantificatie voor computerzicht- of audiotoepassingen een spannende toekomstige richting.

Conclusie

Microsofts lancering van BitNet.cpp is een significante vooruitgang. Door efficiënte 1-bit inferentie mogelijk te maken op standaard CPU’s, creëert BitNet.cpp de toegankelijkheid en duurzaamheid van AI. Dit framework zet de toon voor meer portable en kostenefficiënte LLM’s, waardoor meer mogelijk wordt met on-device AI.

Ik heb de afgelopen vijf jaar mezelf ondergedompeld in de fascinerende wereld van Machine Learning en Deep Learning. Mijn passie en expertise hebben me geleid om bij te dragen aan meer dan 50 uiteenlopende software-engineeringprojecten, met een bijzondere focus op AI/ML. Mijn voortdurende nieuwsgierigheid heeft me ook aangetrokken tot Natural Language Processing, een vakgebied dat ik graag verder wil verkennen.