菜单

模型准备

相关源文件

本文档解释了如何准备模型以与 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-4T2.4B官方 BitNet 模型
bitnet_b1_58-large0.7B社区 BitNet 模型
bitnet_b1_58-3B3.3B社区 BitNet 模型
Llama3-8B-1.588.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.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 下载模型。

来源: setup_env.py97-114

模型转换过程

模型转换过程将 Hugging Face 模型转换为 BitNet.cpp 使用的 GGUF 格式。此过程处理不同的模型架构并应用适当的量化方法。

来源: setup_env.py116-136 utils/convert-hf-to-gguf-bitnet.py1082-1165

转换过程详情

转换过程涉及几个关键步骤

  1. 模型架构检测:转换器识别模型是标准 Llama 模型还是专用 Bitnet 模型。

  2. 参数提取:提取词汇量大小、嵌入维度和注意力头等模型参数。

  3. 词汇处理:处理分词器词汇表并将其添加到 GGUF 文件中。

  4. 张量转换:根据所选的量化方法处理模型权重。

  5. GGUF 写入:将处理后的模型写入 GGUF 文件格式。

来源: utils/convert-hf-to-gguf-bitnet.py679-1079

量化方法

BitNet.cpp 支持三种量化方法,每种方法都有其优点和目标平台。

I2_S (2位符号-幅度)

I2_S 是一种标准的2位量化格式,它使用一个符号位和一个幅度位来表示权重。此格式在 ARM 和 x86 平台上都受支持。

TL1 (适用于 ARM 的三元查找)

TL1 是一种专门为 ARM 处理器优化的三元表示。它包括:

  1. 将权重转换为三元值 (-1, 0, 1)
  2. 为 ARM 的内存访问模式重塑和转置矩阵
  3. 将多个三元值打包成字节
  4. 生成查找表以实现快速计算

来源: utils/convert-hf-to-gguf-bitnet.py460-517

TL2 (适用于 x86 的三元查找)

TL2 针对 x86 处理器进行了优化,并遵循不同的优化方法:

  1. 将权重矩阵分为两部分:threeK 和 twoK
  2. 使用专门的3对1位打包方案处理 threeK
  3. 使用更简单的2对1位打包方案处理 twoK
  4. 为 x86 SIMD 指令进行优化

来源: utils/convert-hf-to-gguf-bitnet.py520-657

内核代码生成

根据模型架构和目标平台,BitNet.cpp 生成用于矩阵乘法操作的优化内核。

内核生成过程根据以下因素进行定制:

  1. 模型架构:不同的模型具有不同的最佳阻塞参数
  2. 矩阵维度:权重矩阵的维度会影响阻塞策略
  3. 目标平台:ARM (TL1) 和 x86 (TL2) 需要不同的优化

来源: setup_env.py144-188

完整准备工作流程

完整的模型准备工作流程涉及几个集成步骤:

  1. 设置环境:安装依赖项并准备环境
  2. 生成内核代码:为目标平台创建优化的内核
  3. 编译 C++ 代码:使用生成的内核构建 BitNet.cpp 框架
  4. 准备模型:下载、转换和量化模型
  5. 准备进行推理:已准备好的模型现在可以进行推理

来源: setup_env.py206-210

模型准备故障排除

模型准备过程中常见的问题包括:

  1. 缺少依赖项:确保所有必需的软件包都已安装
  2. 不支持的模型:验证您的模型是否受 BitNet.cpp 支持
  3. 转换错误:检查模型架构是否与预期格式匹配
  4. 内核生成失败:确保您的硬件被正确检测
  5. 编译问题:在 Windows 上,请确保使用开发者命令提示符

来源: README.md280-312