前情提要:
MoXing:低预算场景用RX580显卡轻松运行Qwen3.5-9b-q4_k_m模型
Void + MoXing:低成本方案用RX580显卡本地运行qwen3.5:9B模型,打造类Cursor体验
MoXing新升级:直接夺舍 Ollama ,部分模型提速 50%
MoXing 和 Ollama 对比:从omnicoder-9b到更多模型
MoXing 速度最高达到 Ollama的 201% ,同模型同硬件的实测对比OmniCoder-2-9B 的 Q4_K_M 量化模型
我也是个「垃圾佬」,手上有好几个「上古玩物」:一块 Tesla P4(8GB 显存的老计算卡),一张 RX 580 2048SP(16GB 显存的本土特供矿卡),还有一颗 Xeon E5-2699 v3(18 核的老至强),如今试试跑本地大模型玩一下。
都有十年以上了。P4 是 2016 年的东西,功耗才 75W,连外接供电都不要。RX 580 也是差不多年代的,不过我这个是魔改的 16GB 显存的版本,显存比标准版翻了一倍。CPU 就更老了,Haswell-EP 架构,2014 年的产品。
但就是这些老家伙,搭配上 MoXing 这个 llama.cpp 的 Python 封装,跑起 9B 的模型来居然还能对付凑合了。
pip install moxing -u # 更新安装
moxing download-binaries # 下载后端
moxing update-binaries # 更新后端
moxing devices # 查看设备
┏━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━┓
┃ ID ┃ Name ┃ Backend ┃ Memory ┃ Free ┃ Vendor ┃
┡━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━┩
│ gpu0 │ Tesla P4 │ CUDA │ 8.0GB │ 7.8GB │ nvidia │
│ gpu1 │ AMD Radeon RX 580 2048SP │ VULKAN │ 15.8GB │ 15.8GB │ amd │
│ cpu │ CPU │ CPU │ 63.9GB │ 53.4GB │ cpu │
└────────┴──────────────────────────────────┴──────────┴────────────┴────────────┴──────────┘
昨晚上肚子疼,于是花了几个小时,用 OmniCoder-9B 模型(Q4_K_M 和 Q5_K_M 两种量化),把这三块东西 + 三种后端组合(CUDA、Vulkan、CPU)挨个测了一遍。每条跑三次取平均,一共八组数据。
这篇文章就是把这些数据摊开来聊聊。
手里这三块东西,到底啥情况
先说说硬件。这仨东西的底细得讲清楚。
Tesla P4 是 NVIDIA 当年给数据中心做的推理卡。Pascal 架构,2560 个 CUDA 核心,8GB GDDR5 显存,带宽 192 GB/s。这卡有个好处,它是 TCC 驱动模式,绕过 Windows 的显示栈,延迟比普通显卡低一截。但 Pascal 架构有个硬伤:FP16 算力只有 FP32 的 1/64,等于说半精度基本废了,只能靠量化后的 INT8/INT4 干活。
RX 580 2048SP 这东西其实不是标准版 RX 580。它是本土市场特供的,核心用的是 Polaris 20(跟 RX 570 一样),只有 2048 个流处理器,标准 RX 580 是 2304 个。但这个是一个魔改版本,显存给到了 16GB GDDR5,带宽大约 256 GB/s——比 P4 的 192 GB/s 高了一截。在 Windows 上 ROCm 后端用不了,只能走 Vulkan。Polaris 架构是 GCN 4.0,也没有 AI 加速单元,全是通用计算硬扛。
Xeon E5-2699 v3 18 核 36 线程,基频 2.3GHz,四通道 DDR4 内存,理论带宽约 68 GB/s。支持 AVX2 和 FMA3 指令集,这两个对 llama.cpp 的 CPU 推理很关键。但 CPU 那点内存带宽跟 GPU 显存带宽比,差了三四倍。

三台设备的具体参数我就不列表了。大家心里有个数就行:P4 算力最强但显存最小,RX 580 显存最大但架构最老,CPU 啥都好就是慢。
| 后端 | 构建版本 | Git Commit | 加载的 ggml 后端 |
|---|---|---|---|
| CUDA | 9045 | a00e47e42 | CUDA, CPU (Haswell) |
| Vulkan | 9030 | a09a00e50 | Vulkan, CPU (Haswell), RPC |
| CPU | 8676 | 482d862bc | CPU (Haswell), RPC |
版本差异说明: CUDA 构建版本最新(9045),包含最新的 CUDA kernel 优化。Vulkan 构建版本次之(9030),支持 RPC(Remote Procedure Call)后端用于分布式推理。CPU 构建版本较旧(8676),但 Haswell 优化保持稳定。
测的啥模型,怎么测的
模型用的是 Tesslate 的 OmniCoder-9B-GGUF,一个 9B 参数的代码生成模型。两种量化格式:
| 模型文件 | 量化方式 | 文件大小 | 参数量 |
|---|---|---|---|
| omnicoder-2-9b-q4_k_m.gguf | Q4_K_M (4-bit K-quant Medium) | 5.34 GB | ~9B |
| omnicoder-2-9b-q5_k_m.gguf | Q5_K_M (5-bit K-quant Medium) | 6.08 GB | ~9B |
模型来源: Tesslate/OmniCoder-9B-GGUF 基础架构: 基于 9B 参数量的代码生成模型
Q4_K_M 文件大小 5.34 GB,网上说大约需要这么些显存。Q5_K_M 文件 6.08 GB,体积多了 13.9%,但输出质量未必就更高很多。
测试设置比较标准:提示词是一个 36 token 的英文句子("Write a detailed explanation of how neural networks work..."),固定生成 128 个 token。上下文窗口开 4096,KV 缓存用的 Q4_0 量化(这个能省大概 75% 的 KV 缓存显存)。GPU 层全部卸载到显存上。
每条组合跑三轮,预热一轮,取平均值。
启动命令长这样:
# CUDA + Tesla P4 + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d gpu0 -b cuda -n 128 -r 3 -w --json
# Vulkan + Tesla P4 + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d gpu0 -b vulkan -n 128 -r 3 -w --json
# Vulkan + RX 580 + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d gpu1 -b vulkan -n 128 -r 3 -w --json
# CPU + Q4_K_M
moxing bench omnicoder-2-9b-q4_k_m.gguf -d cpu -b cpu -n 128 -r 3 -w --json
# CUDA + Tesla P4 + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d gpu0 -b cuda -n 128 -r 3 -w --json
# Vulkan + Tesla P4 + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d gpu0 -b vulkan -n 128 -r 3 -w --json
# Vulkan + RX 580 + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d gpu1 -b vulkan -n 128 -r 3 -w --json
# CPU + Q5_K_M
moxing bench omnicoder-2-9b-q5_k_m.gguf -d cpu -b cpu -n 128 -r 3 -w --json
| 参数 | 值 | 说明 |
|---|---|---|
| 提示词 | "Write a detailed explanation of how neural networks work..." | 标准测试提示词 (36 tokens) |
| 生成 token 数 | 128 | 固定生成长度 |
| 上下文窗口 | 4096 | 最大上下文长度 |
| 批处理大小 | 512 | --batch-size |
| 微批次大小 | 512 | --ubatch-size |
| GPU 卸载 | all (-ngl auto) | 全量卸载到 GPU |
| KV 缓存量化 | Q4_0 | -ctk q4_0 -ctv q4_0 |
| 连续批处理 | 启用 | --cont-batching |
| KV 碎片整理阈值 | 0.1 | --defrag-thold 0.1 |
| 统一 KV 缓存 | 启用 | --kv-unified |
| 运行轮数 | 3 | 每组合运行 3 轮取平均 |
Q5_K_M 也是同样的套路,把模型文件名换一下就行。
K-quant 量化是 GGML/GGUF 格式的核心特性,采用混合精度策略对模型权重进行压缩 [2]。Q4_K_M 和 Q5_K_M 的具体特征如下:
- Q4_K_M: 使用 4-bit 量化为主,部分重要层(如注意力输出层)保留 6-bit 精度。在 perplexity 损失和速度之间取得良好平衡。
- Q5_K_M: 使用 5-bit 量化为主,重要层保留 8-bit 精度。相比 Q4_K_M 提供更高的输出质量,但模型体积增加约 14%。
| 设备 | 显存容量 | Q4_K_M (5.34GB) | Q5_K_M (6.08GB) | Q8_0 (~10GB) |
|---|---|---|---|---|
| Tesla P4 | 8.0 GB | ✅ 全量 GPU | ✅ 全量 GPU | ❌ |
| RX 580 2048SP | 16.0 GB | ✅ 充裕 | ✅ 充裕 | ✅ 全量 GPU |
测试中启用了 KV 缓存量化(-ctk q4_0 -ctv q4_0),将 KV 缓存从 FP16 压缩至 4-bit,在 4096 上下文窗口下节省约 75% 的 KV 显存占用。
| 组合编号 | 设备 | 后端 | 量化格式 |
|---|---|---|---|
| 1 | Tesla P4 (gpu0) | CUDA | Q4_K_M |
| 2 | Tesla P4 (gpu0) | Vulkan | Q4_K_M |
| 3 | RX 580 2048SP (gpu1) | Vulkan | Q4_K_M |
| 4 | CPU | CPU | Q4_K_M |
| 5 | Tesla P4 (gpu0) | CUDA | Q5_K_M |
| 6 | Tesla P4 (gpu0) | Vulkan | Q5_K_M |
| 7 | RX 580 2048SP (gpu1) | Vulkan | Q5_K_M |
| 8 | CPU | CPU | Q5_K_M |
结果:谁快谁慢,一目了然
Q4_K_M 量化结果
| 设备/后端 | 生成速度 (tok/s) | 提示处理速度 (tok/s) |
|---|---|---|
| Tesla P4 + CUDA | 17.80 | 5.01 |
| Tesla P4 + Vulkan | 9.51 | 2.67 |
| RX 580 2048SP + Vulkan | 9.75 | 2.74 |
| CPU + CPU | 2.38 | 0.67 |
Q5_K_M 量化结果
| 设备/后端 | 生成速度 (tok/s) | 提示处理速度 (tok/s) |
|---|---|---|
| Tesla P4 + CUDA | 16.37 | 4.60 |
| Tesla P4 + Vulkan | 8.91 | 2.51 |
| RX 580 2048SP + Vulkan | 8.88 | 2.50 |
| CPU + CPU | 2.14 | 0.60 |
量化格式对比
| 指标 | Q4_K_M (CUDA/P4) | Q5_K_M (CUDA/P4) | 差异 | 变化率 |
|---|---|---|---|---|
| 模型大小 | 5.34 GB | 6.08 GB | +0.74 GB | +13.9% |
| 生成速度 | 17.80 tok/s | 16.37 tok/s | -1.43 tok/s | -8.0% |
| 提示处理速度 | 5.01 tok/s | 4.60 tok/s | -0.41 tok/s | -8.2% |
后端对比 (Tesla P4)
| 指标 | CUDA | Vulkan | CUDA 优势 |
|---|---|---|---|
| Q4_K_M 生成速度 | 17.80 tok/s | 9.51 tok/s | 1.87x |
| Q4_K_M 提示速度 | 5.01 tok/s | 2.67 tok/s | 1.88x |
| Q5_K_M 生成速度 | 16.37 tok/s | 8.91 tok/s | 1.84x |
| Q5_K_M 提示速度 | 4.60 tok/s | 2.51 tok/s | 1.83x |
GPU 对比 (Vulkan 后端)
| 指标 | Tesla P4 (8GB) | RX 580 2048SP (16GB) | 差异 |
|---|---|---|---|
| Q4_K_M 生成速度 | 9.51 tok/s | 9.75 tok/s | RX 580 快 2.5% |
| Q4_K_M 提示速度 | 2.67 tok/s | 2.74 tok/s | RX 580 快 2.6% |
| Q5_K_M 生成速度 | 8.91 tok/s | 8.88 tok/s | 基本持平 |
| Q5_K_M 提示速度 | 2.51 tok/s | 2.50 tok/s | 基本持平 |
| 显存容量 | 8 GB | 16 GB | RX 580 多 100% |
详细评价
CUDA 为什么比 Vulkan 快这么多? 核心原因就三个。第一, CUDA kernel 优化了很多年,针对 NVIDIA GPU 的线程块配置、共享内存使用都调得很细。Vulkan 后端要兼容 NVIDIA、AMD、Intel 三家,没法像 CUDA 那样针对单一架构深挖。第二,CUDA 的统一虚拟内存可以自动在 CPU 和 GPU 之间搬数据,Vulkan 得手动管,多了开销。第三,P4 在 TCC 模式下 CUDA 驱动直接管 GPU,绕过 Windows 显示管理器;Vulkan 还要走 WDDM 调度,延迟更高。
RX 580 Vulkan 为啥没比 P4 Vulkan 快多少? RX 580 的显存带宽比 P4 高 33%,按理说生成阶段(自回归解码)是吃带宽的,应该更快才对。但实际只快了 2.5%。问题出在 Vulkan 后端上:它对 GCN 架构的优化不够,没法把 256 GB/s 的带宽优势转化成实际性能。P4 虽然带宽低,但 Vulkan 后端对 Pascal 的支持稍好一些,把差距抹平了。
CPU 为什么慢那么多? 主要是内存带宽。CPU 四通道 DDR4 理论带宽 68 GB/s,实际还不到这个数。P4 显存带宽 192 GB/s,是 CPU 的将近三倍。AVX2 指令集帮忙提了点速度,但杯水车薪。CPU 推理的定位很明确:没有 GPU 时候的备胎。
RX 580 16GB 显存的价值在哪? 虽然速度上 RX 580 没赢,但它的 16GB 显存是个大杀器。P4 的 8GB 刚好能装下 Q4/Q5 的 9B 模型,稍微大一点的就装不下了。RX 580 不仅能装,还能开更大的上下文窗口。KV 缓存量化后,16GB 大概能撑 16384 到 32768 的上下文,P4 只能到 4096-8192。如果你需要跑长对话或者高质量推理,RX 580 的显存优势是实打实的。
到底该咋选?
| 应用场景 | 推荐设备/后端 | 推荐量化 | 实测速度 |
|---|---|---|---|
| 实时对话 (<60ms/token) | Tesla P4 + CUDA | Q4_K_M | 17.80 tok/s |
| 代码生成 (质量优先) | Tesla P4 + CUDA | Q5_K_M | 16.37 tok/s |
| 大上下文对话 (16K+) | RX 580 + Vulkan | Q4_K_M | 9.75 tok/s |
| 离线批处理 | CPU | Q4_K_M | 2.38 tok/s |
| 无 GPU 环境 | CPU | Q4_K_M | 2.38 tok/s |
看完数据,我的建议是这样:
如果你有 NVIDIA 显卡,别犹豫,直接上 CUDA 后端。P4 这种老卡都能跑 17.80 tok/s,跟人聊天完全够了。量化格式选 Q4_K_M 就行,除非你对输出质量要求特别高才上 Q5,代价是慢 8%。
如果你只有 AMD 的古老显卡(Windows 上),走 Vulkan 后端,大概能到 9-10 tok/s。比 CUDA 慢,但好歹能用。
如果你啥显卡都没有,CPU 也能跑,就是得忍 2-3 tok/s 的速度。适合离线批处理或者对延迟完全不敏感的场景。
说点实话
这次测试有不少局限。只测了一个 9B 的模型,7B、13B、70B 都没碰。上下文也只测了 4096,更大的窗口是啥表现不知道。AMD 在 Linux 上能用的 ROCm 后端,但 RX580 已经不被支持了。
RX 580 16GB 这张卡挺有意思。速度上跟 P4 的 Vulkan 差不多,但显存翻倍,能跑更大的模型和更长的上下文。在二手市场上这东西不算贵,如果只是想搭个本地 AI 环境玩玩,是个有点意思的选项。
最后说一句 MoXing,本质上就是个 llama.cpp 的 Python 包装,但把设备检测、模型下载、后端选择这些琐事都帮你处理好了。一条命令就能起服务,不用自己去折腾命令行参数,省了不少事。
附录 符号与缩写对照表
| 符号/缩写 | 全称 | 说明 |
|---|---|---|
| LLM | Large Language Model | 大语言模型 |
| GGUF | GGML Unified Format | GGML 统一模型格式 |
| KV | Key-Value | 注意力机制中的键值缓存 |
| tok/s | Tokens per second | 每秒生成的 token 数 |
| Q4_K_M | 4-bit K-quant Medium | 4-bit 混合精度量化 |
| Q5_K_M | 5-bit K-quant Medium | 5-bit 混合精度量化 |
| TCC | Tesla Compute Cluster | NVIDIA 专用计算驱动模式 |
| WDDM | Windows Display Driver Model | Windows 显示驱动模型 |
| FP16/FP32 | 16/32-bit Floating Point | 半精度/单精度浮点 |
| SIMD | Single Instruction Multiple Data | 单指令多数据流 |
| AVX2 | Advanced Vector Extensions 2 | Intel 256-bit SIMD 指令集 |
| MoE | Mixture of Experts | 混合专家模型架构 |
| RPC | Remote Procedure Call | 远程过程调用 |
| UVM | Unified Virtual Memory | NVIDIA 统一虚拟内存 |
写到这,数据都在上面了。
预览时标签不可点
Close
更多
Name cleared
微信扫一扫赞赏作者
Like the AuthorOther Amount
赞赏后展示我的头像
作品
暂无作品
Like the Author
Other Amount
¥
最低赞赏 ¥0
OK
Back
Other Amount
更多
赞赏金额
¥
最低赞赏 ¥0
1
2
3
4
5
6
7
8
9
0
.
大语言模型 · 目录
大语言模型
上一篇MoXing 速度最高达到 Ollama的 201% ,同模型同硬件的实测对比OmniCoder-2-9B 的 Q4_K_M 量化模型下一篇超强的本地小模型OmniCoder-9B的安装与使用指南
Close
更多
搜索「」网络结果
Close
调整当前正文文字大小
更多
100%