拓冰建站拓冰建站
首页 / 资讯中心 / 正文

ik_llama.cpp 新增 IQ3_K_R4:基于 4 行交织重打包的 3-bit 量化及其 CPU/GPU 加速原理

ik_llama.cpp 新增 IQ3_K_R4基于 4 行交织重打包的 3-bit 量化及其 CPU/GPU 加速原理【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp导读本文围绕 ik_llama.cpp 仓库中的 PR #145「IQ3_K_R4」展开讲解该项目的标志性技术——以 4 行交织4 interleaved rows方式重打包 3-bit 量化格式 IQ3_K的动机、数据布局、量化/重打包实现以及它在 ARM_NEON、Zen4AVX-512与 AVX2 平台上的实测性能收益。读完本文你将理解IQ3_K_R4与标准IQ3_K在内存布局与计算路径上的本质区别掌握在 llama-quantize 中生成该格式的具体用法并了解 CPU 与 CUDA 两条推理加速路径的实现位置与适用前提。一、背景R4 系列重打包量化在 ik_llama.cpp 中的定位ik_llama.cpp 是 llama.cpp 的一个分支主打 additional SOTA quants and improved performance新增 SOTA 量化格式并改进性能。其性能提升的核心手段之一就是把按传统方式逐块存储的 i-quants 重新打包为**多行交织row-interleaved**的布局即_R4后缀系列如IQ2_K_R4、IQ3_K_R4、IQ4_K_R4、IQ5_K_R4、IQ4_KS_R4等。PR #145作者 ikawrakow创建于 2024-12-17正是这一系列中的一环为标准 3-bit 的IQ3_K引入IQ3_K_R4变体。PR 原文明确指出其效果AddingIQ3_Kwith 4 interleaved rows. We get very significant performance gains onARM_NEONand more modest gains onAVX2/Zen4.即4 行交织的布局在 ARM_NEON 上带来非常显著的加速在 AVX2/Zen4 上收益相对温和同时 PR 也坦诚说明整体上_R4系列里 3-bit 量化总是相对偏慢——这是 3-bit 数据位宽天然的计算特性并非实现缺陷。二、IQ3_K_R4 的本质把 4 个 block 打包成 1 个超块2.1 标准 IQ3_K 的块结构在 ggml/src/ggml-common.h 中标准block_iq3_k定义如下typedef struct { ggml_half d; uint16_t extra; uint16_t scales_h; uint8_t scales_l[QK_K/32]; uint8_t qs[QK_K/4]; uint8_t qh[QK_K/8]; } block_iq3_k;即一个 256 权重QK_K的块包含1 个 fp16 主缩放d、2 字节extra记录块内子块的符号/特殊位信息、高/低两部分缩放scales_h/scales_l以及低位qs与高位qh两部分量化权重。单个块大小被static_assert严格锁定。2.2 R4 变体的超块布局IQ3_K_R4并非一种新的量化精度而是把连续 4 行4 个 row的 4 个block_iq3_k重新交织成 1 个block_iq3_k_r4超块typedef struct { ggml_half d[4]; // 4 行的主缩放 uint8_t extra[8]; // 4 行交织后的 extra 位 uint8_t scales_h[QK_K/32]; uint8_t scales_l[QK_K/8]; uint8_t qs[QK_K]; uint8_t qh[QK_K/2]; } block_iq3_k_r4; static_assert(sizeof(block_iq3_k_r4) 4*sizeof(block_iq3_k), wrong iq3_k_r4 block size/padding);见 ggml/src/ggml-common.h。static_assert保证超块大小恰好等于 4 个普通块之和——内存占用不变、精度不变只是数据摆放方式变了这正是 R4 系列免费提速的根基让 SIMD 寄存器一次加载即可同时处理 4 行的数据减少访存次数、提升计算密度。在 GGUF 层面该类型注册为GGML_TYPE_IQ3_K_R4 338ggml/include/ggml.h文件存储类型为GGML_FTYPE_MOSTLY_IQ3_K_R4 331除 1D 张量外全部使用该格式见 ggml/include/ggml.h。三、量化与重打包实现repack_iq3_k 源码剖析从标准IQ3_K得到IQ3_K_R4的过程在 ggml/src/iqk/iqk_quantize.cpp 的repack_iq3_k()中实现其核心步骤为校验GGML_ASSERT(nrows%4 0)、GGML_ASSERT(n_per_row%QK_K 0)保证行数与每行块数可被 4/256 整除按 4 行一组遍历每次取出 4 行的同一列块x4[0..3]写入一个block_iq3_k_r4逐块交织4 个d直接拷贝每行的extra2 位标志被分散写入y[ibl].extra的 8 字节16 个 4-bit 缩放scales_l与 2 位scales_h分别按i 8*ib k的偏移重新交织到超块的scales_l[QK_K/8]与scales_h[QK_K/32]权重位平面重排借助convert_iq3_k()先把每个块展开为 256 个 4-bit 中间值L[QK_K]再把每 4 个行的低 2 位qs每字节 4 个权重 × 2 bit与高 2 位qh按位平面重排使得 4 行的数据在qs/qh数组中按固定步长排布方便向量化读取。量化入口位于 ggml/src/ggml.cquantize_iq3_k_r4()负责在量化含在线重打包路径上把 FP16/BF16 权重直接产出 R4 布局iqk_quantize.cpp中GGML_TYPE_IQ3_K的 Repack 表项{ GGML_TYPE_IQ3_K_R4, 4, repack_iq3_k }iqk_quantize.cpp则负责把已量化的IQ3_K模型无损转换为IQ3_K_R4——这也是 PR 标题Adding IQ3_K with 4 interleaved rows的完整含义既支持直接量化产出也支持对既有 IQ3_K 权重做纯重打包迁移。四、推理加速路径CPU 与 CUDA 两个层次4.1 CPU 路径iqk mul_mat / gemm 内核在 CPU 推理侧IQ3_K_R4与其它 R4 quants 一起被路由到专用的 iqk 内核ggml/src/iqk/iqk_mul_mat.cppGGML_TYPE_IQ3_K_R4与IQ2_K_R4/IQ4_K_R4/IQ5_K_R4等一同走iqk_set_kernels_iqk_quants()选用针对 i-qk 量化族优化的 matmul 内核而非 kt-quants 或传统 Q4/Q5 内核ggml/src/iqk/iqk_gemm_iqk_quants.cpp核心计算函数mul_mat_iq3_k_r4_q8_k()以const block_iq3_k_r4 *直接读取超块与Q8_K激活值做乘加同时提供16模板特化func16iqk_gemm_iqk_quants.cpp用于适配不同n的向量化路径。这种4 行共用一次数据装载的设计正是 PR 中 ARM_NEON 大幅提速的原因——NEON 的 128-bit 载荷配合交织布局可同时为 4 个输出行服务x86 侧因寄存器与指令特性不同收益相对温和。4.2 CUDA 路径本仓库后续为 R4 系列补齐了 GPU 支持IQ3_K_R4在 CUDA 侧拥有独立的 mmq 实例ggml/src/ggml-cuda/template-instances/mmq-instance-iq3_k_r4.cu与 mmvq 实例ggml/src/ggml-cuda/template-instances/mmvq-instance-iq3_k_r4.cu并出现在 mmq/mmvq/convert 等 CUDA 源文件的类型分派表中。需要说明的是这是 PR #145 之后由后续提交如 CUDA implementation for IQ2_K_R4, IQ3_K_R4, IQ4_K_R4, IQ5_K_R4逐步合入的能力PR #145 本身聚焦于 CPU 侧的量化格式与内核。五、实测性能PP-512 与 TG-128 完整数据PR 附带了 LLaMA-3.1-8B 上的两组实测数据分别覆盖提示词处理prompt processing与 token 生成token generation并给出了逐平台的 Speedup。以下为原 PR 数据完整转述数值格式为均值 ± 标准差5.1 提示词处理 PP-512tokens/s越高越好PlatformThreadsIQ3_KIQ3_K_R4SpeedupARM_NEON (M2-Max)854.94 ± 0.7993.83 ± 0.091.708Zen4 (Ryzen-7950X)16180.13 ± 0.48230.33 ± 0.131.279AVX2 (Ryzen-5975WX)32197.59 ± 0.43253.36 ± 0.501.2825.2 Token 生成 TG-128tokens/s越高越好PlatformThreadsIQ3_KIQ3_K_R4SpeedupARM_NEON25.84 ± 0.006.71 ± 0.051.149ARM_NEON411.14 ± 0.0012.83 ± 0.011.152ARM_NEON820.59 ± 0.1723.07 ± 0.161.120Zen415.06 ± 0.005.64 ± 0.001.115Zen429.58 ± 0.0110.50 ± 0.011.096Zen4416.56 ± 0.0516.77 ± 0.321.013AVX224.45 ± 0.006.83 ± 0.001.535AVX248.24 ± 0.0012.51 ± 0.001.518AVX2814.59 ± 0.0416.23 ± 0.001.112结论要点严格基于上述数据PP 加速最亮眼ARM_NEON 达到 1.708×x86 平台约 1.28×TG 加速在低线程数下更明显AVX2 在 2/4 线程时达 1.5× 以上但线程数升高后收益收窄Zen4 在 4 线程时仅 1.013×说明 R4 布局主要缓解的是内存带宽/装载瓶颈而不是计算单元瓶颈3-bit 天生较慢PR 明言 Overall slower than other_R4quants, which is expected as 3-bit quantization is always kind of slow即与 2-bit/4-bit 的 R4 变体相比IQ3_K_R4 的绝对吞吐仍然偏低这是 3-bit 量化本身的计算特性。以上均为 PR 发布时在特定硬件/特定线程数下的单次测量不同机器、不同模型、不同上下文长度下的绝对数值会有差异请以实际基准llama-bench为准。六、使用方式用 llama-quantize 生成 IQ3_K_R46.1 命令行用法IQ3_K_R4已作为内置目标注册进量化工具见 examples/quantize/quantize.cpp{ IQ3_K_R4, LLAMA_FTYPE_MOSTLY_IQ3_K_R4, IQ3_K repacked },因此可直接通过llama-quantize生成# 从 FP16 模型直接量化为 IQ3_K_R4 llama-quantize --imatrix imatrix.dat model-f16.gguf model-iq3-k-r4.gguf IQ3_K_R4 # 从已有的 IQ3_K 模型重打包无损转换不改变数值 llama-quantize model-iq3-k.gguf model-iq3-k-r4.gguf IQ3_K_R4两种入口都成立前者在量化阶段直接产出 R4 布局后者走repack_iq3_k的在线重打包路径Repack表项中repack_func即 iqk_quantize.cpp 的repack_iq3_k转换以 4 行为一组进行因此行数需能被 4 整除。推荐配合 importance matrix--imatrix使用以获得更低的困惑度损失。6.2 运行时注意事项该格式对应的加载/推理分派已集成于 ggml/src/ggml.c如GGML_TYPE_IQ3_K_R4在量化、类型转换、拷贝路径上的各 case与 src/llama-quantize.cpp、src/llama-model-loader.cpp 等模型加载链路GGUF 侧支持类型注册见 gguf-py/gguf/constants.py使用最新版工具链即可读写若需验证模型内IQ3_K_R4张量的块布局正确性仓库提供check_tensor_for_blocks_256_fp16_repackedblock_iq3_k_r4, 4校验iqk_quantize.cpp可在构建测试时启用相关断言。七、限制与适用前提小结平台收益不均衡交织布局的加速高度依赖 SIMD 能力与访存带宽ARM_NEON 收益最大x86 平台Zen4/AVX2次之TG 场景下线程越多收益越弱3-bit 的绝对性能天花板IQ3_K_R4虽然相对IQ3_K有显著提升但绝对吞吐仍低于同系列的 2-bit/4-bit R4 变体转换约束重打包要求权重行数为 4 的倍数这是block_iq3_k_r4超块结构决定的硬性前提度量口径文中所有数值均来自 PR #145 的原始报告属于特定硬件与模型的实测快照不构成通用性能承诺实际部署请以本机llama-bench结果为准。八、延伸阅读R4 系列的后续演进与其它量化改进github-data/pull_requests/157「R4 i-quants improvements」、github-data/pull_requests/185「IQ1_S_R4 better 1.5 bpw quants」CUDA 侧实现github-data/pull_requests/461「CUDA implementation for IQ2_K_R4, IQ3_K_R4, IQ4_K_R4, IQ5_K_R4」、github-data/pull_requests/557「CUDA: MMQ for iqX_r4 quants」量化使用手册docs/quantize.md 相关说明见 examples/quantize/README.md、models/templates 的模型模板目录。通过 PR #145 可以看出 ik_llama.cpp 的量化优化思路不改变比特率与精度语义仅通过重排数据布局换取 SIMD 效率。IQ3_K_R4正是这一思路在 3-bit 位宽上的落地为 ARM 平台上的 3-bit 部署提供了一个立即可用的加速选项。【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门