新闻详情

新闻详情

首页 / 资讯中心 / 详情

从零理解 LLM 量化:PTQ、QAT 与 ik_llama.cpp 量化体系的源码级导学

发布时间:2026/9/18 14:44:32来源:尧图网络
从零理解 LLM 量化:PTQ、QAT 与 ik_llama.cpp 量化体系的源码级导学
从零理解 LLM 量化PTQ、QAT 与 ik_llama.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 仓库中关于“如何学习 LLM 量化”的社区讨论为核心系统梳理机器学习背景的初学者最关心的三个问题训练时量化QAT与训练后量化PTQ有何区别、llama.cpp生态中的量化算法由哪些研究思想驱动、以及面对庞大的 C/C 代码库应当从何处入手。读完本文你将掌握量化术语的准确含义、GGUF 量化类型的完整谱系legacy quants / k-quants / i-quants / IQK quants / Trellis quants、基于重要度矩阵imatrix的量化实操流程并获得一份可落地的代码阅读路线图。一、核心概念训练时量化QAT与训练后量化PTQ讨论发起人robinnarsinghranabhat提出了一个看似“外行”实则关键的问题量化在训练阶段和推理评估阶段是不是有不同的技巧项目作者ikawrakow的回答非常直接llama.cpp不做任何训练因此它始终是训练后量化Post-Training Quantization, PTQ。这句话划定了整个生态的边界。llama.cpp及其派生仓库包括本仓库 ik_llama.cpp只负责加载已经训练好的模型权重再将其从 FP16/FP32 压缩为低比特表示模型本身的学习过程发生在别处如 PyTorch 训练框架中。在此基础上可以区分出三种量化范式范式是否训练核心做法典型代表PTQ训练后量化否直接对训练好的权重做低比特压缩无需反向传播llama.cpp、ik_llama.cpp 中的全部量化类型QAT量化感知训练是训练时权重不真正量化但强制约束在指定范围内期望得到更好的 PTQ 结果工业界常用的“伪量化”训练全量化训练是训练过程中权重就是量化表示Microsoft Research 的 Bitnet三值模型关于 QAT作者特别澄清了一个常见误解QAT 训练出来的模型本身并不是以量化形式存储的它的价值在于让权重分布更“规整”从而在后续的 PTQ 中表现更好——这是一种“为压缩而训练”的策略。1.1 真正量化训练的罕见案例Bitnet 三值模型作者指出他所知的唯一真正意义上的“量化模型训练”是微软研究院的Bitnet训练一个三值模型权重取值仅为-1, 0, 1外加一个 per-tensor每张量的浮点缩放因子。这种“极端量化 训练”的组合在当时的学术界是少数派因为它对训练稳定性、收敛性的要求都远高于普通训练。1.2 借助微调提升 PTQQuip#、AQLM、QTIP作者还介绍了一类较新的研究方向——利用微调数据指导 PTQfine-tuning for PTQ使用一部分语料在量化过程中引入数据感知的优化目标代表工作包括Quip#向量量化与格lattice编码思想i-quants 的 codebook 思路即源于此见后文AQLM加性量化Additive Quantization用多个码本的组合逼近权重QTIP基于格trellis的量化。作者特别强调这类方法与llama.cpp的“简单直接”量化路线有本质区别——它需要完整的训练框架如 PyTorch、强大的 GPU以及数小时到数天的 GPU 训练时间。换句话说它们是“重武器”而llama.cpp追求的是“无需训练、纯 CPU 也能跑”的轻量路线。二、量化类型的完整谱系从 legacy quants 到 IQK quants讨论中作者自述llama.cpp中除 legacy quantsQ4_0, Q4_1, Q5_0, Q5_1, Q8_0之外的所有量化类型都是他开发的而 legacy quants 本身也只是非常简单的 round-to-nearest最近邻舍入分块量化。这一历史背景解释了为何本仓库的量化类型如此丰富——它继承了这条“实验驱动”的开发路线。在 ggml/include/ggml.h 中可以看到完整枚举按家族划分如下2.1 Legacy quants基础分块量化Q4_0, Q4_1, Q5_0, Q5_1, Q8_0以及Q6_0block-wise 最近邻舍入结构最简单作为基准存在。表中对应GGML_TYPE_Q4_0等早期编号。2.2 K-quantsk 系分块量化Q2_K, Q3_K, Q4_K, Q5_K, Q6_K以 super-block超块为单位的混合精度量化每个超块内不同张量可以选用不同 block size 与 scale 精度是llama.cpp中应用最广的量化族之一。典型 BPWbits per weight每权重比特数可见 examples/quantize/README.mdLlama 2 7B 上Q2_K约 3.35 BPW、Q4_K_M约 4.84 BPW、Q6_K约 6.56 BPW。2.3 I-quants基于 codebook 的格量化IQ1_S, IQ2_XXS, IQ2_XS, IQ3_XXS, IQ3_S, IQ4_NL, IQ4_XS, IQ1_M等在亚 4-bit 区间i-quants 明显优于 k-quants。其核心机制是codebook码本用码本索引编码一组8 或 4 个权重在 E8 / D4 格lattice上的位置。这一思想“最初来自 QuIP#”AQLM 等研究也采用类似思路。作者在另一篇讨论 github-data/discussions/8 - New quantization types IQ2_K_ IQ3_K_ IQ4_K_ IQ5_K.md 中补充道codebook 相当于一种正则化限制了可用于表示权重组的格点集合从而避免量化算法过度关注个别权重。2.4 IQK quants非线性映射量化本仓库的特色IQ2_KS, IQ2_K, IQ3_K, IQ4_KS, IQ4_K, IQ5_KS, IQ5_K, IQ6_K, IQ2_KL等ggml.h中编号 137–158 区间不使用 codebook而是用非线性映射连接“存储的量化值”与“实际权重值”。作者创造这一族量化的动机之一就是“向自己证明 codebook 并没有什么特别之处”——同样能达到 i-quants 的精度却避免了 codebook 查表带来的 CPU 性能灾难。其衍生变体IQ4_KS, IQ4_KSS, IQ5_KS等进一步用“额外 1 bit 选择两张查找表”来降低量化误差。2.5 Trellis quants 与 R4 变体Trellis quantsIQ1_KT, IQ2_KT, IQ3_KT, IQ4_KT基于新型整数基 trellis 编码README 的 Quantization additions 一节有专门介绍能在 CPU 上获得可观性能。R4 变体如IQ2_KS_R4, IQ3_K_R4, IQ4_K_R4, IQ1_S_R4等row-interleaved行交错布局为特定硬件Zen4/AVX-512、CUDA的矩阵乘优化而设计对应ggml.h中编号 210 以上的类型。此外还有 8-bit KV-cache 量化类型Q8_KV、以及 MXFP4用于 gpt-oss 模型等。这些类型并非泛泛而谈ggml/include/ggml.h中的枚举定义、README.md 的量化新增清单以及 examples/quantize/README.md 的 BPW 表格都是可直接核对的一手证据。三、量化误差如何度量一个朴素的实验框架初学者常问“哪种量化最好”但作者在 Discussion 8 中给出了一个非常朴素、可复现的度量框架这也是原讨论中“研究思路”的直接体现QError PPL(Q) / PPL(fp16) - 1即用同一模型在量化前后的 perplexity困惑度之比衡量量化误差。之所以不用常见 benchmark是因为其一语言任务 benchmark 对量化误差的敏感度通常低于 PPL其二PPL 用llama.cpp现成工具即可计算成本低。作者用该方法对比 LLaMA-2-70B 与 LLaMA-3.1-70B 后发现两者之间存在约 1 BPW 的“信息密度”差距——LLaMA-3 用更多 token 训练、学到了更多信息因此同等 BPW 预算下量化误差更高。这正是“为什么新一代模型量化更难”的技术本质模型的“知识密度”提高了压缩的代价自然更大。结论度量量化质量时请始终与同一个FP16 参考模型对比而不是跨模型、跨 benchmark 横向比较。四、IQK 非线性量化的原理三次多项式与 SIMD 查表Discussion 8 中作者详细解释了 IQK quants 与 i-quants 的关键差异可作为理解本仓库量化“黑科技”的入口i-quants 的 codebook 很大codebook 编码一组权重规模通常为 2562048 个条目矩阵乘时需在大表中查索引现代 GPU 尚可应付但 CPU以及较老 GPU会付出巨大性能代价。IQK quants 用非线性映射替代 codebook量化值与权重之间的映射是一个三阶多项式。由于它作用在量化值上取值种类有限2-bit 只有 4 个、3-bit 只有 8 个……可以四舍五入为 8-bit 整数并放入查找表——查找表只有 4/8/16/32/64 个条目对应 2/3/4/5/6-bit能塞进 12 个 SIMD 寄存器。SIMD 指令直接完成查表AVX2 用_mm256_shuffle_epi8ARM NEON 用vqtbl1q_s8查表开销几乎为零因此 IQK quants 的推理性能可做到与线性映射量化k-quants相当。Discussion 8 中还给出了量化类型与查找表/块结构的对应关系节选类型块结构查找表BPWIQ2_KS32 权重/块per-row scale2×42.1875IQ2_K16 权重/块256 超块2×42.375IQ3_K16 权重/块256 超块2×83.4375IQ4_KS32 权重/块per-row scale2×164.25IQ4_K16 权重/块256 超块2×164.5IQ5_KS32 权重/块per-row scale2×325.25IQ5_K16 权重/块256 超块2×325.5IQ6_K16 权重/块256 超块2×646.5作者还指出IQ4_KS与IQ4_XS的 BPW 完全相同4.25但前者凭借“额外 1 bit 在两张查找表间选择”实现了更低的量化误差——这是 IQK 体系“用结构换精度”的典型例子。关于推理速度块大小为 32 的量化如IQ4_KS在 token 生成内存带宽受限上与Q4_0相当甚至更快prompt 处理仅慢 3%4%而块大小为 16 的量化因复用块 32 的 GEMM 内核prompt 处理约慢 20%25%。五、实操从 FP16 到 GGUF 的量化工作流讨论中没有展开实操命令但“LLM 量化”话题的落点必然是工具链。以下流程基于本仓库实际代码 examples/quantize/quantize.cpp 与 examples/quantize/README.md 整理。5.1 转换与量化# 1. 将 Hugging Face 模型转换为 FP16 GGUF python3 convert_hf_to_gguf.py models/mymodel/ # 2. 用 llama-quantize 量化为 4-bitQ4_K_M 示例 ./llama-quantize ./models/mymodel/ggml-model-f16.gguf \ ./models/mymodel/ggml-model-Q4_K_M.gguf Q4_K_M # 3. 运行量化模型 ./llama-cli -m ./models/mymodel/ggml-model-Q4_K_M.gguf -n 128llama-quantize支持非常细粒度的控制从 quantize.cpp 的 usage 输出 可以看到主要选项--allow-requantize允许对已量化张量再次量化警告会显著降低质量--leave-output-tensor保持output.weight不量化略微增大体积但提升质量尤其对 requantize 场景--pure禁用 k-quant 混合策略让所有张量使用同一类型--imatrix/--hide-imatrix使用/隐藏重要度矩阵--include-weights/--exclude-weights按正则表达式精确控制哪些张量参与量化--output-tensor-type、--token-embedding-type、--attn-q-type/--attn-k-type/--attn-v-type、--ffn-gate-type/--ffn-down-type/--ffn-up-type等per-tensor 族自定义量化类型--repack/--repack-pattern、--keep-split、--partial-requant与行交错重打包、分片模型相关的选项--dry-run只打印量化计划而不写文件是验证配置的首选。5.2 用 imatrix 提升低比特量化质量重要度矩阵importance matriximatrix是本仓库以及上游PTQ 质量的关键增强手段。其工具位于 examples/imatrix/imatrix.cpp基本用法取自其 usage 输出./llama-imatrix \ -m model.gguf -f some-text.txt [-o imatrix.dat] [--process-output] [--verbosity 1] \ [--no-ppl] [--chunk 123] [--output-frequency 10] [--save-frequency 0] \ [--in-file imatrix-prev-0.dat --in-file imatrix-prev-1.dat ...]-o imatrix.dat指定输出文件之后在量化时用--imatrix imatrix.dat传入llama-quantize--in-file可合并多份历史 imatrix增量采集-lsim, --layer-similarity额外采集层相似度数据帮助理解各层的重要性差异代码中IMatrixCollector通过ggml的回调机制collect_imatrix在模型前向过程中统计每个张量输入的激活分布从而让量化器优先照顾“敏感”权重。实践要点imatrix 采集的语料应尽量贴近目标任务的真实分布对 MoE 模型与 MLA 类模型仓库内也有对应的 imatrix 修复见 README.md 的更新记录。5.3 注意 build 与硬件前提量化本身是纯计算任务但推理性能高度依赖硬件指令集。仓库 README.md 明确提醒AVX-512 能力 CPUAMD Zen4 / Intel Sapphire Rapids需要额外编译标志才能激活 IQK 量化 GEMM 内核HAVE_FANCY_SIMD路径否则默认回退到 AVX2。构建命令示例cmake -B build -DGGML_NATIVEON cmake --build build --config Release -j$(nproc)GPUCUDA构建则在上述基础上追加-DGGML_CUDAON。所有量化类型的矩阵乘在 CUDA 上都有对应内核README 的 Quantization performance improvements 一节有记录但行交错R4格式对某些类型存在 CUDA 实现缺失混合 CPU/GPU 推理时需留意。六、如何导航这个 C/C 代码库给初学者的路线图讨论的第二部分回归到学习路径问题。提问者自称熟悉 Python 与 ML 概念、懂 C 指针但未写过复杂 C/C 程序并困惑于“是否需要先补操作系统、计算机组成、内存管理”。社区成员arnfaldur的回应很中肯“理解这个代码库不是从最矮的墙开始爬。”建议先找免费的初/中级 C 课程打底不需要先精通全部计算机基础但提问者正处于“不知道自己不知道什么”的阶段一门系统的 CS 通识课操作系统、体系结构、内存管理收益最大。结合本仓库结构这里给出一条可操作的阅读路径由浅入深先从工具入口看行为运行 examples/quantize/README.md 中的完整量化流程理解“FP16 → GGUF → 量化 GGUF”的输入输出形态读量化参数面阅读 examples/quantize/quantize.cpp 的 usage 与参数解析认识llama_model_quantize_params默认参数在 src/llama-quantize.cpp 中定义这能让你快速理解“一个量化任务涉及哪些自由度”深入张量表示阅读 ggml/include/ggml.h 中的类型枚举与ggml_quantize_chunk系列 API理解量化后的数据布局block/super-block/scale如何抽象进入具体算法从ggml-quants.c位于 ggml/src/ggml-quants.c开始先读最简单 legacy quants 的量化/反量化函数再读 k-quants、i-quants 与 IQK 的对照实现回到应用层理解 examples/imatrix/imatrix.cpp 的IMatrixCollector如何通过回调钩子介入模型前向这是“研究型功能如何优雅嵌入推理引擎”的范例。七、小结与延伸阅读回到讨论的核心结论llama.cpp/ ik_llama.cpp 只做 PTQQAT、全量化训练如 Bitnet与数据驱动的 PTQ 微调Quip#、AQLM、QTIP属于另一条技术路线量化质量应基于同一模型的 PPL 相对变化评估而非跨模型比较本仓库在“无需训练、CPU 友好”的约束下通过 legacy quants → k-quants → i-quants → IQK quants → Trellis quants 的演进把非线性映射、codebook、SIMD 查表等技术做到了工程可用的程度初学者进入代码库的路径是先跑通工具链再读参数面与类型枚举最后深入ggml-quants.c的算法实现。若希望继续深挖仓库内有两份高价值一手资料本文多次引用的 github-data/discussions/8 - New quantization types IQ2_K_ IQ3_K_ IQ4_K_ IQ5_K.md量化动机、PPL 度量图与 IQK 原理的完整阐述以及 README.md 的量化新增/改进清单含各 PR 索引。实践层面examples/quantize/README.md 提供了从转换到量化的最小可运行示例是动手验证本文所有概念的最佳起点。【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

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

较早相关资讯

最新相关资讯

把 GitHub Copilot 的模型通道改到 TaoToken 后,GPT-4o 和 Gemini 2.0 Flash 随切随用 2026/9/18 15:26:39

把 GitHub Copilot 的模型通道改到 TaoToken 后,GPT-4o 和 Gemini 2.0 Flash 随切随用

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

阅读更多 →
Oracle 19c 从安装到卸载:监听配置、备份恢复与跨版本迁移实战 2026/9/18 15:26:39

Oracle 19c 从安装到卸载:监听配置、备份恢复与跨版本迁移实战

Oracle 19c 是目前生产环境里使用频率最高的长期支持版本之一,但真正把它装明白的人并不多。多数资料只讲到“下一步下一步点完”,一旦遇到监听连不上、注册表卸载不干净、数据文件跨版本恢复失败这类问题,新手往往卡在原地。这篇教程会以 Wi…

阅读更多 →
RIOT OS 平台适配指南:STM32 Nucleo-F429ZI 开发板(nucleo-f429zi) 2026/9/18 15:26:39

RIOT OS 平台适配指南:STM32 Nucleo-F429ZI 开发板(nucleo-f429zi)

RIOT OS 平台适配指南:STM32 Nucleo-F429ZI 开发板(nucleo-f429zi) 【免费下载链接】RIOT RIOT - The friendly OS for IoT 项目地址: https://gitcode.com/GitHub_Trending/riot/RIOT 本文以 RIOT 仓库中 boards/nucleo-f429zi/doc.md…

阅读更多 →
从 Markdown 到 Skills,TaoToken 接住批注问答 2026/9/18 15:26:39

从 Markdown 到 Skills,TaoToken 接住批注问答

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

阅读更多 →
成本 DSH 任务时,TaoToken 的 Key 与 Node.js 版本先确认 2026/9/18 15:26:39

成本 DSH 任务时,TaoToken 的 Key 与 Node.js 版本先确认

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

阅读更多 →
管理会计本量利分析:从公式到工程化经营看板 2026/9/18 15:23:38

管理会计本量利分析:从公式到工程化经营看板

简介:这份培训课程PPT面向管理会计学习者与企业财务人员,系统讲解本—量—利分析这一核心管理会计工具,帮助读者理解成本、销量与利润之间的内在关系,从而在既定成本结构和售价下规划利润目标。资源为单个PPT文件,压缩…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

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

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