flint_cpu_opt / benchmarks /summary.md
HelloSun's picture
KLD: add stock-vs-stock control showing flint noise floor; add graph accuracy test
7163b59 verified
|
Raw History Blame Contribute Delete
3.29 kB

flint-UD-Q4_K_XL CPU optimization (Xeon Platinum 8559C, 16 threads)

llama-bench -t 16 -fa on -lm mlock -b 1024 -ub 1024, 3 interleaved rounds (stock / Qwen3.6 patch / this patch per round), median t/s. Raw: ab-interleaved-flint.csv.

variant pp256 pp2048 tg128
stock llama.cpp (de5122d) 231.0 274.2 38.2
Qwen3.6 CPU-OPT patch, unchanged 264.4 307.8 42.1
this patch 295.8 306.7 42.8

Versus stock: pp256 1.28x, pp2048 1.12x, tg128 1.12x. Versus the Qwen patch alone, only pp256 (+12%) is clearly better; decode (+2%) and pp2048 are within noise. Most of the gain comes from the Qwen3.6 patch's kernels also applying to flint.

What is new (flint-specific)

flint-UD-Q4_K_XL is Q5_K 11.6 GiB + IQ4_XS 9.0 GiB + Q8_0 2.0 GiB (+ small Q4_K/Q6_K/IQ3_S).

  1. IQ4_XS x Q8_K vec_dot: AVX512-VNNI (the x86 path had only AVX2). Unsigned LUT (+128) with vpdpbusd, bias removed through bsums, L2 prefetch (GGML_IQ4XS_PF, default 40). Decode MUL_MAT_ID iq4_xs reaches ~97 GB/s.
  2. Q5_K x Q8_K vec_dot: 5th bit merged with vptestmb + masked add instead of shift/and/or. Bit-identical results to the previous VNNI version (KLD unchanged on Qwen3.6 as well). Other contents are the Qwen3.6 patch (Q4_K/Q5_K/Q6_K VNNI, AMX tweaks, tiled MoE group 32). Its Gated-DeltaNet changes do not apply to flint.

Accuracy (wikitext-2 test, 32 x 512, vs stock logits)

KLD same top-1 PPL
stock vs stock (-t 16 vs -t 8) 0.0000 100 % 18.363
Qwen3.6 patch unchanged 0.0664 +- 0.0049 92.2 % -
this patch 0.0666 +- 0.0049 ~92 % 18.277 +- 0.787

PPL is not worse than stock (18.363 +- 0.795).

KLD is much larger than on Qwen3.6 (0.003-0.006), but flint is numerically chaotic: stock llama.cpp compared with itself under a different numeric path gives the same level of KLD (control experiments, same baseline logits):

stock, changed numeric path KLD same top-1
-fa off 0.0762 +- 0.0055 91.7 %
-ub 128 -b 128 0.0700 +- 0.0051 92.0 %
this patch 0.0666 +- 0.0049 ~92 %

So 0.067 is inside the noise floor of stock itself and does not indicate a defect in the kernels. Supporting evidence: a graph-level test (mul_mat and mul_mat_id, K=2048, N=512, random weights) gives the same relative L2 error versus a float reference for stock and this patch to 4 digits (Q4_K/Q5_K/Q6_K/IQ4_XS ~7e-3, Q8_0 ~5.4e-3, dominated by Q8_K activation quantization). Bisect (kld-bisect.log, KLD with one VNNI kernel disabled): Q4_K 0.0670, Q5_K 0.0524, Q6_K 0.0685, IQ4_XS 0.0664; removing all of quants.c gives 0.0162. Why tiny differences get amplified (e.g. top-6-of-256 expert routing ties) was not verified. The earlier flint_cpu_opt README reported KLD 0.2058, which was the same effect measured on a different baseline.

Profile (decode, 64 tokens)

MUL_MAT q8_0 41 % (attention, shared expert, lm_head; close to bandwidth bound), MUL_MAT_ID q5_K 22 %, MUL_MAT q5_K 8 %, MUL_MAT_ID iq4_xs 8 %. Prefill: FLASH_ATTN_EXT 24 %, MUL_MAT_ID q5_K 21 %, q8_0 17 %, iq4_xs 15 %. Prefetch distance, thread count and --poll sweeps showed no gain beyond noise. Not done: flash-attention kernel work, Q8_0 decode kernel.