菜单

高级用法

相关源文件

本页面涵盖了 BitNet.cpp 的高级主题,面向需要超出基本用法来自定义、优化和微调推理框架的 BitNet.cpp 高级用户和开发者。有关标准的设置和推理说明,请参考入门指南运行推理

自定义内核配置

BitNet.cpp 通过专为不同硬件平台(ARM 和 x86)和模型架构设计的优化内核来实现其性能。您可以自定义这些内核,以针对您的特定模型和硬件配置达到最佳性能。

理解内核参数

BitNet.cpp 中的内核生成系统依赖于三个关键参数:

参数描述影响
BM矩阵 M 维度的块大小影响权重矩阵的处理瓦片大小
BK矩阵 K 维度的块大小控制数据分区和内存访问模式
bmSIMD 处理的微块大小决定向量化效率

这些参数控制了推理计算过程中矩阵的分区方式。

来源:setup_env.py152-168 utils/codegen_tl2.py279-292

自定义内核参数

您可以在设置环境时使用 --use-pretuned 标志来定制内核参数,或者直接向 codegen 脚本指定参数。

为特定模型使用预调优的内核参数

使用特定参数生成自定义内核

内核参数存储在 include/kernel_config.ini 中,可以手动调整以进行实验。

来源:setup_env.py146-188

内核生成过程

下图说明了 x86 平台 (TL2) 的内核生成过程。

来源:utils/codegen_tl2.py279-530 setup_env.py140-188

性能调优

量化选项

BitNet.cpp 支持不同的量化策略,这些策略会影响性能和准确性。

量化描述支持的平台用例
i2_s标准 2 位有符号整数ARM, x86性能和准确性平衡良好
tl1ARM 优化的查找表方法仅限 ARMARM 上性能最佳
tl2x86 优化的查找表方法仅限 x86x86 上性能最佳

您可以在设置环境时指定量化类型。

使用 --quant-embd 标志可以将嵌入量化为 FP16,这可以减少内存使用,但会略微降低准确性。

来源:setup_env.py49-52 setup_env.py114-135

批次大小优化

推理性能会受到批次大小的显著影响。BitNet.cpp 中的优化内核支持特定的批次大小。

您可以使用提供的基准测试脚本来对不同批次大小进行基准测试。

来源:utils/codegen_tl2.py532-623

线程数优化

线程数根据您的 CPU 功能对性能有显著影响。您可以在推理过程中设置线程数。

为达到最佳性能

  • 对于延迟敏感的应用,使用等于物理核心数的线程数。
  • 对于吞吐量导向的工作负载,使用包括超线程核心在内的线程数。
  • 对于非常大的模型,请减少线程数以避免内存争用。

来源:README.md204-231

高级模型兼容性

支持自定义模型架构

BitNet.cpp 主要针对三元(1 位)模型,但您可以通过以下方式将其改编为与自定义模型架构配合使用:

  1. 将模型架构添加到支持的模型列表中
  2. 为特定架构自定义内核参数
  3. 生成与层维度匹配的配置

对于在没有实际模型的情况下测试自定义架构,您可以生成一个虚拟模型。

来源:README.md272-279 utils/codegen_tl2.py683-696

使用替代 BitNet 模型格式

BitNet.cpp 可与各种 1 位/三元模型格式配合使用。下表显示了哪些模型可以与哪些量化方法一起使用。

模型参数i2_sTL1 (ARM)TL2 (x86)
BitNet-b1.58-2B-4T2.4B
bitnet_b1_58-large0.7B
bitnet_b1_58-3B3.3B
Llama3-8B-1.588.0B
Falcon3 系列1B-10B

设置时,您可以直接指定 Hugging Face 存储库。

来源:README.md37-139 setup_env.py13-47

高级基准测试和分析

端到端基准测试

为了进行全面的性能分析,请使用端到端基准测试工具。

可定制的参数

  • -n:要生成的 token 数量(影响生成时间)
  • -p:提示 token 数量(影响提示处理时间)
  • -t:线程数(影响并行度)

这将提供以下指标:

  • 每秒 token 数
  • 提示处理时间
  • token 生成时间
  • 总运行时

来源:README.md233-271

比较不同的内核配置

为了系统地比较不同的内核配置:

  1. 生成多个内核配置。
  2. 运行每个配置的基准测试。
  3. 比较结果以找到最佳参数。

为了进行系统测试,可以创建一个 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

内核参数约束

自定义内核参数时,必须遵循某些约束:

  1. M % BM 必须等于 0(矩阵维度必须能被块大小整除)
  2. K % BK % 32 必须等于 0(为了满足对齐要求)
  3. 对于 TL2 内核,bm 值应为 32。
  4. 对于 TL2 (x86),BK 最好是 6 的倍数以获得最佳性能。
  5. 对于 TL1 (ARM),BK 最好是 2 的幂(64、128)以获得最佳性能。

来源:utils/codegen_tl2.py725-729

结论

本页面涵盖了 BitNet.cpp 的高级用法主题,包括自定义内核配置、性能调优和高级模型兼容性。通过理解和应用这些概念,您可以针对特定的硬件、模型架构和用例要求来优化 BitNet.cpp。

有关 BitNet.cpp 核心架构的实现细节,请参考技术架构