一张被嫌弃的“以太坊矿卡”,8GB 显存,没有显示输出,连官方驱动都不认。
2026 年的今天,它却在 Ubuntu 上稳定跑起了 35B MoE 模型,prefill 51 t/s,生成 20 t/s。
—— 只要你不放弃它,它就不会放弃你。

可能P102更好。限于尺寸,只有P104合适。

引言:你以为它是垃圾,其实只是没遇到对的人

我最近掏了张 NVIDIA P104-100。准备替换古旧的GT960显卡。
听名字就知道,它是专门为以太坊挖矿设计的——没有显示接口,官方不提供 Linux 驱动,连二手贩子都嫌弃它“魔改”出身

2026 年的今天,人人都在聊 RTX 5090、AMD AI 加速卡。我还在琢磨古旧的GTX960升级,没办法,AI不是我的核心业务,领导不批采购高端显卡。但960也太古早了,虽然我用它直通到虚拟机后,可以提升电子设计画图的效率,但2G显存貌似只费电,也干不了个啥。

况且,我是个本地智能体(微纳智能体/nanobot)热心用户,需要离线推理 30B+ 的大模型。云端 API 太贵,新卡买不起,但我有一个华硕 X99 老主板、i7-5960 处理器和 64GB 内存也还凑合的前同事淘汰的服务器让我折腾,上面还有一个亮机卡。不能浪费了不是。

硬着头皮上吧。

于是,我选择自费添加P104-100,最小代价的升级。我开始了长达两周的“挖坑 → 填坑 → 再挖坑”之旅。
这篇文章,就是我拿 nvidia-smi 和 llama-bench 伴着退货收货的啰嗦的实录。


一、硬件环境:寒碜,呵呵,没到极点

  • GPU:NVIDIA P104-100 8GB(Pascal 架构,计算能力 6.1,以太坊矿卡,无显示输出)
  • 主板:华硕 X99-A(PCIe 通道分配诡异)
  • CPU:Intel i7-5960(也是当时很强的U了)
  • 内存:64GB DDR4 (这个挺好,超出一般水平)
  • OS:Ubuntu 24.04
  • 目标模型:Qwen3.6-28B-A3B-Q4_K_M.gguf(MoE,总参 28B,激活约 3B,量化后 16GB)
  • 软件:llama.cpp (自编译 with CUDA)

每次看到 nvidia-smi 里那个 P104-100 的名字,我都觉得它在嘲笑我:“你连显示器都接不上我,还想跑大模型?”


二、第一道坎:连驱动都装不上

P104 没有官方 Linux 驱动。
网上搜了一圈,找到了 NVIDIA-patcher 项目(第三方魔改驱动)。折腾了半天,终于装上了 580.142

关键步骤

  1. 下载官方 .run 驱动和NVIDIA-patcher 项目补丁包。
  2. 解压原厂驱动后用NVIDIA-patcher 项目补丁覆盖,然后安装驱动。
  3. 必须在 BIOS 里关闭 Secure Boot,否则驱动加载失败。
  4. 运行 sudo sh cuda_xxx.run,取消安装 Driver 选项(因为已经手动打补丁了)。

验证成功的那天,我看到 nvidia-smi 输出:

  NVIDIA P104-100           8109 MiB

那一刻,我感觉自己像个修好了报废车的修车工,满手油污,但嘴角上扬。


三、第二道坎:llama.cpp 编译,共享内存炸了

高高兴兴 git clone,cmake -DGGML_CUDA=ON,make。

结果:

ptxas error: Entry function uses too much shared data (0xd100 bytes, 0xc000 max)

P104 的共享内存只有 48KB(0xc000),而 Flash Attention 的某个 tile 实例需要 53KB(320,256 那个)。

网上搜到的解决方案

  • 在 cmake 时添加 -DGGML_CUDA_FLASH_ATTN=OFF,彻底禁用 Flash Attention。
  • 或者手动注释 ggml/src/ggml-cuda/fattn-tile.cuh 里所有包含 320,256 的行。

我选择了前者(省事)。编译成功的那一刻,我觉得已经通关了。

太天真了。


四、第三道坎:性能烂到想砸键盘

编译完,下载模型。设置 -ngl 0(纯 CPU),pp512 居然只有 6.63 t/s

而之前我用 GTX 960(2GB)跑同样模型,纯 CPU 也有 45 t/s 啊!
这不对,肯定是哪里出了问题。

运行 sudo lspci -vvv -s 05:00.0 | grep LnkSta,看到:

LnkSta: Speed 2.5GT/s, Width x1 (downgraded)

PCIe 居然降级到了 x1,速度只有 1.0!
难怪 prefill 那么慢,数据都堵在 PCIe 通道上了。


五、第四道坎:与 PCIe 降级死磕

5.1 清洁金手指,换插槽

先拔下来,用橡皮擦擦了擦金手指,重新插回第一条 PCIe x16 槽。
重启,lspci 依然 x1。
再换到第二条槽,还是 x1。

5.2 BIOS 里疯狂设置

华硕 X99 的 BIOS 里,我找到了 Advanced → System Agent Configuration → NB PCI-E Configuration。

  • 把对应插槽的 Link Speed 从 Auto 强制为 Gen3。
  • 找到 PCIe Slot Bandwidth(如果有),设为 x4 Mode。
  • 禁用 ASPM(省电模式)。

保存重启。

奇迹出现了:

LnkSta: Speed 2.5GT/s, Width x4

宽度恢复成了 x4!虽然速度还是 2.5GT/s(PCIe 1.0),但这已经让 prefill 速度从 9 t/s 飙到了 38 t/s。

我差点在工位上喊出来。

重要插曲:后来我试着把卡换到 PCIe 3.0 x16_3 插槽(主板标称支持 3.0),但 lspci 显示 LnkCap 最大依然是 2.5GT/s。
这说明 这张 P104 的 VBIOS 本身锁死了 PCIe 1.0 速度——矿卡的常见手段。
所以插槽不用再换了,x4 宽度已经是最好的结果。


六、性能调优:从 9 t/s 到 51 t/s

6.1 逐层逼近显存极限

我开始用 llama-bench 逐层测试 -ngl(GPU 卸载层数)。从 4 层开始,每加 2 层测一次,同时用 nvidia-smi 监控显存。

ngl

pp512 (t/s)

tg128 (t/s)

显存占用

备注

4

8.03

14.12

~3.5GB

PCIe 瓶颈巨大

8

9.01

14.79

~4.5GB

提升缓慢

10

36.18

15.29

~6GB

宽度 x4 后跃升

12

38.18

17.91

~7GB

稳定

16

42.31

19.09

~7.8GB

接近满载

18

51.00

20.22

~8.0GB

临界点

19

OOM

OOM

溢出

直接退出

-ngl 18 是最佳点,显存接近满载但未溢出,prefill 达到 51 t/s,生成 20.2 t/s。

那一刻,我看着 nvidia-smi 里 P104 满载但没有溢出的状态,觉得这张矿卡终于被“打通了任督二脉”。

6.2 KV Cache 量化:意外收获

我发现显存紧张时,KV Cache 的数据类型(-ctk)会影响稳定性。于是对比了 q4_0、q8_0 和 f16:

type_k

pp512 (t/s)

tg128 (t/s)

显存占用趋势

q4_0

50.84

20.20

最低,稳定

q8_0

51.00

20.22

中等,最稳

f16

50.35

19.54

最高,略抖

结论:q8_0 与 f16 性能几乎无差异,但显存占用更低,是混合卸载场景下的首选。q4_0 可作为极端情况下的“急救包”。

最终启动命令

./main -m Qwen3.6-28B-A3B-Q4_K_M.gguf \
       -ngl 18 \
       -ctk q8_0 \
       -t 8 \
       --no-mmap \
       --numa

七、性能对比:矿卡 vs 纯 CPU vs 小模型

为了让读者有个直观感受,我把之前测试的几种配置放在一起对比:

配置

模型

显存占用

prefill (t/s)

生成 (t/s)

纯 CPU (ngl=0)

35B MoE

0GB

6.63

8.36

优化前 (ngl=12, x1 PCIe)

35B MoE

~7GB

9.76

14.99

最终方案 (ngl=18, x4 PCIe, q8_0)

35B MoE

~8GB

51.0

20.2

9B 稠密 (ngl=99)

9B

~5GB

538

29.6

结论

  • 同是 35B MoE,优化后 prefill 速度是优化前的 5.2 倍,生成速度提升 35%
  • 35B MoE 的生成速度(20 t/s)略低于 9B 稠密(29.6 t/s),不过智商略高一些。
  • 8G老卡用户,可以随意选择 7-9B 稠密,或者35B-A3B MoE。
  • 不得不说,P104跑9B模型真香,奈何我对9B模型已无兴趣。

八、踩坑总结(血泪清单)

问题

解决方案

驱动装不上

使用

NVIDIA-patcher

魔改驱动,关闭 Secure Boot

编译共享内存超限

cmake -DGGML_CUDA_FLASH_ATTN=OFF

PCIe 降级 x1

BIOS 强制设置插槽宽度为 x4,速度 Gen3,禁用 ASPM

显存不足 OOM

用 -ngl xx

逐层测试,找到临界点(18 层)

prefill 速度慢

先解决 PCIe 宽度问题;宽度正常后即使速度低也能接受

生成速度低

P104 显存带宽 192GB/s,20 t/s 是上限,接受它

KV Cache 占显存

使用 -ctk q8_0,性能几乎无损,节省显存


九、老卡不是不能战,而是要用对姿势

这次折腾让我明白了几件事:

  1. 矿卡也能跑大模型。只要肯花时间调试驱动、编译、PCIe、显存,它就能焕发第二春。
  2. MoE 模型是老卡救星。35B MoE 激活参数少,显存压力小,智商还高。
  3. PCIe 宽度比速度更重要。x4 宽度即使只有 PCIe 1.0 速度,也能让 prefill 跑出 50+ t/s。
  4. -ngl 需要精细调优。从 4 到 18,每增加一层都可能带来惊喜,也可能 OOM。
  5. KV Cache 量化是隐形福利。q8_0 不降速但省显存,必须用。

最后,我想对还在用老旧显卡的朋友说:
别急着扔,先试试 MoE 模型 + 精细调参。也许你的“电子垃圾”还能再战三年。

至于我?
这张 P104 会继续在我的机箱里服役,为我的龙虾智能体默默推理,20tps的速度大致和amd HX370 小主机(~25tps)的相当,应付本地养龙虾是足够的。
它没有 RTX 5090 的快,但它有 100 块就能买到的最高性价比的倔强。

矿卡不死,只是换了一种活法。


附录:部分测试数据

点击展开 llama-bench 原始输出

# 修复 PCIe 之前(x1 宽度)
ngl=12: pp512 9.76 t/s, tg128 14.99 t/s

# 修复 PCIe 之后(x4 宽度),未指定 type_k(默认 f16)
ngl=10: pp512 36.18, tg128 15.29
ngl=12: pp512 38.18, tg128 17.91
ngl=16: pp512 42.31, tg128 19.09
ngl=18: pp512 44.79, tg128 20.16

# 最终优化(-ctk q8_0, ngl=18)
ngl=18, q8_0: pp512 51.00, tg128 20.22
ngl=18, q4_0: pp512 50.84, tg128 20.20
ngl=18, f16:  pp512 50.35, tg128 19.54

# ngl=19 尝试
直接 OOM,进程退出

后记

现在,我的龙虾智能体每天都要调用这张矿卡推理几百次。它没让我失望——虽然没有飞快,但稳定、廉价、完全离线。实现了Token FREE
这也许就是 DIY 的乐趣:用最垃圾的硬件,榨出最实用的性能。

如果你也有一张 P104,或者你有不能升级显卡的够强的主机,不妨试试这篇文章里的方法。
万一成功了呢?
那不就是花小钱: 88元+12元折腾费+无价(免费的)人工 ,办大事:引进一个7X24全科硕士小助理么。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐