AI-mallit ja alustat

Microsoftin Inferenssikehys Brings 1-Bit Large Language Models to Local Devices

mm
Lisää Unite.AI suosikkilähteisiisi Google-palvelussa

17. lokakuuta 2024 Microsoft (MSFT ) julkaisi BitNet.cpp:n, inferenssikehyksen, joka on suunniteltu suorittamaan 1-bittisiä kvantisoituja Large Language Model -malleja (LLM). BitNet.cpp on merkittävä edistysaskel Gen AI:ssa, joka mahdollistaa 1-bittisten LLM-mallien tehokkaan käytön standard-CPU:illa ilman kalliiden GPU:iden tarvetta. Tämä kehitys demokratisoi LLM-mallien saatavuuden, ja ne ovat nyt saatavilla laajalla valikoimalla laitteita, ja ne tarjoavat uusia mahdollisuuksia laitteistopuoleisissa AI-sovelluksissa.

Ymmärtäminen 1-bittisistä Large Language Model -malleista

Large Language Model -mallit (LLM) ovat perinteisesti vaatineet merkittäviä laskentaresursseja korkean tarkkuuden liukulukujen (yleensä FP16 tai BF16) käytön vuoksi mallipainoissa. Tämä on tehnyt LLM-mallien käytön kalliiksi ja energiankulutukseltaan suureksi.

1-bittiset LLM-mallit käyttävät äärimmäisiä kvantisointitekniikoita edustamaan mallipainoja vain kolmella mahdollisella arvolla: -1, 0 ja 1, mistä johtuu termi “1,58-bitti” (koska se vaatii hieman yli yhden bittin kolmen tilan koodaamiseen).

Ternary-painojärjestelmä

Käsite

BitNet.cpp:n 1-bittinen kvantisointi on ternary-painojärjestelmä. BitNet toimii vain kolmen mahdollisen arvon kanssa kunkin parametrin osalla:

  • -1 (negatiivinen)
  • 0 (neutraali)
  • 1 (positiivinen)

Tämä johtaa noin 1,58 bittin tallennusvaatimukseen parametrikohtaisesti, mistä johtuu nimitys BitNet b1.58. Tämä radikaali vähennys parametrin bittileveydessä johtaa merkittävään muistin ja laskennan monimutkaisuuden vähentymiseen, koska useimmat liukulukuoperaatiot korvataan yksinkertaisilla lisäyksillä ja vähennyksillä.

Matemaattinen perusta

1-bittinen kvantisointi käsittää painojen ja aktivaatioiden muuttamisen ternaariseen esitysmuotoon seuraavilla vaiheilla:

1. Painojen binarisoiminen

Painojen binarisoiminen käsittää niiden keskitämisen keskiarvoon (α), mikä johtaa ternaariseen esitysmuotoon. Muunnos voidaan matemaattisesti ilmaista seuraavasti:

Wf​=Sign(W−α)

Missä:

  • W on alkuperäinen painomatriisi.
  • α on painojen keskiarvo.
  • Sign(x) palauttaa +1, jos x > 0 ja -1 muutoin.

2. Aktivaatioiden kvantisointi

Aktivaatioiden kvantisointi varmistaa, että syötteet ovat rajoitettuina tietyn bittileveyden mukaisesti:

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

Missä:

  • Qb = 2(b−1)2^{(b-1)} on maksimi kvantisointitaso b-bittileveydelle.
  • γ on x:n suurin itseisarvo (merkitty ∣∣x∣∣∞).
  • ε on pieni luku, joka estää ylivirtauksen laskelmissa.

3. BitLineaarinen operaatio

BitLineaarinen kerros korvaa perinteiset matriisikertoimet yksinkertaisella operaatiolla:

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

Missä:

  • β on skaalauksen kerroin, jota käytetään approksimaatiavirheiden minimointiin.
  • γ skaalaa aktivaatiot.
  • Q_b on kvantisointikerroin.

Tämä muunnos mahdollistaa tehokkaat laskelmat säilyttäen mallin suorituskyvyn.

Suorituskyvyn vaikutukset

Muistin tehokkuus

Ternary-painojärjestelmä vähentää merkittävästi muistin vaatimuksia:

  • Perinteiset LLM-mallit: 16 bittiä/paino
  • BitNet.cpp: 1,58 bittiä/paino

Tämä vähennys vastaa noin 90% muistin säästöä verrattuna perinteisiin 16-bittisiin malleihin, mikä mahdollistaa suurempien mallien sijoittamisen samoihin laitteistoon.

Energiatehokkuus

Inferenssin nopeus, Energiatehokkuus (Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)

 

Inferenssin nopeus: Nopeampi molemmilla CPU:illa

Inferenssin nopeus, Energiatehokkuus (i7-13700H)

1. Inferenssin nopeus: Nopeampi molemmilla CPU:illa

Inferenssin nopeus on määritetty tokenien määränä sekunnissa. Tässä on yhteenveto havainnoista:

  • Apple M2 Ultran kanssa: BitNet.cpp saavuttaa jopa 5,07-kertaisen nopeutuksen suuremmille malleille (30B) verrattuna Llama.cpp:hen, huipputeholla 593,43 tokenia sekunnissa 125M-mallille, mikä on 1,37-kertainen nopeutus. Suuremmille malleille, kuten 3,8B ja 7B, BitNet.cpp ylläpitää yli 84,77 tokenin nopeuden sekunnissa, osoittaen tehokkuutensa eri skaaloissa.
  • Intel (INTC ) i7-13700H:llä: BitNet.cpp saavuttaa vielä dramaattisempia nopeutuksia. 7B-mallikoolle BitNet.cpp tarjoaa 5,68-kertaisen nopeutuksen verrattuna Llama.cpp:hen. Pienemmille malleille, kuten 125M, se prosessoi 389,08 tokenia sekunnissa, mikä on 2,37-kertainen nopeutus verrattuna Llama.cpp:hen.

2. Energiatehokkuus: Pelimuuttaja älylaitteille

Tarjotut kaaviot sisältävät myös energiankulutuksen vertailun, joka osoittaa merkittävän vähennyksen energiankulutuksessa tokenia kohden:

  • Apple M2 Ultran kanssa: BitNet.cpp:n energiansäästöt ovat merkittäviä. 700M-mallille se kuluttaa 55,4% vähemmän energiaa tokenia kohden verrattuna Llama.cpp:hen, laskien 0,314:sta 0,140:aan. Tämä suunta jatkuu suuremmilla malleilla, 70B-mallin osoittaen 70,0% vähennyksen energiankulutuksessa.
  • Intel i7-13700H:llä: BitNet.cpp tarjoaa 71,9% energiansäästöt 700M-mallille, kulutuksen laskiessa 1,367:sta 0,384:aan. Vaikka energiatietoja Llama.cpp:stä 70B-mallille ei ole saatavilla, BitNet.cpp pysyy tehokkaana, energiankulutuksella 17,33 70B-mallille.

3. Ylittäminen ihmisen lukemisenopeuden vertailukohtana

Yksi mielenkiintoisimmista havainnoista kaavioista on viittaus ihmisen lukemisnopeuteen, joka on merkitty 5-7 tokenia sekunnissa. Tämä punainen viiva osoittaa, että molemmat toteutukset, erityisesti BitNet.cpp, voivat helposti ylittää lukemisnopeuden jopa suurimmilla malleilla:

  • Apple M2 Ultran kanssa: BitNet.cpp ylittää lukemisnopeuden kaikilla mallikoon kaikilla malleilla, alin nopeus on 8,67 tokenia sekunnissa 70B-mallille.
  • Intel i7-13700H:llä: 100B-malli saavuttaa 1,70 tokenia sekunnissa, melkein saavuttaen lukemisnopeuden alarajan, kun taas kaikki pienemmät mallit ylittävät tämän vertailukohdan.

Koulutusasioita

Suora Estimaattori (STE)

Koska 1-bittinen kvantisointi sisältää epäerottuvia funktioita, koulutus vaatii erityistä tekniikkaa, jota kutsutaan Suora Estimaattoriksi (STE). Tässä lähestymistavassa gradientit virtaavat muuttumattomina epäerottuvien kohdissa. Tässä on yksinkertainen toteutus Pythonissa:

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

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

Segregoitunut tarkkuus koulutuksessa

Koulutuksen vakauden ylläpitämiseksi segregoitu tarkkuus on käytössä:

  • Painot ja aktivaatiot: Kvantisoitu 1-bittiseen tarkkuuteen.
  • Gradientit ja optimoijan tilat: Säilytetään korkeammassa tarkkuudessa.
  • Latenttiset painot: Ylläpidetään korkeassa tarkkuudessa koulutuksen aikana.

Suuri oppimisnopeusstrategia

Yksi 1-bittisten mallien haasteista on, että pienet päivitykset eivät välttämättä vaikuta binarisoituun painoon. Tämän neutraloimiseksi oppimisnopeus kasvaa, varmistaen nopeamman konvergenssin ja paremman optimoinnin verrattuna perinteisiin lähestymistapoihin.

Ryhmäkvantisointi ja normaali

BitNet.cpp esittelee Ryhmäkvantisoinnin ja normaalin parantamaan mallin rinnakkaisuutta. Sen sijaan, että lasketaan koko painomatriisin parametreja, BitNet jakaa painot ja aktivaatiot useisiin ryhmiin (G).
Tämä ryhmittely mahdollistaa tehokkaan rinnakkaisen prosessoinnin ilman lisättyä ryhmien välistä viestintää, mahdollistaen suurten mallien koulutuksen ja inferenssin.

Toteutusmuistiinpanot ja optimoinnit

CPU-optimointi

BitNet.cpp hyödyntää useita matalatasoisen optimointia saavuttaakseen huipputason CPU-suorituskyvyn:

  • Veektoroitujen operaatioiden käyttäminen bittimanipulaatioiden tehokkaaseen suorittamiseen.
  • Cache-ystävällinen muistin käyttö: Data on rakennettu minimoidakseen cache-hävikkiä.
  • Rinnakkainen prosessointi: Työnjakoa useiden CPU-ytimien välillä.

Tässä on esimerkki avainfunktiosta, joka toteuttaa kvantisoinnin ja inferenssin BitNet:ssä:

def bitlinear_forward(input, weight, scale):
# Kvantisoi syöte absmax-kvantisoinnilla
input_q = quantize(input)

# Suorita binäärimatriisikertolasku
output = binary_matmul(input_q, weight)

# Skaalaa tuloksen alkuperäiseen tarkkuuteen
return output * scale

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

Tuetut mallit

BitNet.cpp:n nykyinen julkaisu tukee seuraavia 1-bittisiä LLM-malleja Hugging Facessa:

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

Nämä mallit ovat julkisesti saatavilla demonstroimaan kehyksen inferenssimahdollisuuksia. Vaikka ne eivät ole virallisesti koulutettuja tai julkaisemia Microsoftilta, ne osoittavat kehyksen joustavuuden.

Asennusohje

Asentaaksesi BitNet.cpp:n, seuraa seuraavia vaiheita:

Edellytykset

  1. Python ≥ 3.9
  2. CMake ≥ 3.22
  3. Clang ≥ 18
  4. Conda (suositellaan voimakkaasti)

Windows-käyttäjille Visual Studio tulisi asentaa seuraavilla komponenteilla:

  • Pöytätyöaseman kehitys C++:lla
  • C++-CMake-työkalut Windowsille
  • Git for Windows
  • C++-Clang-kääntäjä Windowsille
  • MS-Build-tuki LLVM-työkalupakettiin (Clang)

Debian/Ubuntu-käyttäjille on automaattinen asennuskomento:

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

Vaiheittainen asennus

  1. Kloonaa varasto:
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. Asenna riippuvuudet:
    # Luo uusi Conda-ympäristö (suositellaan)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. Rakenna ja valmista projekti: Voit ladata mallin suoraan Hugging Facesta ja muuttaa sen kvantisoituun muotoon:
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    Vaihtoehtoisesti voit ladata ja muuttaa mallin manuaalisesti:

    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

Suorita inferenssiä BitNet.cpp:llä

Suorittaaksesi inferenssiä kehyksellä, käytä seuraavaa komentoa:

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

Selitys:

  • -m määrittää mallitiedoston polun.
  • -p määrittää syötetekstin.
  • -n asettaa ennustettavien tokenien määrän.
  • -temp säätää näytteen ottamisen satunnaisuutta (lämpötilaa) inferenssin aikana.

Esimerkki tuloksesta

Sandra journeyed to the kitchen. Where is Sandra?

Vastaus: Sandra on keittiössä.

BitNet.cpp:n tekniset tiedot

BitLineaarinen kerros

BitNet.cpp toteuttaa muokatun Transformer-arkkitehtuurin, jossa perinteiset matriisikertoimet korvataan BitLineaarisen operaatiolla. Tässä lähestymistavassa painot keskitetään nollaan ennen kvantisointia ja skaalataan vähentämään approksimaatiavirheitä. Avainmuunnosfunktiota voidaan kuvata seuraavasti:

# Binarisointifunktio 1-bittisille painoille
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized

Painojen keskitetyssä ja skaalatussa yhdistelmässä kvantisointivirhe pysyy minimissään, säilyttäen suorituskyvyn.

Teollisuuden vaikutus

BitNet.cpp voi vaikuttaa laajasti LLM-mallien käyttöönottoon:

  • Saatavuus: Mahdollistaa LLM-mallien suorittamisen standardilaitteilla, demokratisoiden pääsyn voimakkaaseen AI:hin.
  • Kustannustehokkuus: Vähentää kalliiden GPU:iden tarvetta, laskeva kynnyskynnys omaksumiseen.
  • Energiatehokkuus: Säästää energiaa hyödyntämällä standardin CPU-pohjaista inferenssiä.
  • Innovaatio: Avaa uusia mahdollisuuksia laitteistopuoleisille AI-sovelluksille, kuten reaaliaikaiselle kielentunnistimelle, älykkäille avustajille ja tietosuojan kannalta keskeisille sovelluksille ilman pilariippuvuutta.

Haasteet ja tulevaisuuden suunta

Vaikka 1-bittiset LLM-mallit lupaavat paljon, useita haasteita on vielä voitettava. Niihin kuuluvat kestävien 1-bittisten mallien kehittäminen moninaisiin tehtäviin, laskentalaitteiden optimointi 1-bittiseen laskentaan ja kehittäjien kannustaminen omaksumaan tämän uuden lähestymistavan. Lisäksi 1-bittisen kvantisoinnin tutkiminen tietokonegrafiikassa tai äänitehtävissä edustaa mielenkiintoista tulevaisuuden suuntaa.

Johtopäätös

Microsoftin BitNet.cpp:n julkaisu on merkittävä edistysaskel. Sallimalla tehokkaan 1-bittisen inferenssin standardi-CPU:illa, BitNet.cpp luo AI:n saatavuuden ja kestävyyden. Tämä kehys asettaa pohjan tehokkaammille ja kustannustehokkaammille LLM-malleille, työntäen eteenpäin sitä, mitä on mahdollista laitteistopuoleisella AI:lla.

Olen viettänyt viimeiset viisi vuotta uppoutumalla kiinnostavaan koneoppimisen ja syvän oppimisen maailmaan. Minun intohimoni ja asiantuntemukseni ovat johtaneet minun osallistumiseen yli 50:een monipuoliseen ohjelmistosuunnitteluhankkeeseen, joissa on erityisesti painottunut AI/ML. Minun jatkuva uteliaisuuteni on myös ohjannut minun luontaisen kielen prosessoinnin pariin, jota haluan tutkia tarkemmin.