7900 XT 用了快两年,当初冲着 20G 显存,按跑 27B 模型的规划买的。

这半年基本都在跟它较劲。

先说硬件底子,不然后面讲不清。RDNA3 没有张量核,矩阵指令只剩 CU 上的 WMMA,规格 16×16×16,fp16/bf16/int8/int4。实测 bf16 峰值 16~17 TFLOP/s,跟 NVIDIA 的专用张量核不是一个量级。fp8、tf32 没有,TMA、cp.async、mbarrier 这些也都没有。所以预填是算力活,快不了;解码是带宽活,标称 722 GB/s,实测大概能跑到 56%。

NInfer 那个引擎原本只支持 NVIDIA sm_120a,挪到 ROCm / gfx1100 花了几天,能跑,输出对,PPL 正常。真正的难点在性能,比移植本身大得多。

MMA 没有硬件支持,只能用 SIMT 凑,拿 __shfl 手写 m16n8k16,结果对,但慢。q8 grouped 内核共享内存超 64 KiB,只能缩 tile,一缩并行度就没了。GDN 的 gating_proj 协作网格超上限,要限流。fp8 KV 预填直接崩,还是 64 KiB LDS 那道坎。

q4/q8 的线性测试会在 ~DeviceArena 走到 hipFree 的时候死锁。用 gdb 查过,是 ROCm 7.2.3 运行时自己的问题,跟 NInfer 无关,绕过即可。

另外两条没有做。WMMA 重写,RDNA3 只支持 16×16×16,fragment 布局跟 PTX 的 mma 是两回事,估 15~20 天。外挂 draft 投机,要动 Engine 架构,双模型、双 KV、draft/verify 都得改,也要十几天。这两条都没投时间。最后停在 prefill 249、decode 41.5 tok/s(带 MTP)。

Bonsai 是三进制模型,Qwen 基座,2.13 bpw,7 GB 左右。装是秒装,慢都慢在加速上。Vulkan 后端没有三进制内核,会悄悄退回 CPU,只有 4.4 tok/s。只能换 ROCm。外挂 2B draft 净亏,55.2 掉到 44.0,accept 38%。自己蒸 draft,v1 56 万 token,v2 440 万,数据翻八倍,accept 还是 38%。PQ2_0 打包三进制权重之后 draft 直接坏,输出乱码,accept 0%。三进制得上 QAT 或 imatrix,通用 PTQ 套不上。投机回本要 accept 78% 左右,这边一直 38%,没有再跟。

Qwen 自带一个 MTP 头,本来就是投机的。为了看重训有没有提升,整条链路自己搭:下 55 GB 权重,写流式 int4 加载器(30 GB 内存装不下 27B,只能边读边量化),还原 MTP 头语义(输入 (h_t, emb(t+1)),预测 t+2),按 FastMTP 递归造数据,重建 GGUF,塞进 llama.cpp 测。

accept 一动不动。int4 hidden、Q4_K hidden,交叉熵、用 target 的 greedy 做自蒸馏,全试了,nmax=1 持平,nmax=2 在噪声里晃。原因后来才拆清楚:accept 只看 draft 能否对上 target 的 greedy,而语料里的 ground-truth 不等于 target 的 greedy,拿交叉熵把 head 往 ground-truth 推,可能反而离 target 更远。预训练那个头大概率本来就是自蒸馏来的。

KVMem 的参数也扫过:KV q4_0 / q8_0 一样,budget 32768/16384/8192 一样,n_max 2 最好再大掉,p_min 和 flash-attn 基本没影响。KVMem 已经把每个 token 要读的 KV 卡死,解码跟上下文长度、KV 配置关系不大,实际就吃权重带宽和 MTP 质量。

目前停在这里。