bitnet.cpp 是 1 位 LLM 的官方推理框架(例如 BitNet b1.58)。它提供了一套优化的内核,支持 CPU 上 1.58 位模型的快速无损推理(接下来将支持 NPU 和 GPU)。
bitnet.cpp 的第一个版本是支持 CPU 上的推理。 bitnet.cpp 在 ARM CPU 上实现了1.37 倍到5.07 倍的加速,较大的模型获得了更大的性能提升。此外,它还能将能耗降低55.4%至70.0% ,进一步提高整体效率。在 x86 CPU 上,加速范围为2.37 倍至6.17 倍,能耗降低71.9%至82.2% 。此外,bitnet.cpp 可以在单个 CPU 上运行 100B BitNet b1.58 模型,实现与人类阅读相当的速度(每秒 5-7 个令牌),从而显着增强在本地设备上运行 LLM 的潜力。更多详情请参阅技术报告。
测试的模型是在研究环境中使用的虚拟设置,用于演示 bitnet.cpp 的推理性能。
在 Apple M2 上运行 BitNet b1.58 3B 模型的 bitnet.cpp 演示:
2024 年 10 月 21 日 1 位 AI 基础设施:第 1.1 部分,快速无损 BitNet b1.58 CPU 推理
2024 年 10 月 17 日 bitnet.cpp 1.0 发布。
03/21/2024 1 位法学硕士时代__Training_Tips_Code_FAQ
02/27/2024 1 位法学硕士时代:所有大型语言模型均采用 1.58 位
2023 年 10 月 17 日 BitNet:为大型语言模型扩展 1 位 Transformer
该项目基于llama.cpp框架。我们要感谢所有作者对开源社区的贡献。此外,bitnet.cpp 的内核构建在 T-MAC 中首创的查找表方法之上。对于三元模型之外的一般低位 LLM 的推理,我们建议使用 T-MAC。
❗️我们使用 Hugging Face 上现有的 1 位 LLM 来演示 bitnet.cpp 的推理功能。这些模型既不是由微软训练也不是由微软发布的。我们希望 bitnet.cpp 的发布能够在模型大小和训练代币方面激发大规模环境中 1 位 LLM 的开发。
模型 | 参数 | 中央处理器 | 核心 | ||
---|---|---|---|---|---|
I2_S | TL1 | TL2 | |||
bitnet_b1_58-大 | 0.7B | x86 | ✔ | ✘ | ✔ |
手臂 | ✔ | ✔ | ✘ | ||
位网_b1_58-3B | 3.3B | x86 | ✘ | ✘ | ✔ |
手臂 | ✘ | ✔ | ✘ | ||
Llama3-8B-1.58-100B-代币 | 8.0B | x86 | ✔ | ✘ | ✔ |
手臂 | ✔ | ✔ | ✘ |
蟒蛇>=3.9
cmake>=3.22
叮当>=18
使用 C++ 进行桌面开发
适用于 Windows 的 C++-CMake 工具
适用于 Windows 的 Git
适用于 Windows 的 C++-Clang 编译器
MS-Build 对 LLVM 工具集的支持 (clang)
对于 Windows 用户,安装 Visual Studio 2022。在安装程序中,至少打开以下选项(这还会自动安装所需的附加工具,例如 CMake):
对于 Debian/Ubuntu 用户,您可以使用自动安装脚本进行下载
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
康达(强烈推荐)
重要的
如果您使用的是 Windows,请记住始终使用 VS2022 的开发人员命令提示符/PowerShell 来执行以下命令
克隆存储库
git clone --recursive https://github.com/microsoft/BitNet.gitcd BitNet
安装依赖项
# (推荐)创建新的conda环境conda create -n bitnet-cpp python=3.9 conda 激活 bitnet-cpp pip install -r 要求.txt
构建项目
# 从 Hugging Face 下载模型,将其转换为量化的 gguf 格式,并构建项目python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s# 或者您可以手动下载模型并构建使用本地 pathhuggingface-cli 下载 HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens 运行 python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s
用法: setup_env.py [-h] [--hf-repo {1bitLLM/bitnet_b1_58-large,1bitLLM/bitnet_b1_58-3B,HF1BitLLM/Llama3-8B-1.58-100B-tokens}] [--model-dir MODEL_DIR] [ --log-dir LOG_DIR] [--quant-type {i2_s,tl1}] [--quant-embd] [--使用预调整] 设置运行推理的环境 可选参数: -h, --help 显示此帮助消息并退出 --hf-repo {1bitLLM/bitnet_b1_58-large,1bitLLM/bitnet_b1_58-3B,HF1BitLLM/Llama3-8B-1.58-100B-tokens}, -hr {1bitLLM/bitnet_b1_58-large,1bitLLM/bitnet_b1_58-3B,HF1BitLLM/Llama3- 8B-1.58-100B-代币} 用于推理的模型 --模型目录 MODEL_DIR, -md MODEL_DIR 保存/加载模型的目录 --log-dir LOG_DIR, -ld LOG_DIR 保存日志信息的目录 --quant-type {i2_s,tl1}, -q {i2_s,tl1} 量化类型 --quant-embd 将嵌入量化为 f16 --use-pretuned, -p 使用预调整的内核参数
# 使用量化模型运行推理 python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel 回到花园。Mary 去了厨房。Sandra桑德拉去了厨房。约翰去了卧室。玛丽在哪里?n答案:“-n 6 -temp 0# 输出:# 丹尼尔回到了花园。玛丽去了厨房。桑德拉走向厨房。桑德拉走到走廊。约翰走进卧室。玛丽回到花园。玛丽在哪里?# 答案:玛丽在花园里。
用法: run_inference.py [-h] [-m MODEL] [-n N_PREDICT] -p PROMPT [-t THREADS] [-c CTX_SIZE] [-temp TEMPERATURE] 运行推理 可选参数: -h, --help 显示此帮助消息并退出 -m 模型,--模型模型 模型文件的路径 -n N_PREDICT, --n-预测 N_PREDICT 生成文本时要预测的标记数量 -p 提示,--提示提示 提示生成文本 -t 线程, --threads 线程 使用的线程数 -c CTX_SIZE, --ctx-size CTX_SIZE 提示上下文的大小 -temp 温度,--temp 温度 温度,控制生成文本随机性的超参数
我们提供脚本来运行提供模型的推理基准测试。
usage: e2e_benchmark.py -m MODEL [-n N_TOKEN] [-p N_PROMPT] [-t THREADS] Setup the environment for running the inference required arguments: -m MODEL, --model MODEL Path to the model file. optional arguments: -h, --help Show this help message and exit. -n N_TOKEN, --n-token N_TOKEN Number of generated tokens. -p N_PROMPT, --n-prompt N_PROMPT Prompt to generate text from. -t THREADS, --threads THREADS Number of threads to use.
以下是每个论点的简要解释:
-m
, --model
:模型文件的路径。这是运行脚本时必须提供的必需参数。
-n
, --n-token
:推理过程中生成的标记数量。它是一个可选参数,默认值为 128。
-p
, --n-prompt
:用于生成文本的提示标记的数量。这是一个可选参数,默认值为 512。
-t
, --threads
:用于运行推理的线程数。它是一个可选参数,默认值为 2。
-h
, --help
: 显示帮助消息并退出。使用此参数来显示使用信息。
例如:
python utils/e2e_benchmark.py -m /path/to/model -n 200 -p 256 -t 4
此命令将使用位于/path/to/model
模型运行推理基准测试,利用 4 个线程从 256 个令牌提示生成 200 个令牌。
对于任何公共模型不支持的模型布局,我们提供脚本来生成具有给定模型布局的虚拟模型,并在您的计算机上运行基准测试:
python utils/generate-dummy-bitnet-model.py models/bitnet_b1_58-large --outfile models/dummy-bitnet-125m.tl1.gguf --outtype tl1 --model-size 125M# 使用生成的模型运行基准测试,使用-m 指定模型路径,-p 指定处理的提示,-n 指定生成令牌的数量python utils/e2e_benchmark.py -m models/dummy-bitnet-125m.tl1.gguf -p 512 -n 128