本页面涵盖了 BitNet.cpp 的高级主题,面向需要超出基本用法来自定义、优化和微调推理框架的 BitNet.cpp 高级用户和开发者。有关标准的设置和推理说明,请参考入门指南和运行推理。
BitNet.cpp 通过专为不同硬件平台(ARM 和 x86)和模型架构设计的优化内核来实现其性能。您可以自定义这些内核,以针对您的特定模型和硬件配置达到最佳性能。
BitNet.cpp 中的内核生成系统依赖于三个关键参数:
| 参数 | 描述 | 影响 |
|---|---|---|
BM | 矩阵 M 维度的块大小 | 影响权重矩阵的处理瓦片大小 |
BK | 矩阵 K 维度的块大小 | 控制数据分区和内存访问模式 |
bm | SIMD 处理的微块大小 | 决定向量化效率 |
这些参数控制了推理计算过程中矩阵的分区方式。
来源:setup_env.py152-168 utils/codegen_tl2.py279-292
您可以在设置环境时使用 --use-pretuned 标志来定制内核参数,或者直接向 codegen 脚本指定参数。
为特定模型使用预调优的内核参数
使用特定参数生成自定义内核
内核参数存储在 include/kernel_config.ini 中,可以手动调整以进行实验。
下图说明了 x86 平台 (TL2) 的内核生成过程。
来源:utils/codegen_tl2.py279-530 setup_env.py140-188
BitNet.cpp 支持不同的量化策略,这些策略会影响性能和准确性。
| 量化 | 描述 | 支持的平台 | 用例 |
|---|---|---|---|
i2_s | 标准 2 位有符号整数 | ARM, x86 | 性能和准确性平衡良好 |
tl1 | ARM 优化的查找表方法 | 仅限 ARM | ARM 上性能最佳 |
tl2 | x86 优化的查找表方法 | 仅限 x86 | x86 上性能最佳 |
您可以在设置环境时指定量化类型。
使用 --quant-embd 标志可以将嵌入量化为 FP16,这可以减少内存使用,但会略微降低准确性。
来源:setup_env.py49-52 setup_env.py114-135
推理性能会受到批次大小的显著影响。BitNet.cpp 中的优化内核支持特定的批次大小。
您可以使用提供的基准测试脚本来对不同批次大小进行基准测试。
来源:utils/codegen_tl2.py532-623
线程数根据您的 CPU 功能对性能有显著影响。您可以在推理过程中设置线程数。
为达到最佳性能
BitNet.cpp 主要针对三元(1 位)模型,但您可以通过以下方式将其改编为与自定义模型架构配合使用:
对于在没有实际模型的情况下测试自定义架构,您可以生成一个虚拟模型。
来源:README.md272-279 utils/codegen_tl2.py683-696
BitNet.cpp 可与各种 1 位/三元模型格式配合使用。下表显示了哪些模型可以与哪些量化方法一起使用。
| 模型 | 参数 | i2_s | TL1 (ARM) | TL2 (x86) |
|---|---|---|---|---|
| BitNet-b1.58-2B-4T | 2.4B | ✓ | ✓ | ✓ |
| bitnet_b1_58-large | 0.7B | ✓ | ✓ | ✓ |
| bitnet_b1_58-3B | 3.3B | ✗ | ✓ | ✓ |
| Llama3-8B-1.58 | 8.0B | ✓ | ✓ | ✓ |
| Falcon3 系列 | 1B-10B | ✓ | ✓ | ✓ |
设置时,您可以直接指定 Hugging Face 存储库。
来源:README.md37-139 setup_env.py13-47
为了进行全面的性能分析,请使用端到端基准测试工具。
可定制的参数
-n:要生成的 token 数量(影响生成时间)-p:提示 token 数量(影响提示处理时间)-t:线程数(影响并行度)这将提供以下指标:
为了系统地比较不同的内核配置:
为了进行系统测试,可以创建一个 shell 脚本,该脚本遍历不同的参数并记录每个配置的性能指标。
来源:utils/codegen_tl2.py682-725 README.md233-271
在使用自定义内核配置时,您可能会遇到以下常见问题:
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 构建失败 | 不兼容的内核参数 | 确保 BM、BK 和 bm 的值与您的模型维度兼容。 |
| 段错误 | 内存访问未对齐 | 确保 BK 是 32 的倍数(针对 TL1)或 6 的倍数(针对 TL2)。 |
| 性能低下 | 次优的块大小 | 尝试使用不同的 BM、BK 值,以匹配您的 CPU 缓存结构。 |
| 内存不足 | 批次大小过大 | 减小批次大小或调整 BM/BK 以减少内存占用。 |
调整参数时,请从您模型的默认值开始,并进行渐进式更改,同时对性能进行基准测试。
来源:utils/codegen_tl2.py725-741 setup_env.py146-188
自定义内核参数时,必须遵循某些约束:
来源:utils/codegen_tl2.py725-729
本页面涵盖了 BitNet.cpp 的高级用法主题,包括自定义内核配置、性能调优和高级模型兼容性。通过理解和应用这些概念,您可以针对特定的硬件、模型架构和用例要求来优化 BitNet.cpp。
有关 BitNet.cpp 核心架构的实现细节,请参考技术架构。