ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

ik_llama.cpp 三元量化 IQ2_TN 的 Zen4 性能优化:PP 吞吐提升的源码级剖析

ik_llama.cpp 三元量化 IQ2_TN 的 Zen4 性能优化:PP 吞吐提升的源码级剖析 ik_llama.cpp 三元量化 IQ2_TN 的 Zen4 性能优化PP 吞吐提升的源码级剖析【免费下载链接】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 #43 - iq2_tn: slightly faster PP on Zen4 的技术内容展开梳理 IQ2_TN针对 TriLM 三元模型的 2.0625 bpw 量化格式从首次落地到 Zen4 上持续优化的完整演进脉络。读者将理解为何三值权重ternary量化能在 CPU 上获得极高的 prompt processingPP吞吐、Zen4 的 AVX512 指令在其中的关键作用以及这一优化线与 llama.cpp 主线 TQ2_0 量化的真实性能差距来源。一、背景TriLM 三元模型与 TQ2_0 的出现1.1 为什么关注三元模型2024 年 8 月llama.cpp 主线在 PR-8151 中放弃了早期的Q1_3/Q2_2三元量化方案转向块大小为 256 权重的TQ1_0与TQ2_0类似 k-quants / i-quants 的布局并引入了Q8_K用于 CPU 上的量化点积。这一转向意味着主线焦点从 Bitnet b1.58 移向了 TriLM 系列三元模型。ik_llama.cpp 作者ikawrakow对此的观察是TQ2_0 在 AVX2 上表现出众因此决定以本仓库特有的iqk_mul_mat矩阵乘法框架为基准检验更好的矩阵乘法能否进一步压榨三元量化的性能于是诞生了 IQ2_TNTN即TriNet。1.2 IQ2_TN 与 TQ2_0 的格式差异从 PR #13 的说明可以看出两种格式的关键区别共同点都以 256 个权重为一块packed 权重值的排列顺序与偏移完全一致差异点IQ2_TN将 fp16 的块 scale 放在 packed 权重之前而TQ2_0放在之后。这个看似微小的布局差异并不影响数据的可移植性——PR #13 讨论中 compilade 曾确认IQ2_TN 的 Metal/CUDA 实现理论上也能直接服务 TQ2_0。真正的差异在于计算图组织TQ2_0 把块 scale 内嵌进量化数据可直接复用 llama.cpp 标准计算图而早期 Bitnet 方案Q1_3/Q2_2需要额外的ggml_scale操作。二、PR #43 核心内容Zen4 上 5% 的 PP 吞吐提升2.1 改动结论PR #43 是本条优化线的第二次性能迭代针对 Zen4Ryzen-7950X平台使用 flash attention 后PP512 494 t/s较此前的468 t/s提升约5%相比 IQ2_TN 的初始实现PR #13累计提升达15%相比已合并进 llama.cpp 主线的TQ2_0此时已快80%。需要说明的是PP512 指 512 token 的 prompt processing 基准见 examples/llama-bench这一指标衡量模型消化输入前缀的速度对长上下文对话与批处理场景至关重要。本 PR 只影响 PP 路径token generationTG不受影响。2.2 flash attention 的配合作用PR #43 明确标注性能数据using flash attention。仓库中存在独立的 CPU flash attention 实现 ggml/src/iqk/iqk_flash_attn.cpp与 ggml/src/iqk/iqk_mul_mat.cpp 同属iqk子框架。根据仓库讨论 #18 的记录CPU 端 FA 落地后PP 性能提升近 50%、TG 提升 22%是 IQ2_TN 吞吐数据能够持续攀升的重要前提。三、完整性能画像从 PR #13 到 PR #43 的优化基线要理解 PR #43 的 5% 提升分量需要先看它建立在怎样的基线上。PR #13初始 IQ2_TN 实现在四大后端上提供了完整对比数据全部基于当时最大的约 4B 参数 TriLM 模型2.0625 bpw 量化后 1.08 GiB3.1 AVX2Ryzen-5975WX32 核threadstestt/sllama.cpp PR-8151t/s本仓库 IQ2_TNSpeedup32pp512430.18 ± 0.56490.73 ± 0.621.14116pp512258.47 ± 0.21306.37 ± 0.031.1858pp512141.94 ± 0.04175.45 ± 0.061.2364pp51274.72 ± 0.0291.78 ± 0.011.2281tg12815.75 ± 0.0115.71 ± 0.011.0002tg12824.22 ± 0.0226.50 ± 0.001.0944tg12833.66 ± 0.1441.63 ± 0.041.2378tg12844.34 ± 0.0748.62 ± 0.031.09716tg12849.58 ± 0.0548.09 ± 0.030.9703.2 Zen4Ryzen-7950X16 核threadstestt/sllama.cpp PR-8151t/s本仓库 IQ2_TNSpeedup16pp512276.74 ± 0.75429.97 ± 1.411.5538pp512151.50 ± 0.46250.88 ± 0.311.6564pp51278.82 ± 0.64131.29 ± 0.231.6651tg12818.76 ± 0.4020.11 ± 0.051.0722tg12829.38 ± 0.0535.69 ± 0.071.2154tg12846.39 ± 0.0448.62 ± 0.011.0488tg12847.94 ± 0.0348.28 ± 0.041.0073.3 ARM_NEONM2-Maxthreadstestt/sllama.cpp PR-8151t/s本仓库 IQ2_TNSpeedup8pp51279.15 ± 0.21206.60 ± 0.142.6102tg12817.61 ± 0.0128.42 ± 0.051.6144tg12832.40 ± 0.0249.23 ± 0.091.5198tg12851.64 ± 0.7076.37 ± 0.221.4793.4 CUDA 与 Metal初始实现无 GPU 对比基线backendtestt/s本仓库 IQ2_TNCUDARTX-4080pp5129937 ± 81CUDARTX-4080tg128299.19 ± 0.15MetalM2-Max 30 核 GPUpp512891.52 ± 0.49MetalM2-Max 30 核 GPUtg12898.52 ± 0.16注意初始 CUDA 实现未做 MMQPP 走的是 dequantize cuBLAS gemm 路径。这几张表共同回答了 PR #43 隐含的命题IQ2_TN 的领先并非单一平台优势而是多后端矩阵乘法实现的系统性领先Zen4 只是其中最典型的代表。四、原理剖析Zen4 上 80% 领先从哪里来PR #13 对 Zen4 与 AVX2 的实现差异给出了精确解释这是理解 PR #43 5% 提升的钥匙4.1 融合乘加指令_mm512_dpbusd_epi32Zen4 实现了 AVX512 指令集。IQ2_TN 的 Zen4 专用实现使用_mm512_dpbusd_epi32——一条融合乘加指令而 AVX2 路径必须先用_mm256_maddubs_epi16做乘法再追加_mm256_add_epi16完成累加。单线程 TG 性能约 7% 的差距正源于此。4.2 向量寄存器容量带来的约 60% 差距作者特别指出Zen4 核心在硬件层面把 512 位指令拆成两条 256 位指令执行单纯加宽向量获益有限真正的红利来自32 个向量寄存器AVX2 只有 16 个。在 ggml 的矩阵乘法组织方式左矩阵一行 × 右矩阵多列的连续点积中一个块解包后的量化值可以被常驻在向量寄存器中复用寄存器数量直接决定数据重用的效率。因此 PP 上约 66% 的总差距 ≈ 7%融合乘加 约 60%寄存器利用。4.3 缓存与带宽效应多线程场景下IQ2_TN 因单线程实现更高效而带来更好的缓存利用TG 领先随线程数增加先扩大、后因内存带宽饱和而收敛16 线程时 TQ2_0 甚至反超约 3%见 AVX2 表。这是后续 PR #43/#47 不断调优线程伸缩性的伏笔。五、优化线的后续演进PR #43 之后的延续PR #43 只是该优化线的一个节点紧随其后的迭代直接验证了其思路的持续性5.1 PR #47AVX2 上再接再厉PR #47 将 Ryzen-5975WX 上的PP-512从主线的 498 t/s 推到545 t/sTG 不受影响。作者还探索了一条更激进的路线将 IQ2_TN 表示为行 scale IQ1_BN packed 量化值并复用 IQ2_BN 实现iq2_tn_as_iq2_bn分支理论上可把 PP-512 推到约 600 t/s——但该方案 TG 在 5975WX 上饱和于约 38 t/s低于当前实现的 50.5 t/s故被搁置。5.2 PR #44补齐 1.6875 bpw 的 IQ1_TNPR #44 为 TriLM 补齐了 1.6875 bpw 的 IQ1_TN直接复用 IQ1_BN 的矩阵乘法实现仅在行向量点积末尾补上行 scale 乘法IQ1_BN 的 scale 由独立ggml_scale操作提供。顺带优化了 IQ1_BN / IQ2_BN 的 PP 性能Bitnet 3B 上 Zen4 提速 17.6%38.8%、AVX2 提速 21.1%25.8%。该 PR 的 IQ1_TN vs TQ1_0 对比4B TriLM同样印证了 Zen4 上的巨大优势backendthreadstestt/sTQ1_0t/sIQ1_TNSpeedupCPUZen416pp512157.50 ± 0.40485.83 ± 2.233.085CPUAVX232pp512231.71 ± 0.41530.97 ± 1.292.292CPUNEON8pp51275.66 ± 0.02201.25 ± 0.062.6605.3 生态验证CPU 小模型 TG 反超 GPU讨论 CPU beating GPU in token generation speed 记录了一个极具代表性的场景99M 参数 TriLM 模型以 IQ2_TN 量化后仅 46 MiB恰好装进 Ryzen-7950X 的 64 MiB L3 缓存。此时 CPU 的 TG 速度1240 t/s16 线程反超 RTX-40801136 t/sM2-Max 上 CPU 以约 2 倍优势碾压同机 GPU。这说明三元量化 极致 CPU 实现能让小模型完全驻留 CPU 缓存这一场景获得超越 GPU 的能效体验。六、当前仓库中的实现现状6.1 类型定义层面的演进在 ggml/include/ggml.h 中可以清楚看到 IQ2_TN / IQ1_TN 的历史位置// depricated: GGML_TYPE_IQ2_TN 142, // depricated: GGML_TYPE_IQ1_TN 143, GGML_TYPE_IQ4_KS 144,对应的模型文件类型同样被标记// depricated: GGML_FTYPE_MOSTLY_IQ2_TN 135, // except 1d tensors // depricated: GGML_FTYPE_MOSTLY_IQ1_TN 136, // except 1d tensors也就是说IQ2_TN / IQ1_TN 作为独立的 GGML 类型已被废弃源码注释中的拼写depricated为仓库原文。其技术遗产被IQ1_BN1.625 bpw/ IQ2_BN2.0 bpw家族承接——后者直接面向 Bitnet 三元模型并在 ggml.h 中保留为正式类型GGML_TYPE_IQ1_BN 134、GGML_TYPE_IQ2_BN 135。6.2 核心实现的落点IQ2_TN 开创的三元量化 高效 CPU 矩阵乘法路线其实现核心集中在 ggml/src/iqk/iqk_mul_mat.cpp矩阵乘法、ggml/src/iqk/iqk_quantize.cpp量化与 ggml/src/ggml-quants.c量化函数族中。iqk子框架正是本仓库区别于 llama.cpp 主线、承载自定义量化矩阵乘法与 flash attention 的专属模块也是 PR #13/#43/#47 一系列性能数据的物质基础。七、复现与验证指南7.1 构建按仓库标准流程构建 CPU 版即可获得iqk_mul_mat路径构建说明见 docs/install.mdcmake -B build -DGGML_NATIVEON cmake --build build --config Release -jGGML_NATIVEON会为当前 CPU 启用包括 AVX512Zen4在内的指令集扩展是复现 Zen4 性能的关键前提。7.2 量化对 TriLM 系列三元模型做 IQ 系列量化可参考 PR #12 给出的三元模型量化命令形态该 PR 为 Q2_K 增加了三元网络检测此处按同仓库历史命令形式给出./bin/llama-quantize --pure --output-weight-type q6_K \ --token-embedding-type q4_K --ignore-imatrix-rules \ $trilm_model $output_file q2_K_S其中--ignore-imatrix-rules用于绕过内置 imatrix 规则约束使 Q2_K_S 对三元权重能按0/1/2取值量化块 scale 与 min 置 1、super-block scale/min 取行内最大值。在 PR #12 的记录中这种 Q2_K_S 三元量化在 3.9B TriLM 模型上达到了与 fp16 相同甚至略优的困惑度PPL 11.1240 vs 11.1531同时 PP 比 TQ2_0 快约 30%。7.3 基准测试使用 examples/llama-bench 复现 PP/TG 指标./bin/llama-bench -m $model -p 512 -n 128 -t 16 -fa 1-p 512对应文档中的 pp512-n 128对应 tg128 的生成长度-t 16线程数Zen4 7950X 为 16 核-fa 1启用 flash attention这是 PR #43 数据的前提条件。对比时建议固定同一份模型文件与同一物理机并多次运行取稳定值文档中的 ± 区间即多次采样的标准差。八、小结PR #43 看似只是Zen4 上 5% 的 PP 提速实则是 ik_llama.cpp 三元量化优化链的关键一环在 PR #13 建立的多后端基线Zen4 PP 领先 TQ2_0 约 55%66%之上通过 flash attention 加持与指令级打磨最终实现对主线 TQ2_0 的 80% PP 优势。其背后的技术要点可归纳为格式256 权重块 内嵌 fp16 scale2.0625 bpw兼顾计算图复用与解包效率指令Zen4 上_mm512_dpbusd_epi32融合乘加 32 个向量寄存器带来的数据重用系统CPU flash attention 与iqk_mul_mat框架协同让三元量化的内存带宽红利充分兑现演进该路线最终沉淀为 IQ1_BN / IQ2_BN 家族ggml.hIQ2_TN 作为历史类型被保留标注为废弃。对于希望在 CPU 上运行 2 bpw 级三元模型的开发者这条优化线的数据与实现路径提供了清晰的选型依据模型尺寸能装入 CPU 缓存时三元量化 高效 CPU 矩阵乘法是极具竞争力的部署方案。【免费下载链接】ik_llama.cppllama.cpp fork with additional SOTA quants and improved performance项目地址: https://gitcode.com/GitHub_Trending/ik/ik_llama.cpp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表