Falcon-Edge:一系列功能强大、通用且可微调的 1.58 位语言模型。

社区文章 发布于 2025 年 5 月 15 日

image/png

在这篇博文中,我们将介绍 Falcon-Edge 系列的关键亮点和原理——这是一系列基于 BitNet 架构,以三元格式提供的强大、通用且可微调的语言模型。

借鉴我们从 BitNet 中获得的经验,Falcon-Edge 引入并验证了一种新的预训练范式,该范式能够通过单一训练过程提供全范围输出,同时生成非量化和量化模型变体。这种综合方法产生了一个 bfloat16 格式的非 BitNet 模型、原生 BitNet 模型以及一个经过预量化的 BitNet 变体,该变体专门设计用于轻松微调,使用户和开发人员能够精确地根据其特定应用和需求定制这些模型。

现提供两种尺寸——10 亿和 30 亿参数——每种尺寸都提供基础模型和指令微调模型。在我们的 Hugging Face 专用集合中探索 Falcon-Edge 系列。

引言

大型语言模型 (LLM) 天生庞大且资源密集。随着在边缘设备上高效部署这些模型的需求增长,模型压缩研究加速发展。最近的努力,如 DeepSeek 和 Llama 4,探索使用降低精度格式(低至 FP8)进行训练,以提高部署可扩展性。另一方面,许多最先进的方法强调训练后量化。与这些方法不同,BitNet 引入了一种根本不同的范式:与仍然依赖浮点格式的降低精度训练和在全精度训练后调整权重的训练后量化不同,BitNet 在训练过程中直接使用最低精度——三元权重({-1, 0, 1})——从而实现端到端超高效的模型设计。

这些三元权重正在为“无矩阵乘法”的 LLM 设计铺平道路,这种设计在实践中显著更快且内存效率更高。这种创新方法的主要挑战是 BitNet 模型预训练的必要性,这对于普通用户来说计算量大且成本高昂。

Falcon-Edge,一系列强大的模型

利用我们中心预训练数据策略的经验,我们对内部混合数据进行了大约 1.5 万亿个 Token 的预训练。我们使用经典的 WSD 学习率调度器进行预训练。

我们在之前的 Hugging Face 排行榜 v2 基准测试中评估了我们的模型(基础版和指令版),并报告了与其他相似大小模型的标准化结果,如下所示。

image/png

image/png

将我们的指令模型与微软的新 BitNet 模型进行比较的其他结果(排行榜 v1)

image/png

Falcon-Edge 在排行榜 v2 任务中展现出与同等规模模型相当甚至更优的性能,表明可以在所需领域训练出强大的 BitNet 模型,同时在其他任务上也足够具有竞争力。

Falcon-Edge,一系列通用模型

如果我们仔细观察用于推理的 BitNet 线性层公式(Python 代码形式),

def activation_norm_quant(x):
    scale = 127.0 / x.abs().max(dim=-1, keepdim=True).values.clamp_(min=1e-5)
    y = (x * scale).round().clamp_(-128, 127)
    return y, scale

class BitLinear(nn.Linear):
    
    def post_quant_process(self, input, input_scale, weight_scale):
        out = input / (input_scale * weight_scale)
        return out

    def forward(self, input):
        w = self.weight
        w_quant = unpack_weights(w, dtype=self.dtype)
        input_quant, input_scale = self.activation_quant(input)
        y = F.linear(input_quant.to(self.dtype), w_quant)
        y = self.post_quant_process(y, self.weight_scale, input_scale)
        if self.bias is not None:
            y += self.bias.view(1, -1).expand_as(y)
        return y

归一化激活量化(normalization activation_norm_quant)将激活量化为 int8 格式,然后通过除以 x_scale 将激活计算回半精度。由于模型已经使用伪 8 位激活量化进行训练,我们认为可以近似地认为

x_quant, x_scale = activation_norm_quant(x)
x ~= (x_quant / x_scale)

因此,与其在训练后量化模型,不如在量化权重后注入权重比例,这应该能得到非 BitNet 模型的足够好的“近似”。

def _weight_quant(w):
    scale = 1.0 / w.abs().mean().clamp_(min=1e-05)
    u = (w * scale).round().clamp_(-1, 1)
    return u, scale

for param_name, param_value in state_dict.items():
    if _is_param_to_not_quantize(param_name):
        continue

    param_value, param_scale = _weight_quant(param_value)
    param_value = param_value / param_scale

    state_dict_quant[param_name] = param_value

我们通过对 1B 和 3B 基础模型的 bfloat16 变体进行端到端评估来证实这一点,结果如下所示

image/png

模型的 bfloat16 对应版本可以通过在 from_pretrained 函数中传递 revision="bfloat16" 直接通过 Hugging Face transformers 加载

import torch

from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import SFTTrainer

model_id = "tiiuae/Falcon-E-1B-Base"

tokenizer = AutoTokenizer.from_pretrained(model_id, revision="prequantized")
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    revision="bfloat16"
)

Falcon-Edge,一系列可微调的 Bitnet 模型

据我们所知,除了 Microsoft 最近发布的产品外,之前的 BitNet 版本都只关注发布最终的量化模型,使其只能用于推理。与 Microsoft 的发布类似,我们建议通过发布预量化权重来扩大 BitNet 模型研究和应用的普及性。这样,用户可以在其目标领域进行微调,或者对 BitNet 检查点进行持续预训练,只要将 nn.Linear 层替换为 BitnetLinear 层,并确保在训练后将模型量化为 BitNet 格式。由于权重对应于预量化权重,因此在不将 nn.Linear 层替换为 BitnetLinear 层的情况下执行文本生成将产生乱码输出。

预量化权重可以通过 Hugging Face 的 transformers 库下载,方法是将 revision 参数指定为 prequantized

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "tiiuae/Falcon-E-1B-Base"

tokenizer = AutoTokenizer.from_pretrained(model_id, revision="prequantized")
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    revision="prequantized"
)

通过这种方式,我们将帮助社区围绕首批强大的 1 位微调模型建立一个生态系统。我们通过将执行预量化权重微调所需的所有实用方法打包到一个名为 onebitllms 的 Python 包中,为社区提供了轻松上手并微调自己版本的强大 BitNet 模型的工具,我们将在下一节中介绍该包。

介绍 onebitllms - 一个用于 1 位 LLM 训练工具包的轻量级 Python 包

image/png

在此版本中,我们还推出了 onebitllms——一个轻量级的 Python 包,可以插入您最喜欢的 LLM 微调工具,以便对任何预量化的 BitNet 模型进行微调。在撰写本文时,onebitllms 主要提供以下功能:

  • 用于将预量化模型检查点转换为 BitNet 训练格式的实用方法,以便将其传递给您最喜欢的任何 LLM 微调框架。我们目前已使用 Hugging Face 的 trl 库测试了我们的库。
  • 将训练过的检查点量化为 BitNet 格式以及常用的 bfloat16 格式的实用方法。
  • 为了更细粒度的控制:可以在您的预训练框架中注入和使用的裸 BitnetLinear 和 Triton 内核。

目前,该框架仅支持完全微调,虽然在此版本中模型尺寸相对较小,但支持 BitNet 模型的参数高效微调(PEFT)方法仍然是即将推出的 BitNet 模型一个令人兴奋且有影响力的开放问题。

要开始使用,只需通过 pip 或从源代码直接安装包,然后查看源代码中的 examples/ 文件夹。

import torch

from transformers import AutoModelForCausalLM, AutoTokenizer
from trl import SFTTrainer
from onebitllms import replace_linear_with_bitnet_linear, quantize_to_1bit

model_id = "tiiuae/Falcon-E-1B-Base"

tokenizer = AutoTokenizer.from_pretrained(model_id, revision="prequantized")
model = AutoModelForCausalLM.from_pretrained(
    model_id,
    torch_dtype=torch.bfloat16,
    revision="prequantized"
)
model = replace_linear_with_bitnet_linear(model)

trainer = SFTTrainer(
    model,
    ...
)

trainer.train()

quantize_to_1bit(output_directory)

我们希望通过这个软件包,加速围绕三元格式 LLM 的研究和开发,并希望看到社区开发出更多 Falcon-Edge 及其他未来强大的 BitNet 模型的衍生版本。

进一步探索

我们相信此次发布开启了多个有趣的方向——在所有可能的后续方向中,我们目前认为以下开放问题将在不久的将来使 BitNet 模型更具影响力:

  • 为 BitNet 架构编写更强大的 GPU 推理内核:利用 bitnet.cpp 背后的相同核心思想,我们希望此次发布将说服研究社区专注于开发强大的 BitNet 推理内核,以实现 GPU 上更快的推理——从而使其在 GPU 上比原生模型更快。
  • 支持 BitNet 微调的 PEFT 方法:这仍然是一个尚未探索的研究问题,可以为 BitNet 模型开辟多个新的可能性。
  • 对 Bitnet 检查点通用性的更严谨调查:虽然我们观察到简单地注入权重比例会导致一个不错的非 Bitnet 检查点,但我们相信可以进行更多的研究来最小化 Bitnet 检查点与其 bfloat16 对应检查点之间的性能下降,从而使其完全没有性能下降。
  • 关于多模态 Bitnet 模型:我们希望这些 Bitnet 基础模型以及 onebitllms 包可以作为创建首个多模态 Bitnet VLM(视觉语言模型)等的基础工作。
  • 更优化的 Bitnet 训练内核:为了编写我们的内核,我们决定采用两阶段方法,首先计算全局最大值,然后将其分块用于归一化。这种方法可以修改以编写更高效的内核。在我们的测试中,我们估计非 Bitnet 预训练与 Bitnet 预训练之间的开销约为 20%。我们很快将发布更多关于 Bitnet 训练引入的开销的详细数据。

引用

如果您认为这项工作对您的研究和工作有用,请考虑引用我们的工作,并引用 BitNet 模型背后的所有基础工作。

@misc{tiionebitllms,
    title = {Falcon-E, a series of powerful, universal and fine-tunable 1.58bit language models.},
    author = {Falcon-LLM Team},
    month = {May},
    url = {https://falcon-lm.github.io/blog/falcon-edge},
    year = {2025}
}
更多参考资料
@misc{ma2025bitnetb1582b4ttechnical,
      title={BitNet b1.58 2B4T Technical Report}, 
      author={Shuming Ma and Hongyu Wang and Shaohan Huang and Xingxing Zhang and Ying Hu and Ting Song and Yan Xia and Furu Wei},
      year={2025},
      eprint={2504.12285},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2504.12285}, 
}
@misc{wang2025bitnetcppefficientedgeinference,
      title={Bitnet.cpp: Efficient Edge Inference for Ternary LLMs}, 
      author={Jinheng Wang and Hansong Zhou and Ting Song and Shijie Cao and Yan Xia and Ting Cao and Jianyu Wei and Shuming Ma and Hongyu Wang and Furu Wei},
      year={2025},
      eprint={2502.11880},
      archivePrefix={arXiv},
      primaryClass={cs.LG},
      url={https://arxiv.org/abs/2502.11880}, 
}
@misc{,
      title={1.58-Bit LLM: A New Era of Extreme Quantization}, 
      author={Mohamed Mekkouri and Marc Sun and Leandro von Werra and Thomas Wolf},
      year={2024},
}
@misc{ma2024era1bitllmslarge,
      title={The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits}, 
      author={Shuming Ma and Hongyu Wang and Lingxiao Ma and Lei Wang and Wenhui Wang and Shaohan Huang and Li Dong and Ruiping Wang and Jilong Xue and Furu Wei},
      year={2024},
      eprint={2402.17764},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2402.17764}, 
}
@misc{wang2023bitnetscaling1bittransformers,
      title={BitNet: Scaling 1-bit Transformers for Large Language Models}, 
      author={Hongyu Wang and Shuming Ma and Li Dong and Shaohan Huang and Huaijie Wang and Lingxiao Ma and Fan Yang and Ruiping Wang and Yi Wu and Furu Wei},
      year={2023},
      eprint={2310.11453},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
      url={https://arxiv.org/abs/2310.11453}, 
}

社区

加油

太棒了!等不及要在 llama.cpp 中尝试了

·
文章作者

谢谢你 @ThomasTheMaker
你现在就可以在 bitnet.cpp 中尝试(你需要使用:https://github.com/microsoft/BitNet/pull/268 直到它合并)

恭喜,这些结果看起来很有前景。然而,我真的不认为与其他小型模型的 FP-16 版本进行比较是公平的。至少使用 8 位甚至 4 位量化版本来提供更准确的性能,并反映人们实际使用的版本。

注册登录 评论