序言:斯坦福大学利用LoLCats技术将1000亿参数模型的训练成本降低到20美元;微软则通过BitNet技术进一步将模型量化,使其能在消费类电子产品中运行,例如个人电脑、手机、智能手表等嵌入式设备。人工智能就这样顺理成章的进入了大家的日常生活。
关联的文章:《斯坦福大学推出线性前沿LLM技术,训练模型成本仅为20美元》
大型语言模型(LLMs)已经彻底改变了人工智能的格局,但它们庞大的体积也带来了同样巨大的计算成本。如果我们能够在不牺牲性能的前提下,极大提升这些模型的效率,会怎么样呢?这正是研究人员通过BitNet b1.58所实现的,它开启了1位LLM的时代。
在Apple M2上运行BitNet b1.58 3B模型的bitnet.cpp演示
1位LLM的承诺
传统的LLM使用16位浮动小数(FP16)来存储其参数,这需要大量的内存和计算资源。而BitNet b1.58采取了一个激进的做法:它将每个参数减少到仅有三种可能的值:-1、0或1。这个简单的变化带来了显著的效率提升,且在保持模型准确性的同时,实现了高效的运算。
• 70B参数模型推理速度提升4.1倍
• 内存消耗减少至最多7.16倍
• 矩阵乘法的能耗降低至71.4倍
• 更大的批处理大小使得吞吐量提升8.9倍
最棒的是?这些效率提升几乎没有影响性能。从3B参数开始,BitNet b1.58在多个基准测试中能够与传统LLM相媲美,甚至超越。
BitNet b1.58量化过程解析
BitNet b1.58中的量化过程旨在将模型权重减少到三元值-1、0、1,从而在不大幅牺牲准确度的情况下,显著提高计算和内存效率。下面是该过程的简化解释:
1. 量化函数 量化函数是将权重从全精度转换为三元值的关键。它分为两个主要步骤:
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)))
首先,将值四舍五入到最接近的整数。
然后将结果限制在-1和1之间。
我们逐个元素来看:
对于0.75,四舍五入得到1。由于1在范围[-1,1]内,我们保持不变。所以,RoundClip(0.75,-1,1)=1。
对于-1.75,四舍五入得到-2。由于-2超出了[-1,1]的范围,我们将其裁剪为-1。所以,RoundClip(-1.75,-1,1)=-1。
对于1.25,四舍五入得到1。由于1在范围[-1,1]内,我们保持不变。所以,RoundClip(1.25,-1,1)=1。
对于0.25,四舍五入得到0。由于0在范围[-1,1]内,我们保持不变。所以,RoundClip(0.25,-1,1)=0。
最终量化矩阵:
在对每个元素应用RoundClip函数后,量化后的权重矩阵为:
因此,矩阵:
被量化为:
总结:
我们通过权重矩阵的平均绝对值(γ)对原始矩阵进行了缩放。
每个元素被四舍五入到最接近的整数,并裁剪到[-1,1]的范围内,最终得到了一个三元量化矩阵。
本地运行bitnet.cpp推理框架,适用于1位LLM(例如BitNet b1.58): 要求:
python>=3.9
cmake>=3.22
clang>=18
克隆仓库:
git clone --recursive https://github.com/microsoft/BitNet.git
cd BitNet
安装依赖项:
# (Recommended) Create a new conda environment
conda create -n bitnet-cpp python=3.9
conda activate bitnet-cpp
pip install -r requirements.txt
构建项目:
# Download the model from Hugging Face, convert it to quantized gguf format, and build the project
python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
# Or you can manually download the model and run with local path
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
基本使用:
# Run inference with the quantized model
python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?\nAnswer:" -n 6 -temp 0
# Output:
# Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?
# Answer: Mary is in the garden.
结论: BitNet b1.58处于高效AI的前沿,将1位精度模型带入了主流应用。凭借其优化的内核、减少的内存占用和显著的能源节省,BitNet代表了可持续AI部署的未来。BitNet b1.58奠定的技术基础,从高效的量化到动态代码生成,使其能够在各种硬件架构中有效扩展。通过降低计算成本,它为在边缘设备或能源受限的环境中运行大型LLM打开了大门。
标签:四舍五入,权重,缩放,人工智能,BitNet,矩阵,RoundClip,1000 From: https://blog.csdn.net/JellyAI/article/details/143788129