qwen.cpp: C++实现的Qwen语言模型
qwen.cpp是Qwen大语言模型的C++实现版本,专为在MacBook上实现实时对话而设计。本文将详细介绍qwen.cpp的特点、安装使用方法以及开发细节。
项目特点
qwen.cpp具有以下几个突出特点:
-
纯C++实现的tiktoken分词器。
-
支持流式生成,具有打字机效果。
-
提供Python绑定。
-
支持多种硬件平台:x86/arm CPU、NVIDIA GPU。
-
支持Linux和MacOS操作系统。
-
目前支持Qwen-LM系列模型。
安装及使用
要开始使用qwen.cpp,请按照以下步骤操作:
- 克隆项目代码:
git clone --recursive https://github.com/QwenLM/qwen.cpp && cd qwen.cpp
如果忘记添加--recursive
标志,可以在qwen.cpp
文件夹中运行:
git submodule update --init --recursive
-
下载qwen.tiktoken文件,可以从Hugging Face或ModelScope获取。
-
量化模型:使用
convert.py
将Qwen-LM转换为量化后的GGML格式。例如,将fp16原始模型转换为q4_0(量化为int4)GGML模型:
python3 qwen_cpp/convert.py -i Qwen/Qwen-7B-Chat -t q4_0 -o qwen7b-ggml.bin
原始模型(-i <model_name_or_path>
)可以是HuggingFace模型名称或预下载模型的本地路径。目前支持的模型有:
- Qwen-7B:
Qwen/Qwen-7B-Chat
- Qwen-14B:
Qwen/Qwen-14B-Chat
可以尝试以下任意量化类型(通过指定-t <type>
):
q4_0
: 4位整数量化,使用fp16尺度。q4_1
: 4位整数量化,使用fp16尺度和最小值。q5_0
: 5位整数量化,使用fp16尺度。q5_1
: 5位整数量化,使用fp16尺度和最小值。q8_0
: 8位整数量化,使用fp16尺度。f16
: 半精度浮点权重,无量化。f32
: 单精度浮点权重,无量化。
- 编译项目:
cmake -B build
cmake --build build -j --config Release
- 运行模型:
./build/bin/main -m qwen7b-ggml.bin --tiktoken Qwen-7B-Chat/qwen.tiktoken -p 你好
# 你好!很高兴为你提供帮助。
要在交互模式下运行模型,添加-i
标志:
./build/bin/main -m qwen7b-ggml.bin --tiktoken Qwen-7B-Chat/qwen.tiktoken -i
在交互模式下,您的聊天历史将作为下一轮对话的上下文。
运行./build/bin/main -h
可以探索更多选项!
使用BLAS加速
qwen.cpp支持多种BLAS库来加速计算:
- OpenBLAS: 在CPU上提供加速。添加CMake标志
-DGGML_OPENBLAS=ON
来启用:
cmake -B build -DGGML_OPENBLAS=ON && cmake --build build -j
- cuBLAS: 使用NVIDIA GPU加速BLAS。添加CMake标志
-DGGML_CUBLAS=ON
来启用:
cmake -B build -DGGML_CUBLAS=ON && cmake --build build -j
- Metal: MPS(Metal Performance Shaders)允许计算在强大的Apple Silicon GPU上运行。添加CMake标志
-DGGML_METAL=ON
来启用:
cmake -B build -DGGML_METAL=ON && cmake --build build -j
Python绑定
qwen.cpp提供了Python绑定,提供了类似于原始Hugging Face Qwen-7B的高级chat
和stream_chat
接口。
安装方法:
- 从PyPI安装(推荐):将在您的平台上触发编译。
pip install -U qwen-cpp
- 从源代码安装:
# 从GitHub上的最新源代码安装
pip install git+https://github.com/QwenLM/qwen.cpp.git@master
# 或在git克隆仓库后从本地源代码安装
pip install .
tiktoken.cpp
qwen.cpp提供了纯C++实现的tiktoken。安装后,使用方法与openai tiktoken相同:
import tiktoken_cpp as tiktoken
enc = tiktoken.get_encoding("cl100k_base")
assert enc.decode(enc.encode("hello world")) == "hello world"
tiktoken.cpp的速度与openai tiktoken相当。可以通过以下方式进行基准测试:
cd tests
RAYON_NUM_THREADS=1 python benchmark.py
开发与测试
- 单元测试:添加CMake标志
-DQWEN_ENABLE_TESTING=ON
来启用测试。重新编译并运行单元测试(包括基准测试):
mkdir -p build && cd build
cmake .. -DQWEN_ENABLE_TESTING=ON && make -j
./bin/qwen_test
- 代码格式化:在
build
文件夹内运行make lint
。您应该预先安装clang-format
、black
和isort
。
致谢
qwen.cpp项目深受以下项目的启发:
qwen.cpp为开发者和研究人员提供了一个高效、灵活的C++实现版本的Qwen语言模型。通过支持多种硬件平台和加速库,qwen.cpp能够在各种设备上实现实时对话。无论您是想在本地部署Qwen模型,还是希望深入研究大语言模型的C++实现,qwen.cpp都是一个值得探索的项目。
未来,qwen.cpp团队将继续优化性能,支持更多Qwen模型变体,并探索在更多场景中的应用。欢迎开发者们参与到qwen.cpp的开发中来,共同推动大语言模型技术的进步.