玩一玩微软的 1 bit 模型:BitNet. 一个 CPU 就能跑起来的大模型

作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!


能不能用 1 个 CPU 加很少的内存就能把大模型跑起来?

微软开源的 BitNet (https://github.com/microsoft/BitNet) 实现了这一点。

可以通过这个网址去在线体验这个模型的效果:https://demo-bitnet-h0h8hcfqeqhrf5gf.canadacentral-01.azurewebsites.net/

我在官方代码的基础上做了一个 Dockerfile,有 docker 环境就能轻松编译和运行。

请看:https://github.com/ahfuzhang/BitNet

编译

使用如下步骤可以编译这个 BitNet 模型的运行环境:

bash 复制代码
git clone https://github.com/ahfuzhang/BitNet.git
cd BitNet

# 克隆子仓库
git submodule update --init --recursive

# docker build
docker build -t local-bitnet:latest .
# 或者 make -f Makefile.docker build TAG=latest

运行完后, docker image ls -a | grep -i bitnet 可以看见一个 1.7G 的镜像。

运行

  • 直接输入提示词的模式
bash 复制代码
docker run --rm -it \
		--cpuset-cpus="8" \
		-m 512m \
		local-bitnet:latest \
        python3 run_inference.py -m models/BitNet-b1.58-2B-4T/ggml-model-i2_s.gguf -t 1 -c 4096 -n 1024 -temp 0.7 -p "explain what is '1-bit model'? "
  • 对话模式
bash 复制代码
docker run --rm -it \
		--cpuset-cpus="8" \
		-m 512m \
		local-bitnet:latest \
        python3 run_inference.py -m models/BitNet-b1.58-2B-4T/ggml-model-i2_s.gguf -t 1 -c 4096 -n 1024 -temp 0.7 -p "" -cnv
  • 可以发现:1 个 cpu, 512mb 内存就能跑起来,出 token 的速度也很快
  • -t 这个参数是设置线程数的,线程数要与 docker 分配的核数一致
  • -c 是上下文窗口大小
  • -n 是输出内容的限制
  • -temp 是温度值。测试发现,小于 0.7 会出现随机的重复单词。

感受

如果你问我 1045 乘以 6596 等于多少?

我会立即回答你:2368794 !

你别管对不对,你就说快不快吧......

BitNet 的问题还非常多:

  • 在 MacOS 下运行,出现随机的无意义的单词;
  • 有时候,会把输出过的一段话循环的反复输出
  • 有时候,会不断重复某个单词停不下来
  • 有时候,对于知识性的问题,还是勉强得到了正确可读的结果

希望这个 BitNet 能够尽快完善,未来能够在手机上运行起来一个本地知识库 ------ 一般性的人类知识被包含在一个手机可运行的 APP 中!