最近我在 Ubuntu 22.04 服务器上测试了一款比较有意思的 GGUF 大模型:Qwopus3.6-27B-v2-MTP-GGUF。
这个模型基于 Qwen3.6-27B,重点面向推理、代码、DevOps 和数学等任务,并加入了 Multi-Token Prediction,简称 MTP。简单来说,传统模型通常一次生成一个 token,而 MTP 会尝试提前预测多个 token;如果预测被主模型接受,就有机会提升实际生成速度。
模型作者将其定位为速度向的社区实验版本,并提供了 llama.cpp 的直接运行方式。本次测试使用的量化文件为:
Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf
该文件大小约为 16.8GB,适合在 22GB 显存级别显卡上进行部署测试。RTX 2080 Ti 22GB 成功加载模型;
- 成功启用 CUDA 推理;
- 成功启用 MTP 推测解码;
- 成功运行
262144上下文; - 首次 1024 tokens 输出实测速度为 34.03 tokens/s;
- 四次已完成请求的累计 MTP 接受率约为 63.03%。
本文将完整记录部署、下载、编译、启动、API 调用、测速结果以及后续优化方向。
一、测试硬件与软件环境
本次测试服务器环境如下:
| 项目 | 配置 |
|---|---|
| 操作系统 | Ubuntu 22.04 |
| Python 环境管理 | Miniconda |
| 推理框架 | 最新版 CUDA 版 llama.cpp |
| CPU | Intel Xeon E5-2680 v4 |
| 内存 | 约 256GB |
| 显卡 | 2 × NVIDIA GeForce RTX 2080 Ti 22GB |
| CUDA 架构 | Compute Capability 7.5 |
| 模型 | Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf |
| 模型大小 | 约 16.8GB |
| 上下文长度 | 262144 tokens |
| 推测解码 | draft-mtp |
| API 接口 | OpenAI 兼容接口 /v1/chat/completions |
实际启动日志中,程序成功识别到了两张 22GB 显存的 RTX 2080 Ti、E5-2680 v4 处理器以及约 256GB 内存。
二、为什么选择 llama.cpp 运行这个 GGUF 模型
GGUF 是 llama.cpp 生态中最常见的模型格式之一。虽然部分其他推理框架也可以尝试加载 GGUF,但这次测试的核心目标不只是“能跑起来”,而是需要:
- 正确加载 GGUF 量化模型;
- 启用 CUDA 显卡推理;
- 启用模型自带的 MTP 推测解码;
- 提供 OpenAI 兼容 API;
- 可以详细查看 tokens/s、MTP 接受率等日志。
llama-server 原生支持量化模型、OpenAI 兼容接口、Flash Attention、双卡拆分以及 speculative decoding;官方当前参数中也已经包含:
--spec-type draft-mtp
--spec-draft-n-max
--spec-draft-ngl
因此,本次部署直接采用最新版源码编译的 CUDA 版 llama.cpp。niconda 环境
建议不要污染现有的 vLLM、ComfyUI 或其他 AI 环境,单独创建一个用于 llama.cpp 的环境。
conda create -n llamacpp python=3.11 -y
conda activate llamacpp
安装基础编译工具:
sudo apt update
sudo apt install -y git build-essential cmake ninja-build
安装 Hugging Face 下载工具:
pip install -U huggingface_hub hf_xet
确认 NVIDIA 驱动和 CUDA 编译器正常:
nvidia-smi
nvcc --version
如果 nvidia-smi 能正常显示显卡,nvcc --version 能显示 CUDA 版本,即可继续后续步骤。
四、编译支持 CUDA 的最新版 llama.cpp
先创建源码目录并下载 llama.cpp:
mkdir -p ~/src
cd ~/src
git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
RTX 2080 Ti 的 CUDA Compute Capability 为 7.5,因此编译时可以只指定对应架构:
cmake -B build -G Ninja \
-DGGML_CUDA=ON \
-DCMAKE_CUDA_ARCHITECTURES=75 \
-DCMAKE_BUILD_TYPE=Release
cmake --build build -j"$(nproc)" --target llama-server llama-cli
llama.cpp 官方文档支持通过 -DGGML_CUDA=ON 开启 CUDA 后端,也支持通过 -DCMAKE_CUDA_ARCHITECTURES 手动指定目标显卡架构,从而避免编译无关架构。
ls -lh ~/src/llama.cpp/build/bin/llama-server ls -lh ~/src/llama.cpp/build/bin/llama-cli
五、确认当前版本是否支持 MTP
执行下面命令:
cd ~/src/llama.cpp ./build/bin/llama-server --help | grep -E "draft-mtp|spec-draft-n-max"
--spec-draft-n-max N --spec-type none,draft-simple,draft-eagle3,draft-mtp,...
其中:
--spec-type draft-mtp
表示 llama-server 已经支持通过模型内置的 MTP 结构进行推测解码。
--spec-draft-n-max N
表示每轮最多提前预测多少个 token。当前官方默认值为 3,本次测试为了优先保证稳定性,使用的是:
--spec-draft-n-max 2
F 模型到 /data/qwen
本次使用的模型文件为:
Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf
先创建模型目录:
sudo mkdir -p /data/qwen
sudo chown -R $USER:$USER /data/qwen
Hugging Face 当前的大文件下载已经切换到 Xet 存储机制。官方提供了:
HF_XET_HIGH_PERFORMANCE=1
用于尽量利用网络带宽和 CPU 并发,提高大文件下载速度。
export HF_XET_HIGH_PERFORMANCE=1 hf download Jackrong/Qwopus3.6-27B-v2-MTP-GGUF
Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf
--local-dir /data/qwen
下载完成后检查文件:
ls -lh /data/qwen/Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf
正常应能看到约 16.8G 的模型文件。
如果本地输出与上面完全一致,说明模型文件下载完整。2080 Ti 启动模型
本次最终跑通的启动参数如下:
export CUDA_VISIBLE_DEVICES=0,1 export CUDA_SCALE_LAUNCH_QUEUES=4x ~/src/llama.cpp/build/bin/llama-server \ -m /data/qwen/Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf \ --host 0.0.0.0 \ --port 8000 \ --alias Qwopus3.6-27B-v2-MTP \ --api-key local-qwopus-key \ --gpu-layers all \ --split-mode layer \ --tensor-split 1,1 \ --flash-attn on \ --ctx-size 262144 \ --parallel 1 \ --cache-type-k q8_0 \ --cache-type-v q8_0 \ --spec-type draft-mtp \ --spec-draft-n-max 2 \ --spec-draft-ngl all \ --no-mmproj \ --perf
主要参数说明
| 参数 | 作用 |
|---|---|
CUDA_VISIBLE_DEVICES=0,1 |
指定使用第 0、1 张显卡 |
CUDA_SCALE_LAUNCH_QUEUES=4x |
调整 CUDA 队列资源,作为当前测试环境中的优化变量 |
-m |
指定本地 GGUF 模型路径 |
--host 0.0.0.0 |
允许局域网其他设备访问 API |
--port 8000 |
API 服务端口 |
--alias |
设置 API 调用时使用的模型名称 |
--api-key |
设置调用接口时需要的密钥 |
--gpu-layers all |
尽可能把模型层放入显卡运行 |
--split-mode layer |
将模型层和 KV Cache 分配到两张显卡 |
--tensor-split 1,1 |
两张相同显存显卡平均分配 |
--flash-attn on |
开启 Flash Attention |
--ctx-size 262144 |
设置 262K 上下文 |
--parallel 1 |
单路并发,优先测试单任务生成速度 |
--cache-type-k q8_0 |
K Cache 使用 q8_0,节省显存 |
--cache-type-v q8_0 |
V Cache 使用 q8_0,节省显存 |
--spec-type draft-mtp |
启用 MTP 推测解码 |
--spec-draft-n-max 2 |
每次最多提前预测 2 个 token |
--spec-draft-ngl all |
尽可能将 MTP draft 部分也放入 GPU |
--no-mmproj |
本次只测试文本模型,不加载视觉投影模块 |
--perf |
输出详细性能统计 |
llama.cpp 官方文档中,layer 表示以流水线方式将层和 KV 分散到多个 GPU;row 表示按权重行并行拆分;tensor 模式属于实验性并行拆分。官方同时支持 q8_0 类型的 K/V Cache、Flash Attention 以及 MTP draft 参数。启动成功
成功启动后,日志中出现了以下关键信息:
- CUDA0 : NVIDIA GeForce RTX 2080 Ti (22000 MiB, 21835 MiB free)
- CUDA1 : NVIDIA GeForce RTX 2080 Ti (22000 MiB, 21835 MiB free)
这表示两张显卡都被正确识别。
随后出现:
creating MTP draft context against the target model
adding speculative implementation 'draft-mtp'
- n_max=2
speculative decoding context initialized
这表示 MTP 推测解码已经成功启用,并且当前配置为每轮最多预测 2 个 token。
接着出现:
new slot, n_ctx = 262144
这说明:
--ctx-size 262144
已经成功生效。
最后出现:
model loaded
server is listening on http://0.0.0.0:8000
all slots are idle
表示模型已经加载完成,API 服务正在监听 8000 端口,可以接受外部请求。
九、启动过程中出现的警告是否需要处理
启动日志中出现过下面这条警告:
--cache-idle-slots requires --kv-unified, disabling
这不是模型加载失败,也不是显存不足。
它表示 llama-server 检测到某个空闲槽位缓存功能需要搭配 --kv-unified 才能使用,因此自动禁用了该功能。
本次配置使用的是:
--parallel 1
也就是单路请求测速场景,因此这个警告不会影响模型正常输出,也不会影响 MTP 是否启用。
十、使用 curl 调用本地 OpenAI 兼容 API
模型启动成功后,另开一个终端执行:
curl http://127.0.0.1:8000/v1/chat/completions \
-H "Content-Type: application/json" \
-H "Authorization: Bearer local-qwopus-key" \
-d '{
"model": "Qwopus3.6-27B-v2-MTP",
"messages": [
{
"role": "user",
"content": "请用中文详细介绍一下你自己,并说明你擅长完成哪些任务。"
}
],
"max_tokens": 1024,
"temperature": 0.7
}'
本次接口调用成功返回了模型回答,同时返回了性能字段:
"timings": {
"prompt_per_second": 12.992468698977493,
"predicted_per_second": 34.03384107126833,
"draft_n": 897,
"draft_n_accepted": 574
}
其中最值得关注的是:
| 字段 | 含义 |
|---|---|
prompt_per_second |
输入提示词处理速度 |
predicted_per_second |
实际生成速度,即常说的 tokens/s |
draft_n |
MTP 预测生成的 token 数 |
draft_n_accepted |
被主模型接受的预测 token 数 |
首次测试中:
predicted_per_second = 34.03
draft_n = 897
draft_n_accepted = 574
574 ÷ 897 ≈ 63.99%
十一、实测结果汇总
下面是同一套启动配置下,日志中记录到的四次完整生成结果:
| 测试序号 | 输入 tokens | 输出 tokens | 输入处理速度 | 生成速度 | MTP 接受率 |
|---|---|---|---|---|---|
| 1 | 24 | 1024 | 12.99 tokens/s | 34.03 tokens/s | 63.99% |
| 2 | 21 | 182 | 126.51 tokens/s | 35.89 tokens/s | 69.74% |
| 3 | 20 | 4713 | 125.85 tokens/s | 32.87 tokens/s | 61.52% |
| 4 | 2452 | 1063 | 685.54 tokens/s | 34.72 tokens/s | 68.00% |
四次请求累计数据如下:
| 指标 | 结果 |
|---|---|
| 累计输出 tokens | 6982 |
| 累计生成耗时 | 约 209.16 秒 |
| 加权平均生成速度 | 约 33.38 tokens/s |
| 累计 MTP 预测 tokens | 6175 |
| 累计被接受 tokens | 3892 |
| 累计 MTP 接受率 | 约 63.03% |
其中,第三次请求连续输出了 4713 tokens,最终仍保持:
32.87 tokens/s
2452 tokens,输出 1063 tokens,生成速度仍达到:34.72 tokens/s
十二、总结:双张 2080 Ti 依然可以高质量运行 27B MTP 模型
本次测试证明,在 Ubuntu 22.04 + Miniconda 环境下,使用最新版 CUDA 版 llama.cpp,可以在双张 RTX 2080 Ti 22GB 显卡上成功部署:
Qwopus3.6-27B-v2-MTP-Q4_K_M.gguf
并同时实现:
- CUDA 双卡推理;
- 262144 tokens 上下文;
- MTP 推测解码;
- OpenAI 兼容 API;
- 单路生成速度约 33~35 tokens/s;
- MTP 累计接受率约 63%。
对于手上已有老款大显存显卡的用户来说,这种方式仍然具备很高的实用价值:不需要昂贵的新一代 GPU,也可以本地运行具有较强代码、推理与 Agent 能力的 27B 模型。
需要强调的是,模型作者将该版本定位为社区实验发布版本;本文记录的是已经成功跑通的真实部署与测速过程,而不是声称已经找到了绝对最高速度。后续还可以继续围绕 MTP=3、row 双卡拆分模式、较短上下文以及关闭思考模式进行严格对照测试,进一步寻找这套硬件上的最佳配置。
原创文章,作者:朋远方,如若转载,请注明出处:https://caovan.com/ubuntu-2204-shiyong-llamacpp-bushu-qwopus36-27b-v2-mtp-ggufshuangzhang-2080-ti-paotong-262k-shangxiaban/.html


微信扫一扫