新闻详情

新闻详情

首页 / 资讯中心 / 详情

ik_llama.cpp IQ4_XS_R4 量化格式深度解析:四行交织重排如何让 Prompt 处理提速最高 1.7 倍

发布时间:2026/9/20 0:32:18来源:尧图网络
ik_llama.cpp IQ4_XS_R4 量化格式深度解析:四行交织重排如何让 Prompt 处理提速最高 1.7 倍
人工智能大模型推理引擎本地部署模型量化模型优化【免费下载链接】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 月通过 PR #123 引入了IQ4_XS_R4——一种将 i-quants 家族中的IQ4_XS以4 行交织重排interleaved rows方式重新打包的量化变体专门用于加速 CPU 上的矩阵乘法iqk_mul_mat与 prompt 处理prefill。本文以该 PR 为骨架结合当前仓库中的量化实现源码梳理 R4 重排的由来、IQ4_XS_R4的实测收益、不同指令集ARM_NEON / Zen4 / AVX2的实现差异以及它最终演进为IQ4_XS_R8的完整技术脉络。一、R4 交织重排系列的由来PR #118–#122IQ4_XS_R4并非孤立产物它是 ik_llama.cpp 中一系列行交织重排量化工作的直接延续。PR #123 的描述明确写道Follow up of #118, #119, #120, #121, #122 forIQ4_XS这一系列的前置工作包括PR #118IQ4_NL_X4受主线 llama.cpp 中Q4_0/IQ4_NL通过交织 4 或 8 个连续行来重排量化数据、在 ARM 上获得显著 prompt 处理加速的启发作者尝试将交织行策略引入本仓库自研的iqk_mul_mat矩阵乘实现得到IQ4_NL_X4IQ4_NL的 4 行交织变体。实测在 Zen4 上IQ4_NL_X4成为当时 prompt 处理最快的量化类型甚至超过了原生支持 bf16 的 Ryzen-7950X 上的 bf16237 t/s。PR #119Q4_0_R4将Q4_0按照与IQ4_NL_X4相同的方式做 4 行交织在 Zen4 上成为当时的 prompt 处理冠军278.15 t/s。作者同时指出主线 llama.cpp 的Q4_0_4_4在 M2-Max 上略胜一筹原因是其预先应用了0x88异或掩码把无符号 4-bit quants 转为左移 4 位的带符号 quants但该技巧仅对 ARM 指令集有效、对 x86_64 完全无用因此未采用。PR #120 / #121 / #122Q8_0_R4 / Q5_0_R4 / Q6_0_R4把同样的 4 行交织思路推广到Q8_0、Q5_0、Q6_0等常规量化类型。在这些工作中交织的对象都是单层结构的 legacy 量化块。而IQ4_XS属于 i-quantsi 系列量化其数据组织远为复杂包含super-block超级块与 block块两级结构以及两层 scale缩放因子。能否让交织行策略在这样复杂的层级结构上成立正是 PR #123 要回答的核心问题。二、IQ4_XS_R4 的核心设计动机PR #123 的出发点非常直接I was curious to see if one can make the interleaved rows strategy work for i- and k-quants with their super-blocks blocks and two levels of scales.IQ4_XSseemed easiest, so I tackled that one first.即在 i/k-quants 复杂的两级块结构、两层 scale 之上验证交织行策略的可行性。作者选择IQ4_XS作为第一个突破口因为它在该家族中结构相对最简单。结论是可行且收益显著在ARM_NEON上获得massive巨大的加速在AVX2 / Zen4上获得更温和但依然可观的收益。从当前仓库源码看IQ4_XS的数据布局确实具备这种两层结构。ggml.c 中注册了GGML_TYPE_IQ4_XS类型块大小blck_size QK_Kvec_dot_type GGML_TYPE_Q8_K即它需要与 Q8_K 激活共同参与点积而IQ4_XS_R8R4 的 8 行演进形态则对应[GGML_TYPE_IQ4_XS_R8] { ... }ggml.c。换言之i-quants 的 R 系列变体并非新增一套独立算法而是对同一数据的内存布局重排以换取向量化访存的连续性。三、实测性能PP-512 基准数据全表PR #123 给出了IQ4_XS与IQ4_XS_R4在三个 CPU 平台上的PP-512512 token prompt 处理对比测试模型为 LLaMA-3.1-8B。以下为原 PR 完整数据平台线程数IQ4_XS (t/s)IQ4_XS_R4 (t/s)加速比ARM_NEONM2-Max868.23 ± 1.06115.43 ± 0.571.692Zen4Ryzen-7950X16183.43 ± 0.60223.98 ± 0.121.221AVX2Ryzen-5975WX32195.20 ± 0.40248.25 ± 0.431.272三个要点值得注意ARM_NEON 收益最大接近 1.7 倍这与主线 llama.cpp 中交织行方案ARM 获益最显著的观察一致印证了 NEON 向量化对该类内存布局的敏感性。x86 上 Zen4 与 AVX2 的加速比1.22 / 1.27小于 ARM但仍明显高于噪声属于稳定的结构性收益。表格中的标准差均很小如 223.98 ± 0.12说明测试重复性好、结论可信。四、平台实现差异为什么 Zen4 是次优解PR #123 作者明确表示对 Zen4 实现not 100% happy并给出了原因shuffling scale bits for 4 rows at once is tricky, so for now I have settled on a sub-optimal solution.翻译过来即要在一次操作中为 4 行同时洗牌shufflescale 位是相当棘手的。i-quants 的两层 scalesuper-block 级与 block 级与主量化数据交错存放交织 4 行后scale 位在内存中的排布被打散AVX-512 等宽向量指令需要额外的 shuffle 才能将其重新组织到位。这是IQ4_XS_R4在 Zen4 上加速比1.221低于 ARM1.692的直接原因——瓶颈不在数据吞吐而在 scale 位整理指令的开销。这一限制也解释了后续的演进方向PR #128Faster IQ4_XS_R4 on Zen4专门针对该平台优化将 Ryzen-7950X 上的 PP-512 从 224 t/s 提升到 254 t/sPR #143Slightly faster IQ4_XS_R4 on AVX2、PR #131Slightly faster Q4_K_R4 and IQ4_XS_R4 on Zen4、PR #135Better ARM_NEON implementation for R4 quants、PR #139Faster R4 quants on Zen4等后续 PR 持续打磨各指令集的 R4 实现说明交织行方案从一开始就是平台定制、逐平台调优的路线。五、源码级佐证R4 重排机制如何落地IQ4_XS_R4在当前仓库中虽已被 8 行版本取代但其机制完整保留在 R 系列类型的实现中。可以从三个层面印证 PR 描述的架构1. 类型注册与量化入口ggml.c 中LLAMA_FTYPE_MOSTLY_IQ4_XS_R8与LLAMA_FTYPE_MOSTLY_IQ4_XS分别映射到GGML_TYPE_IQ4_XS_R8与GGML_TYPE_IQ4_XS。而IQ4_XS_R8的量化路径在 ggml.c 中清晰可见quantize_iq4_xs_r8与quantize_iq4_xs是两个独立的量化函数。2. 重排即先量化、后打包R 系列并非直接重新发明量化器而是复用原类型量化、再做布局变换。这一点在 iqk_quantize.cpp 的quantize_iq4_xs_r8中体现得最直接它先调用quantize_iq4_xs得到标准IQ4_XS块再通过模板函数quantize_repack32, block_iq4_xs, block_iq4_xs_r8, 8与repack_iq4_xsiqk_quantize.cpp完成 8 行交织重排。PR #123 中IQ4_XS_R4的思路与此完全同构只是交织行数为 4——即先按原格式量化再把相邻 N 行的块交错存放供矩阵乘核心一次读取多行的连续数据。3. 矩阵乘侧的配套映射在 iqk_mul_mat.cpp 中可以看到所有 R4/R8 类型在参与矩阵乘时都有明确的计算类型映射例如IQ4_XS在nrc_y 32时切换到Q8_K类型计算iqk_mul_mat.cppIQ4_XS_R8同样映射到GGML_TYPE_Q8_K_R8同时该文件以return 4;标记各 R4 类型的交织行数iqk_mul_mat.cpp。这说明 R 系列是一个贯通量化 → 打包 → 矩阵乘核心的完整体系而非仅停留在存储层面。4. 量化工具的 R4 重排表llama-quantize.cpp 中维护了完整的 R4 重排对照表形如{ GGML_TYPE_IQ4_XS_R4, { GGML_TYPE_IQ4_XS, 4 } }明确记录了哪种 R4 类型由哪种原类型、交织几行产生。当前表中交织行数统一为 4配合 8 行版本的IQ4_XS_R8可以看到这一家族从 4 行向 8 行演进的痕迹。六、历史演进从 IQ4_XS_R4 到 IQ4_XS_R8PR #123 以❌ Closed状态合并后IQ4_XS_R4的生命周期并未止步。关键转折发生在PR #178Interleave 8 rows (Q8_0, IQ4_XS)2025-01作者发现AVX2/Zen4 上交织 8 行比 4 行更优此前不做是因为 ARM 性能会显著受损但该 PR 找到了对Q8_0与IQ4_XS都不慢甚至略快的 8 行 ARM_NEON 实现。作者预告模型如果量化为IQ4_XS_R4会在合并后失效并明确表示尚未重命名类型若合并将改为_R8。讨论区中用户 saood06 也确认了自己的 R1 大模型实为IQ4_K_R4不受影响同意合并。PR #178 的实测显示Ryzen-7950X 上IQ4_XS8 行交织对1000 token 以内的 prompt 处理速度超过 300 t/s在双路 Xeon E5-2683 v4 上IQ4_XS_R8的批处理吞吐也全面优于IQ4_XS_R4PP 6.76 vs 6.61 t/sTG 6.57 vs 6.39 t/s。这正是当前仓库中只保留GGML_TYPE_IQ4_XS_R8而不再有IQ4_XS_R4的原因R4 方案作为可行性验证与奠基之作被性能更好的 R8 方案取代。从历史视角看PR #123 的价值在于首次证明了带 super-block 与两层 scale 的 i-quants 也可以做行交织重排为后续 R8 铺平了道路。七、如何在当前仓库中使用 R 系列类型尽管IQ4_XS_R4已成历史但理解它的使用方式有助于掌握当前 R 系列类型的操作流程。在 ik_llama.cpp 中R 系列类型有两种进入路径直接量化使用llama-quantize工具将模型直接量化为 R 类型如IQ4_XS_R8、Q4_0_R4、IQ4_K_R4等得到存储即交织的 GGUF 模型运行时零重排开销。GGML_FTYPE_MOSTLY_IQ4_XS_R8等枚举在 ggml.c 中完成 ftype 与类型的一一映射。运行时重排online repacking对非 R 类型的模型iqk_mul_mat会在内存中即时完成交织重排。PR #178 明确说明Runtime-repacking fromQ8_0/IQ4_XSwill of course workPR #178 描述quantize_iq4_xs_r8的online参数iqk_quantize.cpp正是这一机制的代码痕迹。性能验证推荐使用llama-bench仓库讨论区与 PR 中的测试数据如 PP-512 对比表均以此工具产出其输出格式pp512/tg128等与 PR #123 的基准方法一致方便复现和横向对比。结语IQ4_XS_R4是 ik_llama.cpp R 系列量化演进史上承前启后的关键一步它在 i-quants 复杂的两级块结构与两层 scale 之上验证了交织行策略的可行性在 ARM_NEON 上带来近 1.7 倍的 prompt 处理加速在 Zen4/AVX2 上留下scale 位洗牌这一平台调优课题并最终催生了性能更优的 8 行版本IQ4_XS_R8。从 PR #118 的IQ4_NL_X4到 PR #123 的IQ4_XS_R4再到 PR #178 的 8 行交织这条技术路线完整展现了量化格式优化中内存布局即性能的核心思想——而这一切都可以在仓库的 iqk_mul_mat.cpp、iqk_quantize.cpp 与 llama-quantize.cpp 中逐一找到实现依据。赞分享人工智能大模型推理引擎本地部署模型量化模型优化【免费下载链接】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 119 深度解析Q4_0_R4 四行交错重打包如何将 Prompt 处理提速 1.5 倍ik_llama.cpp PR 119 深度解析Q4_0_R4 四行交错重打包如何将 Prompt 处理提速 1.5 倍 导读 本文围绕 ik_llama.c人工智能大模型推理引擎本地部署模型量化模型优化ik_llama.cpp 的 Q5_0_R44 行交错重打包量化如何让 prompt 处理提速 1.6 倍ik_llama.cpp 的 Q5_0_R44 行交错重打包量化如何让 prompt 处理提速 1.6 倍 Q5_0_R4 是 ik_llama.cpp 引入人工智能大模型推理引擎本地部署模型量化模型优化ik_llama.cpp 的 IQ3_S 行交织优化CPU Prompt Processing 提速 10 倍的原理与复现ik_llama.cpp 的 IQ3_S 行交织优化CPU Prompt Processing 提速 10 倍的原理与复现 导读 本文围绕 ik_llama.人工智能大模型推理引擎本地部署模型量化模型优化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

LSTM-BP-SVR级联模型:MATLAB多变量时间序列预测实战 2026/9/20 1:23:26

LSTM-BP-SVR级联模型:MATLAB多变量时间序列预测实战

简介:面向多变量时间序列预测需求,MATLAB R2025b环境下的LSTM-BP-SVR级联融合项目实例以分阶段建模为核心,依次利用LSTM提取时序依赖、BP网络重构高维特征、SVR完成稳健回归,并配备数据构造、预处理、模型训练、参数优化、测试评估…

阅读更多 →
Camtasia Studio完全指南:从录屏到专业剪辑的输出流程 2026/9/20 1:23:26

Camtasia Studio完全指南:从录屏到专业剪辑的输出流程

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Windows端口占用排查实战:三步定位、一键终止 2026/9/20 1:23:26

Windows端口占用排查实战:三步定位、一键终止

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
计量经济学案例分析:从OLS到异方差与预测区间 2026/9/20 1:23:26

计量经济学案例分析:从OLS到异方差与预测区间

简介:这是一份面向计量经济学初学者与经管类学生的案例分析汇总文档。文档以居民消费支出与可支配收入关系为典型场景,完整演示从研究目的、模型设定、数据搜集、OLS估计到模型检验的全流程,重点讲解2002年截面数据下如何建立一元线性回归模型…

阅读更多 →
Android开机动画替换实战:ADB remount原理与避坑指南 2026/9/20 1:23:26

Android开机动画替换实战:ADB remount原理与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Linux命令大全:从零基础到熟练操作的实用指南 2026/9/20 1:20:26

Linux命令大全:从零基础到熟练操作的实用指南

简介:面向Linux零基础新手的一份命令手册,覆盖从文件与目录导航、文本查看到权限控制、系统监控的完整学习路径,也适合刚接触服务器、需在无图形界面下完成日常任务的用户快速上手。资源包体为单个PDF文件,大小703KB,内…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞