Modely a platformy AI

Spuštění frameworku Microsoft pro inferenci 1-bit Large Language Models na místních zařízeních

mm
Přidejte Unite.AI mezi své preferované zdroje na Google

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.

Energetická efektivita

Rychlost inferencí, Energetická efektivita (Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)

 

Rychlost inferencí: Rychlejší na obou CPU

Rychlost inferencí, Energetická efektivita (i7-13700H)

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:

def bitlinear_forward(input, weight, scale):
# Kvantizuje vstup pomocí absmax kvantizace
input_q = quantize(input)

# Proveďte binární maticové násobení
output = binary_matmul(input_q, weight)

# Škáluje výstup pro odpovídající původní přesnost
return output * scale

def quantize(x):
# Proveďte absmax kvantizaci
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale
[/code]

Podporované modely

Aktuální verze BitNet.cpp podporuje následující 1-bit LLM dostupné na Hugging Face:

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

Tyto modely jsou veřejně dostupné pro demonstraci inferenčních schopností frameworku. Ačkoli nebyly oficiálně trénovány nebo vydány společností Microsoft, ilustrují flexibilitu frameworku.

Průvodce instalací

Pro začátek s BitNet.cpp postupujte podle následujících kroků:

Předpoklady

  1. Python >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda (silně doporučeno)

Pro Windows uživatele by měl být nainstalován Visual Studio s následujícími komponentami:

  • Desktop Development with C++
  • C++-CMake Tools for Windows
  • Git for Windows
  • C++-Clang Compiler for Windows
  • MS-Build Support for LLVM Toolset (Clang)

Pro Debian/Ubuntu uživatele je k dispozici automatický instalační skript:

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

Krokování instalace

  1. Klonování repozitáře:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Instalace závislostí:
    # Vytvořte nové Conda prostředí (doporučeno)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Sestavení a příprava projektu:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Alternativně můžete ručně stáhnout a převést model:

    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

Spuštění inferencí s BitNet.cpp

Pro spuštění inferencí pomocí frameworku použijte následující příkaz:

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Sandra cestovala do kuchyně. Kde je Sandra?" -n 6 -temp 0.7

Vysvětlení:

  • -m specifikuje cestu k modelovému souboru.
  • -p definuje text vstupní prompty.
  • -n nastavuje počet tokenů pro předpověď.
  • -temp upravuje náhodnost výběru (teplotu) během inferencí.

Příklad výstupu

Sandra cestovala do kuchyně. Kde je Sandra?

Odpověď: Sandra je v kuchyni.

Technické detaily BitNet.cpp

BitLinear vrstva

BitNet.cpp implementuje modifikovanou Transformer architekturu, nahrazující standardní maticová násobení BitLinear operacemi. Tento přístup centralizuje váhy na nulu před kvantizací a měřítkuje je pro minimalizaci aproximativních chyb. Klíčová transformační funkce vypadá takto:


<p># Binarizace funkcí pro 1-bit váhy
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized</p>

Kombinace centralizovaných vah a měřítkování zajišťuje, že kvantizační chyba zůstává minimální, a tak zachovává výkon.

Průmyslový dopad

BitNet.cpp by mohl mít široké dopady na nasazení LLM:

  • Přístupnost: Umožňuje LLM běžet na standardních zařízeních, demokratizuje přístup k silné umělé inteligenci.
  • Nákladová efektivita: Sníží potřebu drahých GPU, snižuje bariéru pro přijetí.
  • Energetická efektivita: Ušetří energii využíváním standardní CPU-based inferencí.
  • Inovace: Otevírá nové možnosti pro aplikace s umělou inteligencí na zařízení, jako je reálný překlad, hlasoví asistenti a aplikace zaměřené na soukromí bez závislosti na cloudu.

Výzvy a budoucí směry

Ačkoli 1-bit LLM slibují, několik výzev zůstává. Tyto zahrnují vývoj robustních 1-bit modelů pro různé úkoly, optimalizaci hardwaru pro 1-bit výpočty a povzbuzení vývojářů k přijetí této nové paradigmatické změny. Kromě toho výzkum 1-bit kvantizace pro úkoly počítačového vidění nebo zpracování audia představuje zajímavý budoucí směr.

Závěr

Společnost Microsoft spustila BitNet.cpp, což je významný pokrok. Povoluje efektivní 1-bit inferenci na standardních CPU, vytváří přístupnost a udržitelnost umělé inteligence. Tento framework nastavuje scénu pro více přenosné a nákladově efektivní LLM, tlačí hranice toho, co je možné s umělou inteligencí na zařízení.

Já pět let se ponořím do fascinujícího světa strojového učení a hlubokého učení. Mé vášně a odborné znalosti mě vedly k tomu, abych se podílel na více než 50 různých projektech softwarového inženýrství, se zvláštním zaměřením na AI/ML. Mé pokračující zvědavosti mě také přivedly k přirozenému jazykovému zpracování, oblasti, kterou jsem ochoten prozkoumat dále.