bitnet.cpp ist das offizielle Inferenz-Framework für 1-Bit-LLMs (z. B. BitNet b1.58). Es bietet eine Reihe optimierter Kernel, die eine schnelle und verlustfreie Inferenz von 1,58-Bit-Modellen auf der CPU unterstützen (nächste Unterstützung für NPU und GPU).
Die erste Version von bitnet.cpp soll Inferenz auf CPUs unterstützen. bitnet.cpp erreicht auf ARM-CPUs Geschwindigkeitssteigerungen von 1,37x bis 5,07x , wobei größere Modelle größere Leistungssteigerungen verzeichnen. Darüber hinaus wird der Energieverbrauch um 55,4 % bis 70,0 % gesenkt, was die Gesamteffizienz weiter steigert. Auf x86-CPUs reichen die Geschwindigkeitssteigerungen von 2,37x bis 6,17x mit Energieeinsparungen zwischen 71,9 % und 82,2 % . Darüber hinaus kann bitnet.cpp ein 100-B-BitNet-b1.58-Modell auf einer einzelnen CPU ausführen und dabei Geschwindigkeiten erreichen, die mit dem menschlichen Lesen vergleichbar sind (5–7 Token pro Sekunde), was das Potenzial für die Ausführung von LLMs auf lokalen Geräten erheblich erhöht. Weitere Einzelheiten entnehmen Sie bitte dem technischen Bericht.
Bei den getesteten Modellen handelt es sich um Dummy-Setups, die in einem Forschungskontext verwendet werden, um die Inferenzleistung von bitnet.cpp zu demonstrieren.
Eine Demo von bitnet.cpp, auf dem ein BitNet b1.58 3B-Modell auf Apple M2 ausgeführt wird:
21.10.2024 1-Bit-KI-Infrarot: Teil 1.1, schnelle und verlustfreie BitNet b1.58-Inferenz auf CPUs
17.10.2024 bitnet.cpp 1.0 veröffentlicht.
21.03.2024 Die Ära der 1-Bit-LLMs__Training_Tips_Code_FAQ
27.02.2024 Die Ära der 1-Bit-LLMs: Alle großen Sprachmodelle sind in 1,58 Bit
17.10.2023 BitNet: Skalierung von 1-Bit-Transformatoren für große Sprachmodelle
Dieses Projekt basiert auf dem llama.cpp-Framework. Wir möchten allen Autoren für ihre Beiträge zur Open-Source-Community danken. Außerdem basieren die Kernel von bitnet.cpp auf den Lookup-Table-Methoden, die in T-MAC entwickelt wurden. Für die Inferenz allgemeiner Low-Bit-LLMs über ternäre Modelle hinaus empfehlen wir die Verwendung von T-MAC.
❗️ Wir verwenden vorhandene 1-Bit-LLMs, die auf Hugging Face verfügbar sind, um die Inferenzfunktionen von bitnet.cpp zu demonstrieren. Diese Modelle werden von Microsoft weder trainiert noch freigegeben. Wir hoffen, dass die Veröffentlichung von bitnet.cpp die Entwicklung von 1-Bit-LLMs in großen Umgebungen hinsichtlich Modellgröße und Trainingstokens inspirieren wird.
Modell | Parameter | CPU | Kernel | ||
---|---|---|---|---|---|
I2_S | TL1 | TL2 | |||
bitnet_b1_58-large | 0,7B | x86 | ✔ | ✘ | ✔ |
ARM | ✔ | ✔ | ✘ | ||
bitnet_b1_58-3B | 3.3B | x86 | ✘ | ✘ | ✔ |
ARM | ✘ | ✔ | ✘ | ||
Lama3-8B-1,58-100B-Tokens | 8,0B | x86 | ✔ | ✘ | ✔ |
ARM | ✔ | ✔ | ✘ |
Python>=3.9
cmake>=3,22
clang>=18
Desktop-Entwicklung mit C++
C++-CMake-Tools für Windows
Git für Windows
C++-Clang-Compiler für Windows
MS-Build-Unterstützung für LLVM-Toolset (clang)
Für Windows-Benutzer installieren Sie Visual Studio 2022. Aktivieren Sie im Installationsprogramm mindestens die folgenden Optionen (dadurch werden auch automatisch die erforderlichen zusätzlichen Tools wie CMake installiert):
Für Debian/Ubuntu-Benutzer können Sie das Skript mit dem automatischen Installationsskript herunterladen
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
Conda (sehr zu empfehlen)
Wichtig
Wenn Sie Windows verwenden, denken Sie bitte daran, für die folgenden Befehle immer eine Entwickler-Eingabeaufforderung/PowerShell für VS2022 zu verwenden
Klonen Sie das Repo
git clone --recursive https://github.com/microsoft/BitNet.gitcd BitNet
Installieren Sie die Abhängigkeiten
# (Empfohlen) Erstellen Sie eine neue Conda-Umgebungconda create -n bitnet-cpp python=3.9 Conda aktiviert Bitnet-CPP pip install -r Anforderungen.txt
Erstellen Sie das Projekt
# Laden Sie das Modell von Hugging Face herunter, konvertieren Sie es in das quantisierte GGUF-Format und erstellen Sie das Projektpython setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s# Oder Sie können das Modell manuell herunterladen und Ausführen mit lokalem pathhuggingface-cli herunterladen 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
Verwendung: setup_env.py [-h] [--hf-repo {1bitLLM/bitnet_b1_58-large,1bitLLM/bitnet_b1_58-3B,HF1BitLLM/Llama3-8B-1.58-100B-tokens}] [--model-dir MODEL_DIR] [ --log-dir LOG_DIR] [--quant-type {i2_s,tl1}] [--quant-embd] [--use-pretuned] Richten Sie die Umgebung für die Ausführung von Inferenzen ein optionale Argumente: -h, --help zeigt diese Hilfemeldung an und beendet den Vorgang --hf-repo {1bitLLM/bitnet_b1_58-large,1bitLLM/bitnet_b1_58-3B,HF1BitLLM/Llama3-8B-1.58-100B-tokens}, -hr {1bitLLM/bitnet_b1_58-large,1bitLLM/bitnet_b1_58-3B,HF1BitLLM/Llama3- 8B-1,58-100B-Tokens} Für die Schlussfolgerung verwendetes Modell --model-dir MODEL_DIR, -md MODEL_DIR Verzeichnis zum Speichern/Laden des Modells --log-dir LOG_DIR, -ld LOG_DIR Verzeichnis zum Speichern der Protokollierungsinformationen --quant-type {i2_s,tl1}, -q {i2_s,tl1} Quantisierungstyp --quant-embd Quantisiert die Einbettungen auf f16 --use-pretuned, -p Verwendet die vorab abgestimmten Kernel-Parameter
# Inferenz mit dem quantisierten Modell ausführenpython run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel ging zurück in den Garten. Mary ging in die Küche. Sandra ging in die Küche. John ging zurück in den Garten. Mary ging in die Küche. Sandra ging in die Küche. Sandra ging in den Flur. John ging ins Schlafzimmer. Mary ging zurück in den Garten. Wo ist Mary?# Antwort: Mary ist im Garten.
Verwendung: run_inference.py [-h] [-m MODEL] [-n N_PREDICT] -p PROMPT [-t THREADS] [-c CTX_SIZE] [-temp TEMPERATURE] Führen Sie eine Inferenz aus optionale Argumente: -h, --help zeigt diese Hilfemeldung an und beendet den Vorgang -m MODELL, --model MODELL Pfad zur Modelldatei -n N_PREDICT, --n-predict N_PREDICT Anzahl der Token, die beim Generieren von Text vorhergesagt werden sollen -p PROMPT, --prompt PROMPT Eingabeaufforderung zum Generieren von Text -t Threads, --threads Threads Anzahl der zu verwendenden Threads -c CTX_SIZE, --ctx-size CTX_SIZE Größe des Eingabeaufforderungskontexts -temp TEMPERATUR, --temperature TEMPERATUR Temperatur, ein Hyperparameter, der die Zufälligkeit des generierten Textes steuert
Wir stellen Skripte zur Verfügung, um den Inferenz-Benchmark auszuführen und ein Modell bereitzustellen.
usage: e2e_benchmark.py -m MODEL [-n N_TOKEN] [-p N_PROMPT] [-t THREADS] Setup the environment for running the inference required arguments: -m MODEL, --model MODEL Path to the model file. optional arguments: -h, --help Show this help message and exit. -n N_TOKEN, --n-token N_TOKEN Number of generated tokens. -p N_PROMPT, --n-prompt N_PROMPT Prompt to generate text from. -t THREADS, --threads THREADS Number of threads to use.
Hier ist eine kurze Erklärung jedes Arguments:
-m
, --model
: Der Pfad zur Modelldatei. Dies ist ein erforderliches Argument, das beim Ausführen des Skripts angegeben werden muss.
-n
, --n-token
: Die Anzahl der Token, die während der Inferenz generiert werden sollen. Es handelt sich um ein optionales Argument mit einem Standardwert von 128.
-p
, --n-prompt
: Die Anzahl der Eingabeaufforderungs-Tokens, die zum Generieren von Text verwendet werden sollen. Dies ist ein optionales Argument mit einem Standardwert von 512.
-t
, --threads
: Die Anzahl der Threads, die zum Ausführen der Inferenz verwendet werden sollen. Es handelt sich um ein optionales Argument mit dem Standardwert 2.
-h
, --help
: Hilfemeldung anzeigen und beenden. Verwenden Sie dieses Argument, um Nutzungsinformationen anzuzeigen.
Zum Beispiel:
python utils/e2e_benchmark.py -m /path/to/model -n 200 -p 256 -t 4
Dieser Befehl führt den Inferenz-Benchmark unter Verwendung des Modells unter /path/to/model
aus und generiert 200 Token aus einer 256-Token-Eingabeaufforderung unter Verwendung von 4 Threads.
Für das Modelllayout, das von keinem öffentlichen Modell unterstützt wird, stellen wir Skripte zur Verfügung, um ein Dummy-Modell mit dem angegebenen Modelllayout zu generieren und den Benchmark auf Ihrem Computer auszuführen:
python utils/generate-dummy-bitnet-model.py models/bitnet_b1_58-large --outfile models/dummy-bitnet-125m.tl1.gguf --outtype tl1 --model-size 125M# Benchmark mit dem generierten Modell ausführen, verwenden -m zur Angabe des Modellpfads, -p zur Angabe der verarbeiteten Eingabeaufforderung, -n zur Angabe der Anzahl der zu generierenden Tokenpython utils/e2e_benchmark.py -m models/dummy-bitnet-125m.tl1.gguf -p 512 -n 128