- bitnet.cpp de Microsoft est le framework officiel d’inférence pour les grands modèles de langage (LLM) 1 bit, avec une inférence rapide et sans perte sur CPU et GPU
- Sur CPU ARM, il atteint une accélération de 1,37 à 5,07x et une réduction de la consommation d’énergie de 55,4 à 70 % ; sur CPU x86, une accélération de 2,37 à 6,17x et une réduction de 71,9 à 82,2 %
- L’ajout d’une implémentation de noyaux parallèles et de la quantification des embeddings apporte un gain de performances supplémentaire de 1,15 à 2,1x
- Le modèle BitNet b1.58 peut s’exécuter sur un seul CPU à une vitesse de 5 à 7 tokens par seconde, ce qui élargit les possibilités d’exploitation locale de modèles très volumineux
- Développé sur la base de llama.cpp et T-MAC, il contribue à l’extension de l’écosystème open source visant à améliorer l’efficacité de l’inférence des LLM à faible nombre de bits
Présentation de bitnet.cpp
- bitnet.cpp est le framework officiel d’inférence pour les LLM 1 bit (par ex. BitNet b1.58), avec des noyaux optimisés pour CPU et GPU
- La prise en charge des NPU est prévue ultérieurement
- La première version prend en charge l’inférence sur CPU et démontre des gains en vitesse et en efficacité énergétique sur les architectures ARM et x86
- CPU ARM : accélération de 1,37 à 5,07x, réduction d’énergie de 55,4 à 70 %
- CPU x86 : accélération de 2,37 à 6,17x, réduction d’énergie de 71,9 à 82,2 %
- Le modèle BitNet b1.58 de 100B de paramètres peut s’exécuter sur un seul CPU à une vitesse de 5 à 7 tokens par seconde
Dernières optimisations
- L’ajout d’une implémentation de noyaux parallèles, de la configuration de tiling et de la quantification des embeddings permet un gain de vitesse supplémentaire de 1,15 à 2,1x par rapport à la version précédente
- Des améliorations de performances ont été constatées sur diverses plateformes matérielles et charges de travail
- Les détails techniques sont fournis dans le document
optimization guide
Démo et modèles officiels
- Une démo est proposée pour exécuter le modèle BitNet b1.58 3B sur Apple M2
- Le modèle officiel BitNet-b1.58-2B-4T est publié sur Hugging Face et pris en charge sur CPU x86 et ARM
- Les modèles pris en charge incluent bitnet_b1_58-large(0.7B), bitnet_b1_58-3B(3.3B), Llama3-8B-1.58, Falcon3 et la série Falcon-E
Installation et compilation
- Prérequis : Python 3.9 ou plus, CMake 3.22 ou plus, Clang 18 ou plus
- Les utilisateurs de Windows doivent installer Visual Studio 2022
- Un script d’installation automatique est fourni pour les utilisateurs Debian/Ubuntu
- L’utilisation d’un environnement Conda est recommandée, et
setup_env.py permet de configurer l’environnement du modèle
- Après téléchargement du modèle depuis Hugging Face, l’exécution peut se faire à partir d’un chemin local
Utilisation et benchmarks
run_inference.py permet d’exécuter l’inférence sur modèle quantifié
- Principaux arguments : chemin du modèle (-m), prompt (-p), nombre de threads (-t), taille du contexte (-c), température (-temp)
- Le script
e2e_benchmark.py permet de mesurer les performances en spécifiant le nombre de tokens, la longueur du prompt et le nombre de threads
- En l’absence de modèle public,
generate-dummy-bitnet-model.py permet de générer un modèle factice puis d’exécuter des benchmarks
Conversion de modèle et FAQ
- Un script est fourni pour convertir des checkpoints
.safetensors au format gguf
- La FAQ explique comment résoudre les erreurs de compilation de llama.cpp (liées à std::chrono) et comment configurer l’environnement clang sous Windows
- Initialisation requise depuis l’invite de commandes développeur Visual Studio ou PowerShell
1 commentaires
Avis sur Hacker News
Microsoft utilise en réalité 2 bits et non 1,58 bit
Dans ce cas, on peut représenter quatre valeurs : -1, 0, 1, 2
Étant donné que les synapses inhibitrices représentent 20 à 30 %, cette structure semble bien correspondre à l’architecture du cerveau biologique
Je me demande souvent à quoi ressemblerait un LLM minimalement fonctionnel
Autrement dit, un modèle disposant du minimum d’informations, mais capable de produire des réponses suffisamment raisonnables en complétant le reste par des recherches Google
Si un acteur comme Encyclopedia Britannica vendait ses données aux LLM et proposait un service de validation des résultats, cela pourrait faire une vraie différence
Wikipedia est utile aussi, mais il est regrettable qu’il y ait autant d’erreurs et de biais humains
Les petits LLM évoluent déjà dans cette direction : ils manquent de culture générale, mais leur capacité à utiliser des outils (par ex. Google) s’améliore progressivement
En revanche, distinguer clairement ce qu’ils savent de ce qu’ils ignorent reste un problème difficile
Comme un ingénieur qui ne connaît pas un appareil particulier : il sait résoudre des problèmes, mais manque de connaissances détaillées
Je ne suis pas sûr qu’un tel modèle puisse vraiment s’en sortir simplement avec Google ou une recherche sur un wiki, mais l’architecture des LLM edge me semble appelée à devenir la norme
Plus une information figure dans les données d’entraînement, plus il devient facile de la retrouver et de l’interpréter
Une approche d’entraînement davantage fondée sur une mémoire externe (recherche, etc.) que sur la mémorisation interne pourrait donc être plus pratique
Pour ma part, je pense plutôt l’inverse
D’après l’article original (pdf), il faut environ 4 à 5 fois plus de paramètres qu’un modèle fp16
On peut certes en construire un soi-même, mais comme il faut l’entraîner à partir de zéro, les options restent limitées
Malgré cela, on peut s’attendre à une vitesse d’inférence supérieure à celle des modèles quantifiés récents en 4 bits ou 8 bits
Le véritable point clé, c’est le gain énergétique
On parle d’une réduction de 70 à 82 % pour l’inférence sur CPU
Si les modèles 1 bit deviennent suffisamment bons, on pourra faire tourner des LLM sur du matériel classique sans GPU, ce qui changera la donne en matière d’accessibilité
bitnet.cpp est présenté comme le framework officiel d’inférence pour les LLM 1 bit (BitNet b1.58, etc.),
mais il y a une confusion entre « 1 bit » et « 1 trit »
Mélanger les deux notions entretient la confusion
Je suis content de voir que ce projet continue d’être développé
L’an dernier, en lisant ce billet lié, j’y avais vu du potentiel, mais j’étais déçu de ne pas voir arriver de nouveaux modèles
Ce qui serait vraiment intéressant, ce serait d’entraîner directement des modèles binaires sans opérations en virgule flottante
Il existe un article à ce sujet dans NeurIPS 2024
Dire qu’on peut « exécuter un BitNet 100B » ne signifie pas qu’un tel modèle existe, mais que le framework d’inférence le permet
Même en cherchant « 1-bit 100b model », on ne trouve aucun modèle téléchargeable
La qualité de sortie du modèle ressemble davantage à un marmonnement de niveau GPT-2, avec répétition intégrale des paragraphes
Il recycle même en boucle de fausses citations comme
(Jenkins, 2010)Le titre est trompeur
En réalité, ce n’est pas un modèle 100B entraîné, mais un framework d’inférence capable de le traiter
Je fais tourner des modèles quantifiés 70B sur un M2 Max 96GB avec llama.cpp + LiteLLM, et le goulot d’étranglement vient de la bande passante mémoire
L’approche en 1,58 bit remplace les multiplications matricielles par des additions, donc le profil de calcul sur CPU est fondamentalement différent
Si l’on pouvait faire tourner un modèle de classe 100B sur un seul cœur CPU à 5 à 7 tokens par seconde, ce serait un point de bascule pour l’inférence on-device
Le framework est prêt ; il faut maintenant que quelqu’un entraîne réellement le modèle
Le résultat concret paraît maigre par rapport à la communication
Les GPU resteraient sans doute nécessaires pour l’entraînement, mais le matériel d’inférence pourrait devenir bien plus simple
J’ai déjà utilisé un modèle qui sortait 7 tokens/s, et la sensation était aussi frustrante que de marcher derrière quelqu’un de lent
En local, il faudrait viser au minimum 10 tokens/s
Les instructions FMA (Fused Multiply-Add) des CPU modernes ont un débit presque identique à celui d’une simple addition
Je me demande quand les PC équipés de NPU commenceront réellement à tenir leurs promesses
AMD obtient de bons résultats avec des noyaux hybrides d’inférence NPU/iGPU
Si de tels gros modèles tournent sur NPU, l’efficacité énergétique sera bien meilleure que sur CPU
Depuis, je suis devenu fan des NPU. Ce n’est certes pas du niveau d’une RTX 5090, mais c’est bien plus efficace qu’un CPU
L’écosystème logiciel reste instable, mais cela fonctionne avec une utilisation CPU/GPU quasiment nulle
J’avais compris qu’ils étaient surtout conçus autour de la basse consommation