Ubuntu 22.04 使用 llama.cpp 部署 Qwopus3.6-27B-v2-MTP-GGUF:双张 2080 Ti 跑通 262K 上下文与 MTP 加速实测

最近我在 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
因此,首次测试的 MTP 接受率为:
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
这说明在本次环境中,双张 RTX 2080 Ti 22GB 已经能够稳定运行该模型的 MTP 推测解码和 262K 上下文配置。需要说明的是,这四次请求的输入内容和输出长度并不完全一致,因此它们适合用来观察运行状态与速度区间,而不能直接当作严格控制变量的横向 benchmark。

十二、总结:双张 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=3row 双卡拆分模式、较短上下文以及关闭思考模式进行严格对照测试,进一步寻找这套硬件上的最佳配置。

原创文章,作者:朋远方,如若转载,请注明出处:https://caovan.com/ubuntu-2204-shiyong-llamacpp-bushu-qwopus36-27b-v2-mtp-ggufshuangzhang-2080-ti-paotong-262k-shangxiaban/.html

(0)
打赏 微信扫一扫 微信扫一扫
朋远方的头像朋远方
Ubuntu 22.04 安装 Hermes Agent 教程:Miniconda 接入本地 vLLM/Qwen 与 Telegram 机器人
上一篇 2026年5月23日 上午7:16
如何在Stable Diffusion Webui使用SDXL0.9模型
下一篇 2023年7月22日 下午2:24

相关推荐

发表回复

登录后才能评论