基于llama.cpp的QwQ32B模型推理
-
llama.cpp项目主页:
https://github.com/ggml-org/llama.cpp#
-
llama.cpp源码下载
cd /root/lanyun-tmpgit clone https://github.com/ggml-org/llama.cpp#
llama.cpp编译
-
llama.cpp是个C语言项目,实际调用过程需要先构建项目,然后设置参数进行编译,最终创建可执行文件并运行本地大模型。借助llama.cpp可以实现纯CPU推理、纯GPU推理和CPU+GPU混合推理。
-
下载依赖
apt-get updateapt-get install build-essential cmake curl libcurl4-openssl-dev -y
这条命令安装了一些常用的构建和开发工具,具体的每个部分的含义如下:
-
build-essential
:安装一组构建必需的工具和库,包括:编译器(如 GCC)、
make
工具、其他一些常见的构建工具,确保你的系统能进行编译。 -
cmake
:安装 CMake 工具,它是一个跨平台的构建系统,允许你管理项目的编译过程。 -
curl
:安装 cURL 工具,它是一个命令行工具。 -
libcurl4-openssl-dev
:安装 libcurl 库的开发版本。它是 cURL 的一个库文件,允许你在编程中通过 cURL 发送 HTTP 请求。libcurl4-openssl-dev
是与 OpenSSL 配合使用的版本,提供了 SSL/TLS 加密支持,用于安全的 HTTP 请求。
-
-
构建 :使用cmake来构建项目文件
cmake llama.cpp -B llama.cpp/build \-DBUILD_SHARED_LIBS=OFF -DGGML_CUDA=ON -DLLAMA_CURL=ON
-
cmake
:运行 CMake 工具,用于配置和生成构建文件。 -
llama.cpp
:指定项目的源代码所在的目录。在这个例子中,llama.cpp
是项目的根目录。 -
-B llama.cpp/build
:指定生成构建文件的目录。-B
参数表示构建目录,llama.cpp/build
是生成的构建目录。这是 CMake 将生成的文件存放的地方(例如 Makefile 或 Ninja 构建文件)。 -
同时还指定了一些编译选项:
禁用共享库(
-DBUILD_SHARED_LIBS=OFF
),生成 静态库。启用 CUDA 支持(
-DGGML_CUDA=ON
),以便在有 GPU 的情况下使用 GPU 加速。启用 CURL 库支持(
-DLLAMA_CURL=ON
),以便支持网络请求。
-
-
编译: (请等待,需要半个小时左右)
cmake --build llama.cpp/build --config Release -j --clean-first --target llama-quantize llama-cli llama-gguf-split
-
--build llama.cpp/build
:告诉 CMake 使用llama.cpp/build
目录中的构建文件来执行构建过程。这个目录是在之前运行cmake llama.cpp -B llama.cpp/build
命令时生成的,包含了所有构建所需的文件(例如 Makefile 或 Ninja 构建文件)。 -
--config Release
:指定构建的配置为 Release 配置。Release 配置通常意味着启用更多的 优化,生成的程序运行速度较快,适合发布。
在 CMake 中,通常有两种常见的构建配置:
- Debug:用于调试版本,包含调试信息且没有做过多优化。
- Release:优化后的发布版本,去除调试信息,运行时性能更高。
-
-j
:表示并行构建,允许 CMake 使用多个 CPU 核心来加速构建过程。如果没有指定数字,CMake 会使用默认的并行级别,通常是可用的所有 CPU 核心。你也可以指定并行的作业数,例如
-j 8
表示使用 8 个并行作业进行编译。 -
--clean-first
:表示在构建之前先清理掉之前的构建结果。这可以确保每次构建时都是从一个干净的状态开始,避免由于缓存或中间文件引起的编译错误。如果你之前运行过构建并且有问题,或者希望重新构建而不使用任何缓存文件,这个选项非常有用。
-
--target
:指定构建的目标(target)。通常,一个项目会定义多个目标(比如库、可执行文件等),通过这个参数可以告诉 CMake 只编译特定的目标。llama-quantize
:可能是与模型量化相关的目标。量化(quantization)是将模型的精度从浮点数降低到整数,从而减少内存占用和提高推理速度。llama-cli
:可能是一个命令行工具,用于运行模型或与用户交互。llama-gguf-split
:可能是一个用于拆分模型文件的目标,通常用于将一个大模型文件拆分成多个小文件,方便存储和加载。
-
-
复制可执行文件
cp llama.cpp/build/bin/llama-* llama.cpp
将 所有生成的可执行文件 从构建目录
llama.cpp/build/bin/
复制到项目的根目录llama.cpp
下。这样可以更方便地在项目根目录下执行这些可执行文件,而无需每次都进入构建目录。
纯CPU推理
-
模型运行门槛很低,但运行速度非常慢。只调用内存+CPU进行计算,GPU不参与,调用Q4_K_M模型时,实际内存占用为18G。
cd ./llama.cpp./llama-cli \--model /root/lanyun-tmp/QwQ-32B-GGUF/qwq-32b-q4_k_m.gguf \--cache-type-k q4_0 \--threads 10 \--prio 2 \--temp 0.8 \--ctx-size 300 \--seed 1024 \--n-gpu-layers 0 \-no-cnv \--prompt "<|User|>你好,你知道《凡人修仙传吗》<|Assistant|>"
相关参数说明见github
https://github.com/ggml-org/llama.cpp/blob/master/examples/main/README.md
参数说明:
--cache-type-k
:指定缓存类型,K 缓存量化为 4 位(4bit)。--threads
:设置生成过程中要使用的线程数。为了获得最佳性能,建议将此值设置为系统拥有的物理 CPU 核心数--prio
:设置进程优先级--temp
:模型温度参数;温度越高,生成文本的随机性和多样性越具随机性。--ctx-size
:设置提示上下文的大小。默认值为 4096。--seed
:设置随机数生成的种子,用于控制生成结果的随机性。--n-gpu-layers
:需要卸载到 GPU 的层数,设置为0时代表完全使用CPU进行推理;-no-cnv
:禁用多轮对话功能,限制为单轮对话。
-
从下面两张图可以看到,实际占用的内存为19G左右
-
推理速度还是非常慢的,基本也就2个tokens左右1秒
混合推理(CPU+GPU)
-
我们只需要合理的设置
--n-gpu-layers
参数,即可灵活的将模型的部分层加载到GPU上进行运行。并且无需手动设置,llama.cpp会自动识别当前GPU数量以及可以分配的显存,自动将模型权重加载到各个不同的GPU上。例如,我们这里考虑将30层加载到GPU上,运行效果如下所示:./llama-cli \--model /root/lanyun-tmp/QwQ-32B-GGUF/qwq-32b-q4_k_m.gguf \--cache-type-k q4_0 \--threads 10 \--prio 2 \--temp 0.8 \--ctx-size 300 \--seed 1024 \--n-gpu-layers 30 \-no-cnv \--prompt "<|User|>你好,你知道《凡人修仙传吗》<|Assistant|>"
-
此时显存占用约10G左右
-
推理速度大概在4个tokens左右(GPU4090)
纯GPU推理
-
把全部的模型权重都放在GPU上进行推理(4090)。
./llama-cli \--model /root/lanyun-tmp/QwQ-32B-GGUF/qwq-32b-q4_k_m.gguf \--cache-type-k q4_0 \--threads 10 \--prio 2 \--temp 0.8 \--ctx-size 300 \--seed 1024 \--n-gpu-layers 66 \-no-cnv \--prompt "<|User|>你好,你知道《凡人修仙传吗》<|Assistant|>"
-
此时实际GPU占用约在20G左右
-
推理速度达到了约20tokens/s (4090)