微软的BitNet项目在GitHub上的地址是https://github.com/microsoft/BitNet。
大型语言模型(LLMs)已经改变了人工智能的格局,其庞大的规模带来了巨大的计算成本。如果能大幅提高这些模型的效率而不牺牲性能会怎么样?研究人员正是通过BitNet b1.58实现了这一点,开启了1位元LLM的新时代。
bitnet.cpp 在 Apple M2 上运行 BitNet b1.58 3B 模型的一个示例
在我们继续之前,如果你对这个话题感兴趣,并且想支持我:
- 给我鼓掌点赞10次;这会对我有很大帮助。👏
- 在Medium上关注我,获取我最新的文章,别忘了来玩哦。
传统的大型语言模型(LLM)使用16位浮点数(FP16)来存储其参数,这需要大量的内存和计算资源支持。BitNet b1.58则采取了激进的做法:它将每个参数简化为仅三个值:-1、0或1。这一简单的改变带来了显著的效率提升,实现了高效的运算,同时保持了模型的准确性。
- 4.1倍更快的70B参数模型推理速度
- 内存消耗降低至原来的7.16倍
- 矩阵乘法能耗减少至原来的1/71.4
- 大批次处理时,吞吐量提升8.9倍
最好的部分是,这些效率提升几乎没有牺牲任何性能。从30亿参数起步,BitNet b1.58在各种基准测试中的表现不低于甚至超越传统的大型语言模型。
解析BitNet b1.58中的量化BitNet b1.58 的量化过程旨在将模型权重量化为三个值 −1, 0, 1,从而同时保持较高的准确性,实现显著的计算效率和内存效率。接下来是一个简单的解释:
1. 量化过程量化函数是关键,它负责将权重从全精度转换为三值(ternary)权重。它主要包含两个步骤。
A. 权重缩放:权重矩阵 W 通过其平均绝对值 γ 进行缩放,这里的 γ 是指整个矩阵的平均绝对值。这样可以确保所有权重相对于矩阵规模进行了归一化处理。缩放因子 γ 可以通过下面的公式来计算:
这里,n 和 m 是权重矩阵的维度,所有权重的绝对值之和提供了一个缩放因子,表示权重的平均绝对值。这个缩放让权重值更均匀,更容易被量化。
B. 四舍五入和截断:在缩放之后,每个权重都四舍五入到最接近 {-1, 0, 1} 集合中的整数值。此操作通过名为 RoundClip
的函数来完成,确保结果值被限制在这个三值集合内:
在这里,ϵ 是一个小数值,用于确保数值稳定性考虑。RoundClip
函数会将缩放后的权重四舍五入到最接近的整数,并确保该值位于 -1 和 1 之间。
假设我们有一个权重矩阵如下所示:
首先,我们来计算缩放系数(缩放系数γ):
缩放因子的公式
注意: 绝对值(记作 |x|)表示一个数在数线上离零的距离,不管这个数是正数还是负数。可以把它想象成测量一个数离零有多远。
例如,|-0.7| 可以表示为:
- -0.7在数轴上位于零点左边0.7个单位
- 绝对值仅仅给我们距离:0.7个单位,因此:
- |-0.7| = 0.7(负数转换为正数)
- |0.5| = 0.5(正数保持原样)
- |0.1| = 0.1(同样,正数保持原样)
所以:
γ = ¼(0.3 + 0.7 + 0.5 + 0.1)
这意味着γ等于这些数的平均值。
等于0.4
其次:我们将权重矩阵的值放大 γ 倍:接下来,我们将权重矩阵 W 的每个元素除以 γ,这样可以标准化权重。
四舍五入和取整公式
我们将 γ 改为 0.4
把每个矩阵的权重值除以0.4
也就是说,经过调整后的权重矩阵是:
RoundClip
功能:
现在我们对缩放矩阵中的每个元素应用 RoundClip
函数:RoundClip
函数的工作原理如下:
RoundClip(x,a,b)=max(a,min(b,round(x)))
或翻译为:
圆整裁剪(x,a,b)=max(a,min(b,round(x)))
- 第一步,将值取整到最接近的整数。
- 第二步,将结果限制在-1和1之间。
咱们一个个来看吧
- 对于这个数值 0.75 ,四舍五入后得到 1。由于 1 在该范围内,我们保持原样。因此,RoundClip(0.75,−1,1)=1。
- 对于这个数值 −1.75 ,四舍五入后得到 −2。由于 −2 在该范围之外,我们将它裁剪为 −1。因此,RoundClip(−1.75,−1,1)=−1。
- 对于这个数值 1.25 ,四舍五入后得到 1。由于 1 在该范围内,我们保持原样。因此,RoundClip(1.25,−1,1)=1。
- 对于这个数值 0.25,四舍五入后得到 0。由于 0 在该范围内,我们保持原样。因此,RoundClip(0.25,−1,1)=0。
最终的量化矩阵如下:
在对每个元素应用 RoundClip
函数之后,得到的量化权重矩阵是:
所以,这里有个矩阵:
量化为
- 按照其平均绝对值(γ)缩放了原始权重矩阵。
- 每个元素都被四舍五入到最接近的整数,并被限制在-1到1的范围内,从而得到了一个三值量化矩阵。
需求
所需软件版本:
Python>=3.9
cmake>=3.22
clang>=18
克隆这个仓库。
git clone --recursive https://github.com/microsoft/BitNet.git;
cd BitNet
注:上述命令用于克隆BitNet仓库并进入仓库目录。
安装依赖
# (推荐)新建一个 conda 环境.
conda create -n bitnet-cpp: python=3.9
conda activate bitnet-cpp:
pip install -r requirements.txt
开始项目:
# 从Hugging Face下载模型,将其转换为量化gguf格式,然后完成项目设置
python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
# 或者你可以手动下载模型,并使用本地路径运行
huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens
python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s
基本用法如下
# 使用量化模型进行推理
python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel 回到了花园。Mary 去了厨房。Sandra 先去了厨房,然后去了走廊。Sandra 去了走廊。John 去了卧室。Mary 又回到了花园。Mary 在哪里?\n答案是:" -n 6 -temp 0
# 输出:
# Daniel 回到了花园。Mary 去了厨房。Sandra 先去了厨房,然后去了走廊。Sandra 去了走廊。John 去了卧室。Mary 又回到了花园。Mary 在哪里?
# 答案是:Mary 在花园里。
结论部分
BitNet b1.58 处于高效人工智能的前沿,将1位精度模型带入主流。凭借其优化的内核技术、显著节省能源以及减少计算成本,BitNet 代表了可持续人工智能部署的未来。BitNet b1.58 奠定了坚实的技术基础,从高效的量化技术到动态代码生成,使其能够有效地在各种硬件架构上扩展。通过减少计算成本,它为在边缘设备或能源受限的环境中运行大规模 LLM 打开了大门。
合作 🤝: 有没有有趣的AI项目想一起做?我随时可以合作一起做AI和机器学习项目,也希望能认识一下其他领域的专业人士。随时可以合作
共同學習,寫下你的評論
評論加載中...
作者其他優質文章