ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

ik_llama.cpp 中的 IQ4_K_R4:行交错重打包量化(R4 Repacked Quants)原理与性能实测

ik_llama.cpp 中的 IQ4_K_R4:行交错重打包量化(R4 Repacked Quants)原理与性能实测 ik_llama.cpp 中的 IQ4_K_R4行交错重打包量化R4 Repacked Quants原理与性能实测【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp本篇文章围绕 ik_llama.cpp 在 2024 年 12 月引入的IQ4_K_R4以及同系列的IQX_K_R4行交错量化展开介绍R4 重打包这种量化格式的动机、与IQ4_K/IQ4_KS等基础格式的区别、其在 ARM_NEON / AVX2 / Zen4 平台上的实测性能数据以及如何通过llama-quantize工具把已有模型重打包为 R4 格式。读完本文你将理解为什么相同 bpw、更好 CPU 推理速度的 R4 量化是 CPU 推理场景的重要选项并掌握具体的重打包命令与适用边界。1. 背景从 IQ4_K 到 IQ4_K_R4IQ4_K是 ik_llama.cppllama.cpp 的一个增强分支提出的一类 4 位非线性量化。与传统 k-quants 不同IQX_K系列不在组权重上使用大体积码本codebook而是对单个量化值使用非线性映射映射表只有 16 个条目4 位量化可以完整装入 12 个 SIMD 寄存器从而在 CPU 上通过_mm256_shuffle_epi8AVX2或vqtbl1q_s8ARM_NEON这类指令以几乎与线性映射相同的开销完成查表见 discussions/8 - New quantization types IQ2_K, IQ3_K, IQ4_K, IQ5_K。由此衍生出两类变体IQ4_K以 16 个权重为 block、256 个权重的 super-block 组织约 4.5 bpwIQ4_KS以 32 个权重为 block、行级 float scale约 4.25 bpw量化误差通常比同 bpw 的IQ4_XS更低见 pull_requests/83 - New SOTA quantization: 4.25 bpw IQ4_KS。IQ4_K_R4则是R4 行交错row-interleaved4 行交错变体它不改变 bpw 与量化质量只改变数据在内存中的打包布局把原本按行连续存储的量化数据按 4 行交错排列使 CPU 的 SIMD 点积内核在解包与乘法时可以一次性复用解包结果从而显著提升 prompt processingPP与 token generationTG性能。原始设计文档即 pull_requests/138 - IQ4_K_R4。2. 核心原理为什么行交错能提速R4 提速的关键在于解包unpacking成本的重用。在 iqk_mul_mat 的 CPU 实现中k-quants / i-quants 的解包是计算密集操作。解包一次得到的量化值应当尽可能多地用于与右侧矩阵多列的乘法基础实现中解包后的结果最多复用于8 列以保证累加结果能留在向量寄存器中R4 布局把 4 行数据交错使得同一 SIMD 通道可以并行处理多行的解包结果解包成本被摊薄见 pull_requests/157 - R4 i-quants improvements该 PR 进一步将复用的列数扩展到 16对IQ2_XXS、IQ2_XS、IQ2_S、IQ3_XXS及IQ4_K_R4、IQ4_KS_R4、IQ5_K_R4均有额外增益。在硬件指令层面非线性映射的小查找表是关键前提IQX_K的查找表只有 4/8/16/32 个 INT8 条目分别对应 2/3/4/5 位恰好装进 12 个 SIMD 寄存器配合单指令查表即可完成反量化使 R4 交错布局的收益不被查表开销抵消。相比之下使用 2562048 条目码本的 i-quants 在 CPU 上查表开销巨大这也是IQX_K系列诞生的动机之一。3. 实测性能PP-512 与 TG-128来自 PR #138PR #138 在 LLaMA-3.1-8B 上给出了IQ4_K与IQ4_K_R4的对比单位为 t/s数值为该 PR 报告数据PP-512prompt processing512 token prompt平台线程数IQ4_KIQ4_K_R4加速比ARM_NEON (M2-Max)858.20 ± 1.03108.02 ± 1.101.856Zen4 (Ryzen-7950X)16182.20 ± 0.38232.63 ± 0.391.277AVX2 (Ryzen-5975WX)32206.43 ± 0.49227.60 ± 0.461.103TG-128token generation逐 token 生成 128 个 token平台线程数IQ4_KIQ4_K_R4加速比ARM_NEON28.44 ± 0.0210.56 ± 0.011.251ARM_NEON415.90 ± 0.0519.32 ± 0.141.215ARM_NEON824.54 ± 0.1525.16 ± 0.031.025Zen415.26 ± 0.006.73 ± 0.001.279Zen429.71 ± 0.0112.43 ± 0.001.269Zen4413.48 ± 0.0614.00 ± 0.031.039AVX224.02 ± 0.006.91 ± 0.001.719AVX248.03 ± 0.0011.13 ± 0.001.386AVX2811.81 ± 0.0012.75 ± 0.001.079可以归纳出三个规律PP 收益远大于 TG 收益prompt processing 是计算密集的 GEMM解包成本占比高行交错收益显著token generation 受内存带宽限制收益随线程数增加而衰减。ARM_NEON 收益最大PP 可达约 1.86x 加速作者在 PR 中明确说明 AVX2/Zen4 实现可能并非最优后续由 pull_requests/144 - Slightly faster IQ4_K_R4 on AVX2/Zen4 将 Zen4 PP-512 提升到约 251 t/sRyzen-7950X/ 249 t/sRyzen-5975WX。低线程数下 TG 收益更明显例如 AVX2 单线程场景 TG 加速可达 1.7x 左右而 8 线程时趋于 1.0x。同样的思路也被推广到IQ4_KS_R4见 pull_requests/150 - IQ4_KS_R4PP-512 在 ARM_NEON 上为 67.29 → 124.91 t/s1.856xZen4 上为 180.42 → 266.05 t/s1.475xAVX2 上为 201.79 → 245.37 t/s1.216x。4. 如何把模型重打包为 IQ4_K_R4R4 量化是布局重打包而非重新量化你不需要原始 fp16 模型直接用现有IQ4_K或IQ4_KSGGUF 即可转换。工具为examples/quantize/quantize.cpp编译出的llama-quantizellama-quantize --repack model-IQ4_K.gguf model-IQ4_K_R4.gguf IQ4_K_R4其中--repack表示把所有可重打包的 tensor 转换到对应的_r4/_r8变体。在 examples/quantize/quantize.cpp 中R4 目标类型被定义为repacked别名{ IQ4_KS_R4, LLAMA_FTYPE_MOSTLY_IQ4_KS_R4, IQ4_KS repacked, }, { IQ4_K_R4, LLAMA_FTYPE_MOSTLY_IQ4_K_R4, IQ4_K repacked, },对应的 GGUF 文件类型枚举定义在 include/llama.hLLAMA_FTYPE_MOSTLY_IQ4_K_R4 340, // except 1d tensors LLAMA_FTYPE_MOSTLY_IQ4_KS_R4 345, // except 1d tensors其他已支持的 R4 目标还包括IQ2_K_R4、IQ3_K_R4、IQ5_K_R4、Q2_K_R4、Q3_K_R4、Q4_K_R4、Q5_K_R4、Q6_K_R4、Q8_K_R8、Q8_KV_R8等同一文件内 30104 行的完整列表说明该机制已覆盖从 2 位到 8 位的整个量化谱系。5. 使用边界GPU 与 CPU 的取舍R4 布局最初是纯 CPU 优化早期 CUDA 上没有对应 GEMM/GEMV 实现因此量化烘焙者quant cooker必须发布非 R4 的IQX_K模型以保证 GPU 用户可用而 CPU 用户需要自行--repack以获得更高推理速度。这一不便在后续 PR 中得到缓解pull_requests/461 - CUDA implementation for IQ2_K_R4, IQ3_K_R4, IQ4_K_R4, IQ5_K_R4 为 4 个IQX_K_R4添加了 CUDA 支持初始阶段 GEMM 通过反量化 cuBLAS实现pull_requests/462 - CUDA GEMM and GEMV for IQ4_KS_R4 and IQ5_KS_R4 进一步覆盖IQ4_KS_R4/IQ5_KS_R4后续 pull_requests/417 等实现了原生量化 GEMMMMQCUDA 模板实例见 mmq-instance-iq4_k_r4.cu、mmvq-instance-iq4_k_r4.cu 等文件。一个重要的注意事项在 CUDA 上以反量化 cuBLAS路径运行 DeepSeek-V3/R1 的IQX_K_R4模型时fp16 中间算术可能导致数值不稳定与乱码输出需要以-DGGML_CUDA_IQK_FORCE_BF161强制使用 bf16 算术重新编译该选项默认关闭因为 bf16 会略微降低 PP 性能且仅 DeepSeek 类大模型需要。6. 小结IQ4_K_R4是 ik_llama.cpp 中在不动 bpw 的前提下提升 CPU 推理性能的代表性设计通过 4 行交错的数据打包配合IQX_K的非线性小查找表让解包结果得到更充分的复用从而在 ARM_NEON 上获得接近 1.9x 的 prompt processing 加速。它既可以直接量化得到也可以随时用llama-quantize --repack从现有模型转换回来GPU 用户请确认目标格式在 CUDA 上有对应实现。对于想要继续深入了解的读者建议从 iqk_mul_mat.cpp 与 iqk_quantize.cpp 的 CPU 实现出发配合 examples/quantize/quantize.cpp 的类型表即可完整梳理整个 R4 家族的实现脉络。【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表