ik_llama.cpp 量化优化(二):type-1 量化与 IQ3_K 的梯度搜索改进深度解析

发布时间:2026/9/20 17:26:26

ik_llama.cpp 量化优化(二):type-1 量化与 IQ3_K 的梯度搜索改进深度解析 人工智能大模型推理引擎本地部署模型量化模型优化【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp点击查看免费下载本文基于仓库 github-data/pull_requests/302 - Quantization improvements2.md 展开。该 PR 是 #295 Quantization improvements 的续作把基于梯度的一阶搜索量化算法从 type-0 量化扩展到 type-1 量化Q2_K、Q4_K、Q5_K、Q4_1、Q5_1以及IQ3_K使IQ3_K的量化速度最高提升约 40%、type-1 量化速度提升约 15%并修复了IQ3_K在 DeepSeek-V2-Lite 上的近乎灾难性质量退化。读完本文你将理解这一系列量化改进的数学原理、源码落地方式、实测数据以及如何用llama-quantize复现验证。一、从 #295 到 #302一条持续一年的量化优化主线1.1 为什么需要改进量化算法块级block-wise量化在数学上是一个混合整数优化问题每个块独立量化时通常只涉及 16~32 个变量理论上可以精确求解。但在 k-quantsQ3_K等开发过程中积累的经验表明精确解常常会导致灾难性的量化质量退化例如困惑度大幅升高或 HellaSwag 分数下降。因此k-quants 与后来的 i-quants 一直使用启发式搜索只在围绕 round-to-nearestRTN值精心调校的 scale 范围内寻找解。ik_llama.cpp 的作者ikawrakow在加入 imatrix重要性矩阵后曾希望可以抛弃启发式、直接使用精确解。但即便有了 imatrixQ4_0、Q5_0在 main 分支上仍可能出现灾难性失败详见 #295 中的背景说明。同时很多量化任务并不带 imatrix算法还必须对无 imatrix 的场景保持鲁棒于是启发式一直保留了下来。1.2 #295 引入的核心思想显式的梯度搜索#295 为Q4_0、Q5_0、Q6_0、Q3_K、Q6_K提供了改进版make_qx_quants为IQ4_NL、IQ4_XS提供了改进版quantize_row_iq4_nl_impl。其数学基础如下要最小化原始权重 $x_i$ 与整数量化值 $q_i$ 之间的加权均方误差WMSE等价于最大化目标函数$$F \frac{\left(\sum w_i x_i q_i\right)^2}{\sum w_i q_i^2}$$其中 $w_i$ 是权重由 imatrix 给出或没有 imatrix 时用其他方式定义求和范围是一个量化块。这是 type-0 量化量化权重 $\tilde{x}_i d q_i$$d$ 为浮点块 scale使 WMSE 最小的最优 scale 为$$d \frac{\sum w_i x_i q_i}{\sum w_i q_i^2}$$整数量化值 $q_j$ 的梯度为$$g_j \frac{\partial F}{\partial q_j} 2 d w_j (x_j - d q_j)$$沿着梯度方向最大化 $F$走一步$|g_j|$ 最大的那个量化值会最先变化到下一个整数$q_j \Delta_j$$\Delta_j 1$ 当 $g_j 0$否则 $-1$。此时无需重新遍历整个块只需给分子加上 $w_j x_j \Delta_j$、给分母加上 $w_j (2 q_j \Delta_j 1)$ 即可得到新的 $F$ 值。若新 $F$ 大于历史最高值就接受这次变化、更新 $q_j$、重新计算最优 scale 并继续迭代否则跳出循环。这正是一阶梯度上升的做法。与之对比mainline llama.cpp 的 PR 12557compilade采用近乎穷举搜索——它把所有沿梯度方向、且在允许范围内变化到下一个整数的步长排序后逐一尝试并挑选最优因此速度慢得多。而一阶梯度近似在获得几乎相同量化精度以 PPL 衡量的同时速度快一个数量级。对于非线性量化IQ4_XS、IQ4_NL扩展是直接的把上面的 $q_i$ 换成 $T(q_i)$其中 $T$ 是非线性映射查找表即 $\tilde{x}_i d T(q_i)$。二、#302 的核心改动覆盖 type-1 量化与 IQ3_K#302 Quantization improvements (2) 将 #295 的同一套方法推广到两组新的量化类型type-1 量化Q2_K、Q4_K、Q5_K、Q4_1、Q5_1非线性量化IQ3_K。带来的效果可归纳为三点IQ3_K的量化速度显著提升最高约 40%见后文实测表中 DSL 从 116.4s 降至 92.5s、Mistral-7B 从 54.6s 降至 39.5s 等type-1 量化速度小幅提升约 ≤15%质量层面并非全面改善并非所有测试模型 PPL 都下降但对更难量化的模型如 LLaMA-3 系列确实改善了 PPL并且避免了IQ3_K在 DeepSeek-V2-Lite 上的近乎灾难性失败PPL 从 7.3143 大幅降至 7.0409。对话中 saood06 也指出在 #295 之前DSL 上的IQ3_K甚至比Q3_K还差可见这一修复的价值。三、实测数据PPL 与量化耗时完整对比PR 在 Ryzen-7950X CPU 上以 512 token 上下文、--pure模式token embedding 与 output tensor 设为Q8_0量化 5 个模型LLaMA-v1-7BL1-7B、LLaMA-v2-7BL2-7B、Mistral-7BM-7B、LLaMA-3.1-8B-InstructL3-8B、DeepSeek-V2-LiteDSL。命令行为./bin/llama-quantize --imatrix $imatrix --token-embedding-type q8_0 --output-tensor-type q8_0 --pure $model $output $quant完整结果如下PPL 越低越好Q-time 单位为秒Q4_1 / Q5_1ModelQuantizationPPL (main)PPL (this PR)Q-time (main)Q-time (this PR)L1-7BQ4_15.97735.9760N/A¹N/A¹L2-7BQ4_15.86765.869133.629.9M-7BQ4_15.74525.747136.732.3L3-8BQ4_17.53097.527738.134.0DSLQ4_16.86396.858484.175.3L1-7BQ5_15.91835.9182N/A¹N/A¹L2-7BQ5_15.81645.817535.630.8M-7BQ5_15.70675.707437.633.6L3-8BQ5_17.37497.375938.734.7DSLQ5_16.78816.787586.476.5Q2_K / Q4_K / Q5_KModelQuantizationPPL (main)PPL (this PR)Q-time (main)Q-time (this PR)L1-7BQ2_K7.31547.2989N/A¹,²N/A¹L2-7BQ2_K7.30447.255836.432.2M-7BQ2_K6.95076.927338.435.0L3-8BQ2_K11.54611.45840.136.5DSLQ2_K8.38228.334689.683.4L1-7BQ4_K5.98015.9779N/A¹N/A¹L2-7BQ4_K5.86755.867334.130.7M-7BQ4_K5.74495.740637.032.8L3-8BQ4_K7.51927.515738.234.5DSLQ4_K6.86076.857075.768.5L1-7BQ5_K5.93145.9299N/A¹N/A¹L2-7BQ5_K5.81445.819635.631.2M-7BQ5_K5.70305.706437.334.1L3-8BQ5_K7.39417.381238.934.6DSLQ5_K6.79296.790376.569.5IQ3_KModelQuantizationPPL (main)PPL (this PR)Q-time (main)Q-time (this PR)L1-7BIQ3_K6.13936.1377N/A¹N/A¹L2-7BIQ3_K6.02516.022744.736.9M-7BIQ3_K5.88355.885554.639.5L3-8BIQ3_K7.91487.918956.341.4DSLIQ3_K7.31437.0409116.492.5注¹L1-7B 存放在旧机械硬盘上量化时间主要由读取数据的时间决定--pure模式也需先将整个模型读入故不比较耗时。注²为Q2_Kmain 分支 L1-7B 条目缺失的量化时间。关于为何使用远古模型LLaMA-v1 是 k-quants 开发的基准模型i-quants 则基于 LLaMA-v1、LLaMA-v2 与 Mistral-7B 开发。作者的实践经验是一种量化技术若在这三个模型上都表现良好几乎可以保证在其他任何模型上也表现良好。从表中可以看出一个清晰规律IQ3_K的提速幅度约 16%40%远大于 type-1 量化约 8%14%且 DSL 上IQ3_K的 PPL 改善高达 0.27 以上——这正是避免了近乎灾难性失败的具体体现。而 type-1 量化如Q4_1、Q5_K在部分模型L2-7B、M-7B上 PPL 有微小回升约 0.0010.003印证了 PR 描述中并非所有模型 PPL 都改善的诚实结论。四、源码解读梯度上升算法如何落地4.1 改进版make_qx_quants候选 scale 扫描#295/#302 系列的核心之一是改进版make_qx_quants其实现位于 ggml/src/iqk/iqk_quantize.cpp。从源码结构看它的策略是以块内最大绝对值amax对应的max作为初始 scale 基准iscale -nmax / max对所有元素做nearest_int舍入到[-nmax, nmax-1]计算sumlx Σ qw[i]·x[i]·l与suml2 Σ qw[i]·l²最优 scale 取scale sumlx/suml2在 RTN 值附近扫描 18 个额外候选 scaleis从 -9 到 9 且跳过 0即iscale -(nmax 0.1·is)/max凡sumlx² best·suml2就更新最优解。这正是在精心调校的 scale 范围内搜索的启发式与 WMSE 最优化的结合不穷举所有整数组合而是以候选 scale 驱动舍入结果用目标函数挑选最优。在 ggml/src/ggml-quants.c 中可以看到它的调用场景例如quantize_row_q5_0_implL3538调用make_qx_quants(QK5_0, 16, xb, L, 1, weight)。4.2 type-1 量化make_qkx3_quants接管Q4_1/Q5_1type-1 量化的落地在 ggml/src/ggml-quants.c 的带权重实现中quantize_row_q4_1_implL3470在提供quant_weights时逐块调用make_qkx3_quants(QK4_1, 15, xb, weight, L, min, Laux, -0.9f, 0.05f, 36, false)同时求解 scale 与 minquantize_row_q5_1_implL3574同样以make_qkx3_quants(QK5_1, 31, ...)实现。这两个实现还有一个共性权重构造为w_j qw[j] · sqrt(sigma2 x[j]²)其中sigma2为整行平方均值Q4_1或 1.5 倍块内平方均值IQ3_K即方差感知的加权让绝对值更大的权重在 WMSE 中占更高比重。Q2_K、Q4_K、Q5_K的 k-quant 子块量化在 ggml/src/iqk/iqk_quantize.cpp 中同样复用了改进后的make_qx_quants如 L1295 对子块 scale 的量化。4.3IQ3_K显式梯度上升循环IQ3_K的改进实现位于 ggml/src/iqk/iqk_quantize.cpp 的quantize_row_iq3_k_impl。它完整实现了 #295 文档中的数学推导候选 scale 初始化对每个 16 元素子块先用非移位值表iq3nl_values与移位值表shifted_values iq3nl_values 8在ntry 3的 ±3 轮循环中按(2·itry v[0])/max生成候选 scale并分别评估正负方向挑选使sumqx² best·sumq2的最优解L2347-L2415梯度上升迭代L2435-L2463进入最多 128 轮的循环每轮计算每个元素的梯度g d·w·(x − d·q)找出|g|最大且索引仍在允许范围L[j] 7或L[j] 0的元素将其索引 ±1 步进并增量更新sumqx、sumq2只改动这一个元素贡献的项若sumqx² best·sumq2则更新最优 scale否则超过 8 轮后提前跳出最终打包将子块 scale 用量化格式scales_l/scales_h写入块结构最终块 scaled乘上 fudge factor 后以 FP16 存储L2475-L2513。这里的g d·w·(x − d·q)与文档中的梯度公式 $g_j 2 d w_j (x_j - d q_j)$ 只差常数因子 2不影响取最大值的比较增量更新sumqx、sumq2正是文档中只需给分子加 $w_j x_j \Delta_j$、分母加 $w_j (2 q_j \Delta_j 1)$的工程实现。这就是为什么它比穷举搜索快得多却几乎不损失精度。五、复现验证llama-quantize 实战5.1 完整命令行按 PR 的测试方法在仓库构建出bin/llama-quantize后执行./bin/llama-quantize --imatrix $imatrix --token-embedding-type q8_0 --output-tensor-type q8_0 --pure $model $output $quant各参数含义与 examples/quantize/quantize.cpp 的 usage 输出一致--pure禁用 k-quant 混合方案把所有张量都量化为同一种类型。这是本次评测的关键——否则ffn_down等张量会被替换为其他量化类型无法单独衡量新算法的效果--imatrix file_name使用指定文件作为量化优化的重要性矩阵文件包含按张量划分的权重见load_imatrix的实现L210-L271--token-embedding-type q8_0token 嵌入张量固定为Q8_0隔离其影响--output-tensor-type q8_0output 张量固定为Q8_0同样为了隔离变量$model输入模型F32/F16 GGUF$output输出文件名$quant目标量化类型如Q2_K、Q4_K、Q5_K、Q4_1、Q5_1、IQ3_K。5.2 可用量化类型速查examples/quantize/quantize.cpp 中的QUANT_OPTIONS表列出了仓库支持的全部量化类型。与本文相关的类型及其在表内的说明如下类型说明Q2_K2.63G0.6717 ppl LLaMA-v1-7BQ4_13.90G0.1585 ppl LLaMA-v1-7BQ5_14.70G0.0349 ppl LLaMA-v1-7BQ4_K别名Q4_K_M3.80G0.0532 pplQ5_K别名Q5_K_M4.45G0.0122 pplIQ3_K3.44 bpw 非线性量化Q8_06.70G0.0004 ppl LLaMA-v1-7B评测中用作 embedding/output 固定类型命令行还支持--nthreads、--allow-requantize、--leave-output-tensor、--dry-run、--include-weights/--exclude-weights、--custom-q regex1type1,...等高级选项完整清单见 usage 输出便于做更细粒度的混合量化实验。5.3 复现注意事项评测对 CPU 量化吞吐敏感建议把模型放在 SSD 上否则 IO 会掩盖算法本身的耗时差异PR 中 L1-7B 的 Q-time 标记为 N/A 正是此原因--pure模式要求张量行数能被对应量化类型的 super-block 大小整除否则需要回退类型——#294 已修复--pure下这类回退问题见 #295 脚注 4而使用混合模式不加--pure时前几层的ffn_down张量会按 #295 的做法自动改用其他量化类型以规避灾难性失败对话中 saood06 的实测提醒对 DeepSeek-V3-0324 这类含 MLA 张量attn_k_b、attn_v_b的模型张量维度是否被 256 整除会直接决定能否用iq4_k_r4等类型否则会触发 fallback 到q5_0/q6_K——量化日志中的not divisible by 256, required for ... - using fallback quantization提示即为此情况。六、结论与适用边界#302 延续了 ik_llama.cpp 在量化领域的核心方法论把块级量化视为带权重的优化问题用显式梯度做一阶搜索在 RTN 附近有限的 scale 候选内以极低成本逼近穷举最优。它带来的收益与边界同样清晰收益IQ3_K量化提速最高约 40%type-1 量化Q2_K/Q4_K/Q5_K/Q4_1/Q5_1提速约 ≤15%对难量化模型LLaMA-3 系列PPL 有改善彻底避免了IQ3_K在 DeepSeek-V2-Lite 上的灾难性退化边界并非所有模型 PPL 都会下降如 L2-7B、M-7B 的Q4_1/Q5_K有约 0.001 的微小回升提速幅度与模型结构、张量维度、存储介质有关--pure全同类型量化与带 imatrix 的组合是获得上述结论的复现前提。对于希望更快产出高质量量化模型的实践者本文给出的命令、参数与源码定位quantize.cpp、iqk_quantize.cpp、ggml-quants.c足以支撑你复现 PR 中的全部结论并在此基础上按需调整--custom-q与 fudge factors 做进一步的量化实验。赞分享人工智能大模型推理引擎本地部署模型量化模型优化【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp点击查看免费下载相关推荐将 ik_llama.cpp 的 IQK 量化栈移植到自有 forkq6_0 与 IQ3_K~IQ6_K 量化实验全解析将 ik_llama.cpp 的 IQK 量化栈移植到自有 forkq6_0 与 IQ3_K~IQ6_K 量化实验全解析 本文围绕仓库内 github dat人工智能大模型推理引擎本地部署模型量化模型优化ik_llama.cpp CUDA 量化内核优化为 IQ3_K / IQ4_K / IQ4_KS / IQ4_XS 系列提速 Prompt Processingik_llama.cpp CUDA 量化内核优化为 IQ3_K / IQ4_K / IQ4_KS / IQ4_XS 系列提速 Prompt Processin人工智能大模型推理引擎本地部署模型量化模型优化ik_llama.cpp 4 bpw 量化实战从 IQ3_K/IQ4_K 混合方案到 IQ4_KS 新量化类型ik_llama.cpp 4 bpw 量化实战从 IQ3_K/IQ4_K 混合方案到 IQ4_KS 新量化类型 导读 本文以 ik_llama.cpp 仓库中人工智能大模型推理引擎本地部署模型量化模型优化上一篇从源码到运行编译flinux的完整步骤附常见错误解决下一篇5个Frappe调试技巧快速定位问题与性能优化指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/20 17:26:26

Linux驱动自动加载全解析:从内核模块到设备树实战

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

2026/9/20 17:26:26

python-pptx生成软件开发答辩PPT:从流程骨架到现场答辩

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

2026/9/20 18:26:33

Bili.Uwp 上手指南:Windows 上跑起自己的 UWP 哔哩哔哩客户端

Bili.Uwp 上手指南:Windows 上跑起自己的 UWP 哔哩哔哩客户端 【免费下载链接】Bili.Uwp 适用于新系统UI的哔哩 项目地址: https://gitcode.com/GitHub_Trending/bi/Bili.Uwp Bili.Uwp(仓库内名为“哔哩”)是一款用 C# 和 UWP 框架开发…

2026/9/20 18:26:33

Atlas 300V实战:从ONNX到OM,用CANN部署YOLO推理模型

1. 先别急着部署,Atlas 300V到底是个什么"卡"看到"atlas 300v 24g 是运算加速卡吗"这个问题的时候,我基本能猜到提问的人正处于哪个阶段:手里刚刚拿到一块Atlas 300V,插到服务器上,正准备像装NVID…

2026/9/20 18:26:33

KataGo围棋AI配置与优化全指南

1. 项目概述KataGo作为当前最强大的开源围棋AI之一,其神经网络架构和搜索算法在棋力表现上已经超越了许多商业软件。不同于传统围棋引擎,KataGo采用蒙特卡洛树搜索(MCTS)与深度神经网络结合的架构,支持自定义规则和让子…

2026/9/20 18:26:33

AIGC模型部署方案详解:本地、云端与混合架构的选型与实战

过去一年里,找我咨询“AIGC模型部署”的人比预想中多得多。多数人不是不会跑代码,而是卡在第一个选择题上:到底是买一台机器在本地部署,还是直接调云端API,又或者两边各放一部分形成混合架构。这个决策直接影响后面的成…

2026/9/20 18:21:33

Edge垂直标签页设置教程:宽屏效率提升与标签管理技巧

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

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 0:04:49

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/20 0:04:49

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/20 4:54:47

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/20 5:01:23

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/20 5:09:33

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码