本文档解释了如何准备模型以与 BitNet.cpp 配合使用。它涵盖了从 Hugging Face 下载模型、将模型转换为 GGUF 格式以及应用三元量化技术。有关使用已准备好的模型运行推理的信息,请参阅运行推理。
BitNet.cpp 支持各种三元(1.58位)语言模型,这些模型在推理之前必须经过准备过程。此准备过程包括下载、转换和针对目标硬件平台的优化。
来源: setup_env.py97-136 utils/convert-hf-to-gguf-bitnet.py1082-1165
BitNet.cpp 官方支持 2.4B 参数的 BitNet-b1.58-2B-4T 模型,并兼容其他几种三元模型。
| 模型 | 参数 | 描述 |
|---|---|---|
| BitNet-b1.58-2B-4T | 2.4B | 官方 BitNet 模型 |
| bitnet_b1_58-large | 0.7B | 社区 BitNet 模型 |
| bitnet_b1_58-3B | 3.3B | 社区 BitNet 模型 |
| Llama3-8B-1.58 | 8.0B | 三元 Llama3 模型 |
| Falcon3 系列 | 1B-10B | 各种三元 Falcon3 模型 |
每种模型都可以根据目标硬件使用不同的方法进行量化
| 量化类型 | 描述 | 支持的架构 |
|---|---|---|
| I2_S | 标准2位符号-幅度量化 | ARM64, x86_64 |
| TL1 | 适用于 ARM 的三元查找优化 | 仅限 ARM64 |
| TL2 | 适用于 x86 的三元查找优化 | 仅限 x86_64 |
来源: README.md37-139 setup_env.py48-52
setup_env.py 脚本是模型准备的主要工具。它协调整个准备过程,包括模型下载、转换、内核生成和编译。
来源: setup_env.py206-210 setup_env.py97-138
setup_env.py 脚本接受多个命令行参数
| 参数 | 描述 | 默认 |
|---|---|---|
--hf-repo, -hr | 要从 HuggingFace 下载的仓库 | 无 |
--model-dir, -md | 保存/加载模型的目录 | "models" |
--log-dir, -ld | 日志信息目录 | "logs" |
--quant-type, -q | 量化类型 (i2_s, tl1, 或 tl2) | "i2_s" |
--quant-embd | 将嵌入量化为 f16 | 否 |
--use-pretuned, -p | 使用预调优的内核参数 | 否 |
使用示例
或使用本地模型
来源: setup_env.py212-221 README.md177-203
从 Hugging Face 下载时,脚本会创建适当的目录结构,并使用 huggingface-cli 下载模型。
模型转换过程将 Hugging Face 模型转换为 BitNet.cpp 使用的 GGUF 格式。此过程处理不同的模型架构并应用适当的量化方法。
来源: setup_env.py116-136 utils/convert-hf-to-gguf-bitnet.py1082-1165
转换过程涉及几个关键步骤
模型架构检测:转换器识别模型是标准 Llama 模型还是专用 Bitnet 模型。
参数提取:提取词汇量大小、嵌入维度和注意力头等模型参数。
词汇处理:处理分词器词汇表并将其添加到 GGUF 文件中。
张量转换:根据所选的量化方法处理模型权重。
GGUF 写入:将处理后的模型写入 GGUF 文件格式。
来源: utils/convert-hf-to-gguf-bitnet.py679-1079
BitNet.cpp 支持三种量化方法,每种方法都有其优点和目标平台。
I2_S 是一种标准的2位量化格式,它使用一个符号位和一个幅度位来表示权重。此格式在 ARM 和 x86 平台上都受支持。
TL1 是一种专门为 ARM 处理器优化的三元表示。它包括:
来源: utils/convert-hf-to-gguf-bitnet.py460-517
TL2 针对 x86 处理器进行了优化,并遵循不同的优化方法:
来源: utils/convert-hf-to-gguf-bitnet.py520-657
根据模型架构和目标平台,BitNet.cpp 生成用于矩阵乘法操作的优化内核。
内核生成过程根据以下因素进行定制:
完整的模型准备工作流程涉及几个集成步骤:
模型准备过程中常见的问题包括:
来源: README.md280-312