qwen.cpp
在您的MacBook上实现实时聊天的Qwen-LM C++实现。
更新
2023/12/05
qwen已合并到llama.cpp并支持gguf格式。
特性
亮点:
支持矩阵:
- 硬件: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
从Hugging Face或modelscope下载qwen.tiktoken文件。
量化模型
使用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
:带fp16比例的4位整数量化。q4_1
:带fp16比例和最小值的4位整数量化。q5_0
:带fp16比例的5位整数量化。q5_1
:带fp16比例和最小值的5位整数量化。q8_0
:带fp16比例的8位整数量化。f16
:不带量化的半精度浮点权重。f32
:不带量化的单精度浮点权重。
构建并运行
使用CMake编译项目:
cmake -B build
cmake --build build -j --config Release
现在你可以通过运行以下命令与量化后的Qwen-7B-Chat模型进行聊天:
./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
OpenBLAS
OpenBLAS在CPU上提供加速。添加CMake标志 -DGGML_OPENBLAS=ON
来启用它。
cmake -B build -DGGML_OPENBLAS=ON && cmake --build build -j
cuBLAS
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绑定
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
我们提供纯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
。
致谢
- 本项目深受以下项目的启发:llama.cpp、chatglm.cpp、ggml、tiktoken、tokenizer、cpp-base64、re2和unordered_dense。