Modele Či platforme AI
Cadru de inferenČÄ Microsoft aduce modelele de limbaj mari de 1 bit pe dispozitive locale
Pe 17 octombrie 2024, Microsoft a anunČat BitNet.cpp (MSFT ), un cadru de inferenČÄ proiectat pentru a rula modele de limbaj mari cuantificate la 1 bit. BitNet.cpp reprezintÄ o progres semnificativ ÃŪn Gen AI, permiČÃĒnd implementarea eficientÄ a modelelor de limbaj mari de 1 bit pe procesoare standard, fÄrÄ a necesita GPU-uri scumpe. Acest lucru democratizeazÄ accesul la modelele de limbaj mari, fÄcÃĒndu-le disponibile pe o gamÄ largÄ de dispozitive Či oferind noi posibilitÄČi ÃŪn aplicaČiile de inteligenČÄ artificialÄ pe dispozitive.
ÃnČelegerea modelelor de limbaj mari de 1 bit
Modelele de limbaj mari (LLM) au necesitat ÃŪn mod tradiČional resurse computaČionale semnificative din cauza utilizÄrii numerelor cu virgulÄ mobilÄ de ÃŪnaltÄ precizie (ÃŪn general FP16 sau BF16) pentru greutÄČile modelului. AceastÄ necesitate a fÄcut implementarea modelelor de limbaj mari scumpÄ Či consumatoare de energie.
Ãn esenČÄ, modelele de limbaj mari de 1 bit utilizeazÄ tehnici de cuantificare extremÄ pentru a reprezenta greutÄČile modelului utilizÃĒnd numai trei valori posibile: -1, 0 Či 1, de unde Či termenul de â1,58 bitâ (deoarece necesitÄ puČin mai mult de un bit pentru a codifica trei stÄri).
Sistemul de greutÄČi ternar
Conceptul
Cuantificarea la 1 bit ÃŪn BitNet.cpp este un sistem de greutÄČi ternar. BitNet funcČioneazÄ cu numai trei valori posibile pentru fiecare parametru:
- -1 (negativ)
- 0 (neutru)
- 1 (pozitiv)
Acest lucru duce la o cerinČÄ de stocare de aproximativ 1,58 biČi pe parametru, de unde Či numele BitNet b1.58. Reducerea drasticÄ a lÄČimii bitului parametrului conduce la o reducere impresionantÄ a utilizÄrii memoriei Či a complexitÄČii computaČionale, deoarece majoritatea multiplicÄrilor cu virgulÄ mobilÄ sunt ÃŪnlocuite cu simple adunÄri Či scÄderi.
Baza matematicÄ
Cuantificarea la 1 bit implicÄ transformarea greutÄČilor Či a activÄrilor ÃŪn reprezentarea lor ternarÄ prin urmÄtorii paČi:
1. Cuantificarea greutÄČilor
Cuantificarea greutÄČilor implicÄ centralizarea lor ÃŪn jurul mediei (Îą), rezultÃĒnd o reprezentare ternarÄ. Transformarea este exprimatÄ matematic astfel:
Wfâ=Sign(WâÎą)
Unde:
- W este matricea de greutÄČi originalÄ.
- Îą este media greutÄČilor.
- Sign(x) returneazÄ +1 dacÄ x > 0 Či -1 ÃŪn caz contrar.
2. Cuantificarea activÄrilor
Cuantificarea activÄrilor asigurÄ cÄ intrÄrile sunt limitate la o lÄČime de bit specificatÄ:
x^eâ=Quant(x)=Clip(ÎģxÃQbââ,âQbâ+Ïĩ,QbââÏĩ)
Unde:
- Qb = 2(bâ1)2^{(b-1)} este nivelul maxim de cuantificare pentru lÄČimea de b biČi.
- Îģ este valoarea absolutÄ maximÄ a lui x (notatÄ cu âĢâĢxâĢâĢâ).
- Îĩ este un numÄr mic pentru a preveni depÄČirea ÃŪn timpul calculelor.
3. OperaČia BitLinear
Stratul BitLinear ÃŪnlocuieČte multiplicÄrile matriciale tradiČionale cu o operaČie simplificatÄ:
y=WfâÃx^eâÃ(QbâÎēÎģâ)
Unde:
- Îē este un factor de scalare utilizat pentru a minimiza erorile de aproximare.
- Îģ scaleazÄ activÄrile.
- Q_b este factorul de cuantificare.
AceastÄ transformare permite calcule eficiente, pÄstrÃĒnd ÃŪn acelaČi timp performanČa modelului.
ImplicaČii de performanČÄ
EficienČÄ de memorie
Sistemul de greutÄČi ternar reduce semnificativ cerinČele de memorie:
- Modelele de limbaj mari tradiČionale: 16 biČi pe greutate
- BitNet.cpp: 1,58 biČi pe greutate
AceastÄ reducere se traduce ÃŪntr-o economie de aproximativ 90% a memoriei comparativ cu modelele tradiČionale de 16 biČi, permiČÃĒnd modele mai mari sÄ se ÃŪncadreze ÃŪn aceleaČi constrÃĒngeri de hardware.

VitezÄ de inferenČÄ, eficienČÄ energeticÄ (Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)
Â
1. VitezÄ de inferenČÄ: Mai rapidÄ pe ambele procesoare
Viteza de inferenČÄ este reprezentatÄ ca numÄrul de tokeni procesaČi pe secundÄ. IatÄ o descriere a observaČiilor:
- Pe Apple M2 Ultra: BitNet.cpp atinge pÃĒnÄ la 5,07x viteza pentru modele mai mari (30B) comparativ cu Llama.cpp, cu o vitezÄ maximÄ de 593,43 tokeni pe secundÄ pentru un model de 125M, ceea ce reprezintÄ o 1,37x vitezÄ. Pentru modele mai mari, cum ar fi cele de 3,8B Či 7B, BitNet.cpp menČine o vitezÄ de peste 84,77 tokeni pe secundÄ, demonstrÃĒnd eficienČa sa la scarÄ largÄ.
- Pe Intel (INTC ) i7-13700H: BitNet.cpp atinge ÃŪmbunÄtÄČiri Či mai dramatice ale vitezei. La dimensiunea modelului de 7B, BitNet.cpp oferÄ o creČtere incredibilÄ de 5,68x a vitezei comparativ cu Llama.cpp. Pentru modele mai mici, cum ar fi cel de 125M, proceseazÄ 389,08 tokeni pe secundÄ, ceea ce reprezintÄ o 2,37x vitezÄ mai mare decÃĒt Llama.cpp.
2. EficienČÄ energeticÄ: Un joc schimbat pentru dispozitivele de margine
Graficele furnizate includ, de asemenea, comparaČii de costuri energetice, care aratÄ o reducere semnificativÄ a consumului de energie pe token procesat:
- Pe Apple M2 Ultra: Economia de energie a BitNet.cpp este substanČialÄ. Pentru modelul de 700M, consumÄ 55,4% mai puČinÄ energie pe token comparativ cu Llama.cpp, scÄzÃĒnd de la 0,314 la 0,140. AceastÄ tendinČÄ continuÄ pentru modele mai mari, modelul de 70B arÄtÃĒnd o reducere de 70,0% a consumului de energie.
- Pe Intel i7-13700H: BitNet.cpp oferÄ 71,9% economie de energie pentru modelul de 700M, consumul scÄzÃĒnd de la 1,367 la 0,384. DeČi datele despre consumul de energie pentru modelul de 70B ÃŪn Llama.cpp nu sunt disponibile, BitNet.cpp rÄmÃĒne eficient, cu un consum de energie de 17,33 pentru modelul de 70B.
3. DepÄČirea baremului de citire umanÄ
Una dintre cele mai interesante observaČii din aceste grafice este referirea la viteza de citire umanÄ, marcatÄ la 5-7 tokeni pe secundÄ. AceastÄ linie roČie aratÄ cÄ ambele implementÄri, ÃŪn special BitNet.cpp, pot depÄČi cu uČurinČÄ viteza de citire umanÄ chiar Či pentru cele mai mari modele:
- Pe Apple M2 Ultra, BitNet.cpp depÄČeČte viteza de citire umanÄ pentru toate dimensiunile modelului, cea mai micÄ vitezÄ fiind de 8,67 tokeni pe secundÄ pentru un model de 70B.
- Pe Intel i7-13700H, modelul de 100B atinge ÃŪncÄ 1,70 tokeni pe secundÄ, aproape atingÃĒnd gama inferioarÄ a vitezei de citire umanÄ, ÃŪn timp ce toate modelele mai mici depÄČesc acest barem.
ConsideraČii de antrenare
Estimatorul Straight-Through (STE)
Deoarece cuantificarea la 1 bit introduce funcČii nediferenČiate, antrenarea implicÄ o tehnicÄ specializatÄ cunoscutÄ sub numele de Estimatorul Straight-Through (STE). Ãn aceastÄ abordare, gradientul curge nemodificat prin punctele nediferenČiate. IatÄ o implementare simplificatÄ ÃŪn Python:
class StraightThroughEstimator(Function): @staticmethod def forward(ctx, input): return input.sign() @staticmethod def backward(ctx, grad_output): return grad_output
Antrenarea cu precizie mixtÄ
Pentru a menČine stabilitatea ÃŪn timpul antrenÄrii, se utilizeazÄ precizie mixtÄ:
- GreutÄČi Či activÄri: Cuantificate la precizie de 1 bit.
- Gradient Či stÄri ale optimizatorului: Stocate ÃŪntr-o precizie mai mare.
- GreutÄČi latente: MenČinute ÃŪntr-o precizie ridicatÄ pentru a facilita actualizÄri precise ÃŪn timpul antrenÄrii.
Strategia de ratÄ de ÃŪnvÄČare mare
O provocare unicÄ cu modelele de 1 bit este aceea cÄ actualizÄrile mici nu pot afecta greutÄČile binarizate. Pentru a contracara acest lucru, rata de ÃŪnvÄČare este crescutÄ, asigurÃĒnd o convergenČÄ mai rapidÄ Či o optimizare mai bunÄ comparativ cu abordÄrile tradiČionale.
Cuantificarea Či normalizarea grupului
BitNet.cpp introduce cuantificarea Či normalizarea grupului pentru a ÃŪmbunÄtÄČi paralelismul modelului. Ãn loc de calcularea parametrilor pentru ÃŪntreaga matrice de greutÄČi, BitNet ÃŪmparte greutÄČile Či activÄrile ÃŪn multiple grupuri (G).
Acest grupare permite procesarea paralelÄ eficientÄ fÄrÄ comunicare suplimentarÄ ÃŪntre grupuri, permiČÃĒnd antrenarea Či inferenČa modelului la scarÄ largÄ.
Note de implementare Či optimizÄri
Optimizarea CPU
BitNet.cpp utilizeazÄ mai multe optimizÄri de nivel scÄzut pentru a atinge performanČa maximÄ a CPU:
- OperaČii vectorizate: UtilizeazÄ instrucČiuni SIMD pentru manipularea eficientÄ a biČilor.
- Acces la memorie prietenos cu cache-ul: StructureazÄ datele pentru a minimiza ratele de eroare ale cache-ului.
- Procesare paralelÄ: Distribuie sarcina de lucru eficient pe multiple nuclee CPU.
IatÄ un exemplu de funcČie cheie care implementeazÄ cuantificarea Či inferenČa ÃŪn BitNet:
Modele suportate
Lansarea curentÄ a BitNet.cpp suportÄ urmÄtoarele modele de limbaj mari de 1 bit disponibile pe Hugging Face:
- bitnet_b1_58-large (0,7 miliarde de parametri)
- bitnet_b1_58-3B (3,3 miliarde de parametri)
- Llama3-8B-1.58-100B-tokens (8,0 miliarde de parametri)
Aceste modele sunt disponibile public pentru a demonstra capacitÄČile de inferenČÄ ale cadrului. DeČi nu au fost antrenate sau lansate oficial de Microsoft, ele ilustreazÄ versatilitatea cadrului.
Ghid de instalare
Pentru a ÃŪncepe cu BitNet.cpp, urmaČi paČii de mai jos:
PrecondiČii
- Python >= 3.9
- CMake >= 3.22
- Clang >= 18
- Conda (recomandat)
Pentru utilizatorii Windows, Visual Studio ar trebui sÄ fie instalat cu urmÄtoarele componente activate:
- Dezvoltare de birou cu C++
- Unelte C++-CMake pentru Windows
- Git pentru Windows
- Compilator C++-Clang pentru Windows
- Suport MS-Build pentru setul de instrumente LLVM (Clang)
Pentru utilizatorii Debian/Ubuntu, este disponibil un script de instalare automatÄ:
Instalare pas cu pas
- ClonaČi depozitul:
- InstalaČi dependenČele:
- ConstruiČi Či pregÄtiČi proiectul: PuteČi descÄrca direct un model de pe Hugging Face Či sÄ-l convertiČi ÃŪntr-un format cuantificat:
Alternativ, puteČi descÄrca Či converti manual modelul:
Rularea inferenČei cu BitNet.cpp
Pentru a rula inferenČa utilizÃĒnd cadrul, folosiČi urmÄtoarea comandÄ:
ExplicaČie:
-mspecificÄ calea fiČierului model.-pdefineČte textul de intrare.-nseteazÄ numÄrul de tokeni de prezis.-tempajusteazÄ aleatoritatea de eČantionare (temperatura) ÃŪn timpul inferenČei.
Exemplu de ieČire
Detalii tehnice ale BitNet.cpp
Stratul BitLinear
BitNet.cpp implementeazÄ o arhitecturÄ Transformer modificatÄ, ÃŪnlocuind multiplicÄrile matriciale standard cu operaČii BitLinear. AceastÄ abordare centralizeazÄ greutÄČile spre zero ÃŪnainte de cuantificare Či le scaleazÄ pentru a reduce erorile de aproximare. FuncČia de transformare cheie aratÄ astfel:
# FuncČie de binarizare pentru greutÄČi de 1 bit def binarize_weights(W): alpha = W.mean() W_binarized = np.sign(W - alpha) return W_binarized
CombinaČia greutÄČilor centralizate Či a scalÄrii asigurÄ cÄ eroarea de cuantificare rÄmÃĒne minimÄ, pÄstrÃĒnd astfel performanČa.
Impactul ÃŪn industrie
BitNet.cpp ar putea avea implicaČii de anvergurÄ pentru implementarea modelelor de limbaj mari:
- Accesibilitate: Permite modelelor de limbaj mari sÄ ruleze pe dispozitive standard, democratizÃĒnd accesul la inteligenČa artificialÄ puternicÄ.
- EficienČÄ costalÄ: Reduce nevoia de GPU-uri scumpe, micČorÃĒnd bariera pentru adoptare.
- EficienČÄ energeticÄ: EconomiseČte energie prin utilizarea inferenČei pe bazÄ de CPU.
- InovaČie: Deschide noi posibilitÄČi pentru aplicaČiile de inteligenČÄ artificialÄ pe dispozitive, cum ar fi traducerea ÃŪn timp real, asistenČi vocali Či aplicaČii cu focus pe confidenČialitate fÄrÄ dependenČe de cloud.
ProvocÄri Či direcČii viitoare
DeČi modelele de limbaj mari de 1 bit oferÄ perspective promiČÄtoare, mai existÄ provocÄri. Acestea includ dezvoltarea de modele robuste de 1 bit pentru diverse sarcini, optimizarea hardware-ului pentru computaČia de 1 bit Či ÃŪncurajarea dezvoltatorilor sÄ adopte acest nou paradigma. Explorarea cuantificÄrii de 1 bit pentru sarcini de vedere de computer sau audio reprezintÄ o direcČie viitoare interesantÄ.
Concluzie
Lansarea BitNet.cpp de cÄtre Microsoft reprezintÄ o avansare semnificativÄ. Prin permiterea inferenČei eficiente de 1 bit pe procesoare standard, BitNet.cpp creeazÄ accesibilitatea Či durabilitatea inteligenČei artificiale. Acest cadru stabileČte scena pentru modele de limbaj mari mai portabile Či mai rentabile, ÃŪmpingÃĒnd ceea ce este posibil cu inteligenČa artificialÄ pe dispozitive.













