- O bitnet.cpp da Microsoft é o framework oficial de inferência para grandes modelos de linguagem (LLMs) de 1 bit, com suporte a inferência rápida e sem perdas em CPU e GPU
- Alcançou ganho de velocidade de 1,37~5,07x e redução de energia de 55,4~70% em CPUs ARM, além de ganho de velocidade de 2,37~6,17x e redução de energia de 71,9~82,2% em CPUs x86
- Com a adição de implementação de kernel paralela e quantização de embeddings, oferece ganho adicional de desempenho de 1,15~2,1x em relação à versão anterior
- É possível executar o modelo BitNet b1.58 a 5~7 tokens por segundo em uma única CPU, ampliando a viabilidade de operar modelos ultragrandes em ambiente local
- Desenvolvido com base em llama.cpp e T-MAC, contribui para a expansão do ecossistema open source voltado à eficiência de inferência de LLMs de baixo bit
Visão geral do bitnet.cpp
- O bitnet.cpp é o framework oficial de inferência para LLMs de 1 bit (ex.: BitNet b1.58), oferecendo kernels otimizados em CPU e GPU
- O suporte a NPU será adicionado no futuro
- A primeira versão oferece suporte à inferência em CPU e comprovou melhorias em velocidade e eficiência energética tanto em arquiteturas ARM quanto x86
- CPU ARM: ganho de velocidade de 1,37~5,07x, redução de energia de 55,4~70%
- CPU x86: ganho de velocidade de 2,37~6,17x, redução de energia de 71,9~82,2%
- É possível executar o modelo BitNet b1.58 de 100B parâmetros a 5~7 tokens por segundo em uma única CPU
Otimizações mais recentes
- Foram adicionados recursos de implementação de kernel paralela, configuração de tiling e quantização de embeddings, alcançando ganho adicional de velocidade de 1,15~2,1x em relação à versão anterior
- Melhorias de desempenho foram verificadas em várias plataformas de hardware e cargas de trabalho
- Detalhes técnicos estão disponíveis no documento
optimization guide
Demo e modelos oficiais
- Há uma demo executando o modelo BitNet b1.58 3B em um Apple M2
- O modelo oficial BitNet-b1.58-2B-4T foi publicado no Hugging Face, com suporte para CPUs x86 e ARM
- Os modelos compatíveis incluem bitnet_b1_58-large(0.7B), bitnet_b1_58-3B(3.3B), Llama3-8B-1.58, Falcon3 e a série Falcon-E
Instalação e build
- Requisitos: Python 3.9 ou superior, CMake 3.22 ou superior, Clang 18 ou superior
- Usuários de Windows precisam instalar o Visual Studio 2022
- Usuários de Debian/Ubuntu têm à disposição um script de instalação automática
- Recomenda-se o uso de ambiente Conda, e é possível configurar o ambiente do modelo com
setup_env.py
- Após baixar o modelo do Hugging Face, ele pode ser executado a partir de um caminho local
Uso e benchmark
- Execute a inferência de modelo quantizado com
run_inference.py
- Principais argumentos: caminho do modelo (-m), prompt (-p), número de threads (-t), tamanho de contexto (-c), temperatura (-temp)
- Com o script
e2e_benchmark.py, é possível medir desempenho definindo número de tokens, comprimento do prompt e número de threads
- Se não houver modelo público disponível, é possível gerar um modelo dummy e executar benchmark com
generate-dummy-bitnet-model.py
Conversão de modelo e FAQ
- Há um script para converter checkpoints
.safetensors para o formato gguf
- O FAQ orienta como resolver erros de build do llama.cpp (relacionados a std::chrono) e como configurar o ambiente clang no Windows
- É necessário inicializar o ambiente no prompt de desenvolvedor do Visual Studio ou no PowerShell
1 comentários
Opiniões no Hacker News
A Microsoft na prática está usando 2 bits, não 1,58 bit
Nesse caso, é possível representar quatro valores: -1, 0, 1 e 2
Considerando que sinapses inibitórias correspondem a 20~30%, isso parece combinar bem com a estrutura do cérebro biológico
Frequentemente fico pensando em como seria um “LLM minimamente funcional”
Ou seja, um modelo que tenha só o mínimo de informação e complemente o resto pesquisando no Google, mas ainda assim consiga dar respostas razoáveis
Acho que faria uma grande diferença se algo como a Encyclopedia Britannica vendesse dados para LLMs e oferecesse um serviço de validação dos resultados
A Wikipedia também é boa, mas incomoda o fato de haver muitos erros e vieses humanos
LLMs pequenos já estão evoluindo nessa direção: têm pouco conhecimento geral, mas a capacidade de usar ferramentas (por exemplo, pesquisar no Google) está melhorando cada vez mais
Ainda assim, continua sendo difícil distinguir claramente entre o que eles sabem e o que não sabem
Como um engenheiro que não conhece um dispositivo específico: tem capacidade de resolver problemas, mas não tem o conhecimento detalhado
Não sei se um modelo assim conseguiria se virar apenas com pesquisas no Google ou na wiki, mas a arquitetura de LLM de borda parece algo que vai virar padrão no futuro
Quanto mais a informação estiver presente nos dados de treino, mais fácil fica buscá-la e interpretá-la
Por isso, um treinamento mais dependente de memória externa (busca etc.) do que de memorização interna pode ser algo prático
Eu, na verdade, penso o contrário
Segundo o artigo original (pdf), ele exige cerca de 4 a 5 vezes mais parâmetros em comparação com um modelo fp16
Dá para construir algo por conta própria, mas como é preciso treinar desde o início, as opções são limitadas
Ainda assim, a expectativa é que a velocidade de inferência seja maior do que a dos modelos quantizados mais recentes de 4 bits e 8 bits
O verdadeiro ponto principal é o efeito de economia de energia
Dizem que, em inferência por CPU, a redução pode chegar a 70~82%
Se um modelo de 1 bit ficar bom o suficiente, será possível rodar LLMs em hardware comum sem GPU, o que mudaria o cenário de acessibilidade
Dizem que o bitnet.cpp é o framework oficial de inferência para LLMs de 1 bit (como o BitNet b1.58),
mas existe uma confusão entre “1 bit” e “1 trit”
Misturar os dois conceitos gera confusão
Fico feliz em ver este projeto continuar sendo desenvolvido
No ano passado, li este texto relacionado e vi potencial, mas foi frustrante não surgirem novos modelos
O realmente interessante seria seguir na direção de treinar diretamente modelos binários sem operações de ponto flutuante
Há um artigo relacionado na NeurIPS 2024
Dizer que “é possível rodar um BitNet 100B” não significa que o modelo exista, mas sim que o framework de inferência é viável
Mesmo pesquisando por “1-bit 100b model”, não há nenhum modelo disponível para download
A qualidade da saída do modelo é mais parecida com um balbucio nível GPT-2, repetindo os mesmos parágrafos
Ele até reutiliza continuamente citações falsas como
(Jenkins, 2010)O título induz ao erro
Na prática, não é um modelo 100B treinado, mas um framework de inferência capaz de lidar com isso
Eu rodo um modelo quantizado de 70B em um M2 Max 96GB com llama.cpp + LiteLLM, e o gargalo é a largura de banda de memória
A abordagem de 1,58 bit tem uma estrutura que troca multiplicação de matrizes por soma, então no CPU ela tem um padrão de computação fundamentalmente diferente
Se der para rodar um modelo de classe 100B em um único núcleo de CPU a 5~7 tokens por segundo, isso será um ponto de virada para a inferência on-device
O framework está pronto; agora falta alguém realmente treinar o modelo
O resultado prático é fraco para tanto marketing
O treinamento ainda exigiria GPU, mas o hardware de inferência poderia ser muito mais simples
Já usei um modelo que gerava 7 tokens/s, e a sensação era de frustração, como andar atrás de alguém muito lento
Em ambiente local, o ideal é mirar em pelo menos 10 tokens/s
As instruções modernas de FMA (Fused Multiply-Add) em CPUs têm uma vazão quase igual à de somas simples
Fico curioso para saber quando os PCs com NPU vão começar a entregar resultados de verdade
A AMD está tendo bons resultados com kernels híbridos de inferência NPU/iGPU
Se modelos grandes rodarem em NPUs, a eficiência energética deve ser muito melhor do que em CPUs
Desde então virei fã de NPU. Claro, não é nível RTX 5090, mas é muito mais eficiente que CPU
O ecossistema de software ainda é instável, mas funciona com uso quase zero de CPU/GPU
Eu entendia que elas eram projetadas com foco em baixo consumo de energia