AI-modellen en platforms

Microsofts Inference Framework brengt 1-Bit Large Language Models naar lokale apparaten

mm
Voeg Unite.AI toe aan je voorkeursbronnen op Google

Op 17 oktober 2024 kondigde Microsoft BitNet.cpp (MSFT ) 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 significante rekenbronnen nodig vanwege hun 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 System

Het Concept

De 1-bit quantificatie in BitNet.cpp is een ternair gewichtsysteem. 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 bit 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 basis

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

1. Gewichtsbinarisatie

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

Wf​=Sign(W−α)

Waar:

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

2. Activatiequantificatie

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

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

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. BitLineaire operatie

De BitLineaire 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.

Prestatie-implicaties

Geheugenefficiëntie

Het ternaire gewichtsysteem reduceert de geheugenvereisten aanzienlijk:

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

Deze reductie vertaalt zich in een geheugensbesparing 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 [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)

 

Inference-snelheid: Sneller op beide CPU's

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

1. Inference-snelheid: Sneller op beide 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 snelheidstoename van maximaal 5,07x voor grotere modellen (30B) in vergelijking met Llama.cpp, met een topsnelheid van 593,43 tokens per seconde voor een 125M-model, wat een 1,37x snelheidstoename 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 (INTC ) i7-13700H: BitNet.cpp bereikt nog dramatischere snelheidsverbeteringen. Bij een modelgrootte van 7B levert BitNet.cpp een 5,68x snelheidstoename ten opzichte van 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 bevatten ook energiekostenvergelijkingen, die een aanzienlijke reductie in energieverbruik per verwerkt token laten zien:

  • Op Apple M2 Ultra: De energibesparingen van BitNet.cpp 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, waarbij het 70B-model een 70,0% reductie in energieverbruik laat zien.
  • Op Intel i7-13700H: BitNet.cpp levert 71,9% energibesparingen 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. Het overschrijden van de menselijke leessnelheidsbenchmark

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, menselijke leessnelheden 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 nog steeds 1,70 tokens per seconde, wat bijna de onderste grens van de menselijke leessnelheid bereikt, 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 bekend als 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()

<p>@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 optimizerstaten: Opgeslagen in hogere precisie.
  • Latente gewichten: Onderhouden in hoge precisie om accurate updates tijdens de training mogelijk te maken.

Grote leerstrate

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 de 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 worden.

Implementatienotities en optimalisaties

CPU-optimalisatie

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

  • Vectorized operaties: Maakt gebruik van SIMD-instructies om bitmanipulaties efficiënt uit te voeren.
  • Cache-vriendelijke geheugen-toegang: Structureert gegevens om cache-misses te minimaliseren.
  • Parallelle verwerking: Verdeelt de workload efficiënt over meerdere CPU-kernen.

Hieronder volgt een voorbeeld van een sleutelfunctie 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 de oorspronkelijke precisie te matchen
return output * scale

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

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:

  • Bureaubladontwikkeling met C++
  • C++-CMake Tools voor Windows
  • Git voor Windows
  • C++-Clang-compiler voor Windows
  • MS-Build-ondersteuning voor LLVM-hulpmiddelen (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 reisde naar de keuken. Waar is Sandra?" -n 6 -temp 0.7

Uitleg:

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

Uitvoervoorbeeld

Sandra reisde naar de keuken. Waar is Sandra?

Antwoord: Sandra is in de keuken.

Technische details van BitNet.cpp

BitLineaire laag

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


<p># Binarisatie van 1-bit gewichten
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized</p>

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

Branchiale impact

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

  • Toegankelijkheid: Maakt het mogelijk om LLM's uit te voeren op standaardapparaten, waardoor toegang tot krachtige AI wordt gedemocratiseerd.
  • Kosten-efficië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 real-time 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 onderzoeken 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 toegankelijkheid en duurzaamheid van AI. Dit framework legt de basis voor meer portable en kostenefficiënte LLM's, waardoor het mogelijk wordt om meer te doen met on-device AI.

Ik heb de afgelopen vijf jaar doorgebracht met het onderdompelen van mezelf 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 diverse 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.