Bitnet.cpp 实践指南

1 位 LLM 是大型语言模型领域的一项重要创新。与使用 32 位或 16 位浮点数来表示权重和激活的传统 LLM 不同,1 位 LLM 将值量化为仅 1 位。这减少了计算占用空间并大大提高了推理速度。

最近,微软发布了 bitnet.cpp,这是一个用于在 1 位 LLM 上进行更快、无损推理的框架。本文对其进行了深入介绍,并解释了其在 LLM 领域的实用性。

1、了解 1 位 LLM

1 位 LLM 是一种独特的大型语言模型方法,可大幅减少训练和推理所需的计算资源。与使用 32 位或 16 位浮点数的传统 LLM 不同,1 位 LLM 将权重和激活量化为仅 1 位,从而显著压缩模型大小并加速推理生成。

我们通过一个简单的比较来了解传统 LLM 和 1 位 LLM 之间的区别:

传统 LLM –

  • 权重精度 = 32 位 = 4 字节
  • 参数 = 70 亿
  • 推理内存估算 = (7,000,000,000 * 4)/(1024^3) GB = 26.077 GB

1 位 LLM –

  • 权重精度 = 1 位 = 0.125 字节
  • 参数 = 70 亿
  • 推理内存估算 = (7,000,000,000 * 0.125)/(1024^3) GB = 0.815 GB

我们可以看到传统(32 位)LLM 和 1 位 LLM 之间所需的计算和存储资源的差异。

1 位 LLM 变体,即 BitNet b1.58 每个权重使用 1.58 位,并以三元格式 [-1,0,1] 存储权重,这意味着权重可以是 -1、0 或 +1。这种格式意味着普通 Transformer 模型中发生的矩阵乘法被简单的加法和减法所取代,从而降低了计算强度。

1 位 LLM 提供了帕累托解决方案来降低推理成本

BitNet b1.58 基于 BitNet 架构,保留了原始 1 位 BitNet 的所有优点,包括一种新的计算范式,该范式几乎不需要矩阵乘法运算,并且可以高度优化。它还表现出与原始 1 位模型相同的能耗。

2、bitnet.cpp 无损推理概述

1 位 LLM(例如 BitNet 1.58)的官方推理框架是 bitnet.cpp,微软最近将其开源。它提供了一组优化的内核,支持在 CPU 上对 1.58 位模型进行快速无损推理

bitnet.cpp在 x86 CPU 上实现了从 2.37 倍到 6.17 倍的显著加速,能耗降低了 71.9% 到 82.8%。在 ARM CPU 上,它实现了从 1.37 倍到 5.07 倍的加速,涵盖不同模型大小,能耗降低了 55.4% 到 70%,进一步提高了整体效率。

不同 BitNet b1.58 模型大小的推理速度和能耗(Apple M2 Ultra)
不同 BitNet b1.58 模型大小的推理速度和能耗(Intel i7-13700H)

bitnet.cpp 提供了一组优化的内核,旨在在 ARM 和 x86 架构上快速无损地推理 1.58 位模型。对 bitnet.cpp 的评估也是在推理速度和能耗方面完成的。它在 ARM 和 x86 架构上都比 llama.cpp 有显著的改进,尤其是在模型尺寸增加时。

3、bitnet.cpp 的实际实现

步骤 1:克隆官方存储库 –

!git clone --recursive https://github.com/microsoft/BitNet.git

步骤 2:更改当前工作目录 –

%cd /content/BitNet/

步骤 3:使用 requirements.txt 安装所需的依赖项 –

!pip install -r requirements.txt

步骤 4:从 HuggingFace 下载 1 位模型并将其转换为 GGUF 格式 –

!huggingface-cli download 1bitLLM/bitnet_b1_58-large --local-dir bitnet_b1_58-large\n!python setup_env.py -md bitnet_b1_58-large

步骤 5 – 使用 inference.py 脚本运行推理 –

!python run_inference.py -m bitnet_b1_58-large/ggml-model-i2_s.gguf -p "John went to eat dinner while his friend Janardan was playing on PlayStation. While playing Playstation, Janardan called his friend Johny. Who is Johny to John?\nAnswer:" -n 50 -temp 0

输出 –

Answer: Johny is a friend of John.

4、结束语

1 位 LLM 比传统 LLM 小得多,并且精度降低也会导致更快的计算,尤其是当硬件针对按位运算进行了优化时。bitnet.cpp 在优化内核方面提供了巨大的改进,用于推理 1 位 LLM,支持更快的推理和更低的能耗。它仍处于起步阶段但有望在 LLM 推理和节能时代带来重大变革。


原文链接:A Practitioner’s Guide on Inferencing over 1-bit LLMs using bitnet.cpp

BimAnt翻译整理,转载请标明出处