Instructions to use 1bitLLM/bitnet_b1_58-3B with libraries, inference providers, notebooks, and local apps. Follow these links to get started.
- Libraries
- Transformers
How to use 1bitLLM/bitnet_b1_58-3B with Transformers:
# Use a pipeline as a high-level helper from transformers import pipeline pipe = pipeline("text-generation", model="1bitLLM/bitnet_b1_58-3B")# Load model directly from transformers import AutoTokenizer, AutoModelForCausalLM tokenizer = AutoTokenizer.from_pretrained("1bitLLM/bitnet_b1_58-3B") model = AutoModelForCausalLM.from_pretrained("1bitLLM/bitnet_b1_58-3B") - Notebooks
- Google Colab
- Kaggle
- Local Apps
- vLLM
How to use 1bitLLM/bitnet_b1_58-3B with vLLM:
Install from pip and serve model
# Install vLLM from pip: pip install vllm # Start the vLLM server: vllm serve "1bitLLM/bitnet_b1_58-3B" # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:8000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "1bitLLM/bitnet_b1_58-3B", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker
docker model run hf.co/1bitLLM/bitnet_b1_58-3B
- SGLang
How to use 1bitLLM/bitnet_b1_58-3B with SGLang:
Install from pip and serve model
# Install SGLang from pip: pip install sglang # Start the SGLang server: python3 -m sglang.launch_server \ --model-path "1bitLLM/bitnet_b1_58-3B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "1bitLLM/bitnet_b1_58-3B", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }'Use Docker images
docker run --gpus all \ --shm-size 32g \ -p 30000:30000 \ -v ~/.cache/huggingface:/root/.cache/huggingface \ --env "HF_TOKEN=<secret>" \ --ipc=host \ lmsysorg/sglang:latest \ python3 -m sglang.launch_server \ --model-path "1bitLLM/bitnet_b1_58-3B" \ --host 0.0.0.0 \ --port 30000 # Call the server using curl (OpenAI-compatible API): curl -X POST "http://localhost:30000/v1/completions" \ -H "Content-Type: application/json" \ --data '{ "model": "1bitLLM/bitnet_b1_58-3B", "prompt": "Once upon a time,", "max_tokens": 512, "temperature": 0.5 }' - Docker Model Runner
How to use 1bitLLM/bitnet_b1_58-3B with Docker Model Runner:
docker model run hf.co/1bitLLM/bitnet_b1_58-3B
Is it bitnet {-1,0,1}?
I looked through many bitnet1.58 implementations and noticed that they all use the method suggested in "The Era from 1-bit LLMs: Training Tips, Code and FAQ". The weights of the models that are currently trained according to this recipe are not numbers in the set {-1, 0, 1} and values in the interval (0,1). Is this the way it should be?
- The formula describing the quanztization of weights ("The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits").
- Implementation proposal ("The Era of 1-bit LLMs: Training Tips, Code and FAQ").
- Weights quantization test.
- Model during training.
I think you're correct Remek. The scaling factor is only used inside of the RoundClip, not after it. I guess there is an error in their code.
And maybe this is why this model has such a big size of weights using fp32, which shouldn't be the case since its parameters are integers.
Also curious about it.
I think the reason is that, they are using high precision gemm to simulate the low precision forward process (int8 activation * ternary weight).
We can go back to the original paper, bitnet(2310.11453), eq.11.
The correct process during linear forward is:
# notice the following quant func will not include `/scale`
x_quant, x_scaling_factor = activation_quant(x)
w_quant, w_scaling_factor = weight_quant(w)
output = low_precision_compute(x_quant, w_quant)
output = output / x_scaling_factor / w_scaling_factor
Now, they are using high precision compute function to simulate this process. And in this way, we can convert the previous process like this:
# notice the following quant func will not include `/scale`
x_quant, x_scaling_factor = activation_quant(x)
x_quant = x_quant / x_scaling_factor
w_quant, w_scaling_factor = weight_quant(w)
w_quant = w_quant / w_scaling_factor
output = high_precision_compute(x_quant, w_quant)
# output = output / x_scaling_factor / w_scaling_factor
So I think their implementation is consistent with their claim.
Yes, I think so, EasonWei! Just for convenience in dequantization after multiplication. The simulation assigns the scaling factors in the quantization process, respectively.
