<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>llama.cpp | 林子杨的个人网站</title><link>https://ziyanglin.netlify.app/zh/tags/llama.cpp/</link><atom:link href="https://ziyanglin.netlify.app/zh/tags/llama.cpp/index.xml" rel="self" type="application/rss+xml"/><description>llama.cpp</description><generator>Source Themes Academic (https://sourcethemes.com/academic/)</generator><language>zh-Hans</language><lastBuildDate>Fri, 27 Jun 2025 00:00:00 +0000</lastBuildDate><image><url>https://ziyanglin.netlify.app/img/icon-192.png</url><title>llama.cpp</title><link>https://ziyanglin.netlify.app/zh/tags/llama.cpp/</link></image><item><title>模型量化技术指南：从理论到实践的全面解析</title><link>https://ziyanglin.netlify.app/zh/post/model-quantization-documentation/</link><pubDate>Fri, 27 Jun 2025 00:00:00 +0000</pubDate><guid>https://ziyanglin.netlify.app/zh/post/model-quantization-documentation/</guid><description>&lt;h2 id="1-">1. 引言&lt;/h2>
&lt;p>随着大型语言模型（LLM）的规模和复杂性不断增长，其部署和推理成本也日益高昂。模型量化作为一种关键的优化技术，通过降低模型权重和激活值的数值精度，显著减少了模型的存储占用、内存消耗和计算量，从而实现了在资源受限设备（如移动端、边缘设备）上的高效推理。&lt;/p>
&lt;p>本文档旨在深入浅出地介绍深度学习模型量化的核心概念、主流方案以及在两个业界领先的推理框架——&lt;code>llama.cpp&lt;/code> 和 &lt;code>vLLM&lt;/code>——中的具体实现。我们将详细探讨它们各自支持的量化类型、底层原理和使用方法，并对最新的量化技术趋势进行展望。&lt;/p>
&lt;h2 id="2-">2. 量化基础知识&lt;/h2>
&lt;p>在深入探讨具体框架之前，我们首先需要理解一些量化的基本概念。&lt;/p>
&lt;h3 id="21-">2.1 什么是模型量化？&lt;/h3>
&lt;p>模型量化（Model Quantization）是指将模型中的浮点数（通常是 32 位浮点数，即 &lt;code>FP32&lt;/code>）转换为位数更少的整数（如 &lt;code>INT8&lt;/code>、&lt;code>INT4&lt;/code>）或低精度浮点数（如 &lt;code>FP16&lt;/code>、&lt;code>FP8&lt;/code>）的过程。这个过程本质上是一种信息压缩，它试图在尽可能保持模型精度的前提下，大幅降低模型的复杂度。&lt;/p>
&lt;h3 id="22-">2.2 为什么需要量化？&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>减小模型尺寸&lt;/strong>：低位宽的数值表示可以显著减小模型文件的大小。例如，将 &lt;code>FP32&lt;/code> 模型量化为 &lt;code>INT8&lt;/code>，模型尺寸可以减小约 4 倍。&lt;/li>
&lt;li>&lt;strong>降低内存带宽&lt;/strong>：更小的数据类型意味着在内存和计算单元之间传输数据时占用的带宽更少，这对于内存带宽敏感的硬件至关重要。&lt;/li>
&lt;li>&lt;strong>加速计算&lt;/strong>：许多现代处理器（CPU、GPU、TPU）对整数运算的支持比浮点数运算更高效，可以提供更高的吞吐量和更低的延迟。&lt;/li>
&lt;li>&lt;strong>降低功耗&lt;/strong>：整数运算通常比浮点运算消耗更少的能量。&lt;/li>
&lt;/ul>
&lt;h3 id="23-">2.3 量化原理：映射与反量化&lt;/h3>
&lt;p>量化的核心是将一个较大范围的浮点数值映射到一个较小范围的定点整数值。这个过程由以下公式定义：&lt;/p>
&lt;pre>&lt;code>Q(r) = round(r / S + Z)
&lt;/code>&lt;/pre>
&lt;p>其中：&lt;/p>
&lt;ul>
&lt;li>&lt;code>r&lt;/code> 是原始的浮点数值。&lt;/li>
&lt;li>&lt;code>Q(r)&lt;/code> 是量化后的整数值。&lt;/li>
&lt;li>&lt;code>S&lt;/code> 是&lt;strong>缩放因子 (Scale)&lt;/strong>，表示每个量化整数步长对应的浮点数值大小。&lt;/li>
&lt;li>&lt;code>Z&lt;/code> 是&lt;strong>零点 (Zero-point)&lt;/strong>，表示浮点数 0 对应的量化整数值。&lt;/li>
&lt;/ul>
&lt;p>在进行计算时，需要将量化后的值反量化回浮点数域：&lt;/p>
&lt;pre>&lt;code>r' = S * (Q(r) - Z)
&lt;/code>&lt;/pre>
&lt;p>&lt;code>r'&lt;/code> 是反量化后的浮点数，它与原始值 &lt;code>r&lt;/code> 存在一定的量化误差。&lt;/p>
&lt;h3 id="24--vs-">2.4 对称量化 vs. 非对称量化&lt;/h3>
&lt;p>根据零点的选择，量化可以分为两种模式：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>对称量化 (Symmetric Quantization)&lt;/strong>：将浮点数的范围 &lt;code>[-abs_max, abs_max]&lt;/code> 对称地映射到整数范围。在这种模式下，零点 &lt;code>Z&lt;/code> 通常为 0（对于有符号整数）或 &lt;code>2^(bits-1)&lt;/code>（对于无符号整数的偏移）。计算相对简单。&lt;/li>
&lt;li>&lt;strong>非对称量化 (Asymmetric Quantization)&lt;/strong>：将浮点数的范围 &lt;code>[min, max]&lt;/code> 完整地映射到整数范围。这种模式下，零点 &lt;code>Z&lt;/code> 是一个可以根据数据分布调整的浮点数。它能更精确地表示非对称分布的数据，但计算稍复杂。&lt;/li>
&lt;/ul>
&lt;h3 id="25--vs-">2.5 逐层量化 vs. 逐组/逐通道量化&lt;/h3>
&lt;p>缩放因子 &lt;code>S&lt;/code> 和零点 &lt;code>Z&lt;/code> 的计算粒度也影响着量化的精度：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>逐层/逐张量量化 (Per-Layer/Per-Tensor)&lt;/strong>：整个权重张量（或一层的所有权重）共享同一套 &lt;code>S&lt;/code> 和 &lt;code>Z&lt;/code>。这种方式最简单，但如果张量内数值分布不均，可能会导致较大误差。&lt;/li>
&lt;li>&lt;strong>逐通道量化 (Per-Channel)&lt;/strong>：对于卷积层的权重，每个输出通道使用独立的 &lt;code>S&lt;/code> 和 &lt;code>Z&lt;/code>。&lt;/li>
&lt;li>&lt;strong>逐组量化 (Grouped Quantization)&lt;/strong>：将权重张量分成若干组，每组使用独立的 &lt;code>S&lt;/code> 和 &lt;code>Z&lt;/code>。这是目前 LLM 量化中非常流行的方式，因为它能在精度和开销之间取得很好的平衡。组的大小（group size）是一个关键超参数。&lt;/li>
&lt;/ul>
&lt;h3 id="26-">2.6 常见的量化范式&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>训练后量化 (Post-Training Quantization, PTQ)&lt;/strong>：这是最常用、最便捷的量化方法。它在模型已经训练完成后进行，无需重新训练。PTQ 通常需要一个小的校准数据集（Calibration Dataset）来统计权重和激活值的分布，从而计算出最优的量化参数（&lt;code>S&lt;/code> 和 &lt;code>Z&lt;/code>）。&lt;/li>
&lt;li>&lt;strong>量化感知训练 (Quantization-Aware Training, QAT)&lt;/strong>：在模型训练过程中就模拟量化操作带来的误差。通过在训练的前向传播中插入伪量化节点，让模型在训练时就适应量化带来的精度损失。QAT 通常能获得比 PTQ 更高的精度，但需要完整的训练流程和数据，成本更高。&lt;/li>
&lt;/ul>
&lt;p>现在，我们已经具备了量化的基础知识，接下来将深入分析 &lt;code>llama.cpp&lt;/code> 和 &lt;code>vLLM&lt;/code> 中的具体实现。&lt;/p>
&lt;h2 id="3-llamacpp-">3. llama.cpp 的量化方案&lt;/h2>
&lt;p>&lt;code>llama.cpp&lt;/code> 是一个用 C/C++ 编写的高效 LLM 推理引擎，以其出色的跨平台性能和对资源受限设备的支持而闻名。它的核心优势之一就是其强大而灵活的量化支持，这都围绕着其自研的 &lt;code>GGUF&lt;/code> (Georgi Gerganov Universal Format) 文件格式展开。&lt;/p>
&lt;h3 id="31-gguf-">3.1 GGUF 格式与量化&lt;/h3>
&lt;p>GGUF 是一种专为 LLM 设计的二进制格式，用于存储模型的元数据、词汇表和权重。它的一个关键特性是原生支持多种量化权重，允许在同一个文件中混合不同精度的张量。这使得 &lt;code>llama.cpp&lt;/code> 可以在加载模型时直接使用量化后的权重，无需额外的转换步骤。&lt;/p>
&lt;h3 id="32-llamacpp-">3.2 &lt;code>llama.cpp&lt;/code> 的量化类型命名法&lt;/h3>
&lt;p>&lt;code>llama.cpp&lt;/code> 定义了一套非常具体的量化类型命名约定，通常格式为 &lt;code>Q&amp;lt;bits&amp;gt;_&amp;lt;type&amp;gt;&lt;/code>。理解这些命名是掌握 &lt;code>llama.cpp&lt;/code> 量化的关键。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Q&lt;/code>&lt;/strong>: 代表量化 (Quantized)。&lt;/li>
&lt;li>&lt;strong>&lt;code>&amp;lt;bits&amp;gt;&lt;/code>&lt;/strong>: 表示每个权重的平均比特数，如 &lt;code>2&lt;/code>, &lt;code>3&lt;/code>, &lt;code>4&lt;/code>, &lt;code>5&lt;/code>, &lt;code>6&lt;/code>, &lt;code>8&lt;/code>。&lt;/li>
&lt;li>&lt;strong>&lt;code>&amp;lt;type&amp;gt;&lt;/code>&lt;/strong>: 表示具体的量化方法或变种。&lt;/li>
&lt;/ul>
&lt;p>以下是一些最常见的量化类型及其解释：&lt;/p>
&lt;h4 id="321--legacy">3.2.1 基础量化类型 (Legacy)&lt;/h4>
&lt;p>这些是早期的量化方法，现在大多已被 &lt;code>K-Quants&lt;/code> 取代，但为了兼容性仍然保留。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Q4_0&lt;/code>, &lt;code>Q4_1&lt;/code>&lt;/strong>: 4-bit 量化。&lt;code>Q4_1&lt;/code> 比 &lt;code>Q4_0&lt;/code> 使用了更高精度的缩放因子，因此通常精度更高。&lt;/li>
&lt;li>&lt;strong>&lt;code>Q5_0&lt;/code>, &lt;code>Q5_1&lt;/code>&lt;/strong>: 5-bit 量化。&lt;/li>
&lt;li>&lt;strong>&lt;code>Q8_0&lt;/code>&lt;/strong>: 8-bit 对称量化，使用逐块（block-wise）的缩放因子。这是最接近原始 &lt;code>FP16&lt;/code> 精度的量化类型之一，通常作为性能和质量的基准。&lt;/li>
&lt;li>&lt;strong>&lt;code>Q2_K&lt;/code>, &lt;code>Q3_K&lt;/code>, &lt;code>Q4_K&lt;/code>, &lt;code>Q5_K&lt;/code>, &lt;code>Q6_K&lt;/code>&lt;/strong>: 这些是 &lt;code>K-Quants&lt;/code> 系列。&lt;/li>
&lt;/ul>
&lt;h4 id="322-kquants-">3.2.2 K-Quants (推荐)&lt;/h4>
&lt;p>&lt;code>K-Quants&lt;/code> 是 &lt;code>llama.cpp&lt;/code> 中引入的一套更先进、更灵活的量化方案。它们通过更精细的块结构和超级块（super-block）的概念，实现了在极低比特率下更好的精度保持。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>块 (Block)&lt;/strong>: 权重被分成固定大小的块（通常为 256 个权重）。&lt;/li>
&lt;li>&lt;strong>超级块 (Super-block)&lt;/strong>: 多个块组成一个超级块。在超级块级别，会存储更精细的量化参数（如最小/最大缩放因子）。&lt;/li>
&lt;/ul>
&lt;p>&lt;code>K-Quants&lt;/code> 的命名通常包含一个后缀，如 &lt;code>_S&lt;/code>, &lt;code>_M&lt;/code>, &lt;code>_L&lt;/code>，表示不同的大小/复杂度：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>S&lt;/code> (Small)&lt;/strong>: 最小的版本，通常精度最低。&lt;/li>
&lt;li>&lt;strong>&lt;code>M&lt;/code> (Medium)&lt;/strong>: 中等大小，平衡了精度和尺寸。&lt;/li>
&lt;li>&lt;strong>&lt;code>L&lt;/code> (Large)&lt;/strong>: 最大版本，通常精度最高。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>常见 K-Quants 类型:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;code>Q4_K_M&lt;/code>&lt;/strong>: 4-bit K-Quant，中等大小。这是目前最常用、最推荐的 4-bit 量化类型之一，在尺寸和性能之间取得了很好的平衡。&lt;/li>
&lt;li>&lt;strong>&lt;code>Q4_K_S&lt;/code>&lt;/strong>: 4-bit K-Quant，小版本。&lt;/li>
&lt;li>&lt;strong>&lt;code>Q5_K_M&lt;/code>&lt;/strong>: 5-bit K-Quant，中等大小。提供了比 4-bit 更好的精度，同时尺寸小于 &lt;code>Q8_0&lt;/code>。&lt;/li>
&lt;li>&lt;strong>&lt;code>Q6_K&lt;/code>&lt;/strong>: 6-bit K-Quant。提供了非常高的精度，接近 &lt;code>Q8_0&lt;/code>，但尺寸更小。&lt;/li>
&lt;li>&lt;strong>&lt;code>IQ2_XS&lt;/code>, &lt;code>IQ2_S&lt;/code>, &lt;code>IQ2_XXS&lt;/code>&lt;/strong>: 2-bit 量化变种，&lt;code>IQ&lt;/code> 代表 &amp;ldquo;Inaccurate Quantization&amp;rdquo;，旨在实现极端的模型压缩，但精度损失较大。&lt;/li>
&lt;/ul>
&lt;h3 id="33--llamaquantize-">3.3 如何使用 &lt;code>llama-quantize&lt;/code> 工具&lt;/h3>
&lt;p>&lt;code>llama.cpp&lt;/code> 提供了一个名为 &lt;code>llama-quantize&lt;/code> 的命令行工具，用于将 &lt;code>FP32&lt;/code> 或 &lt;code>FP16&lt;/code> 的 GGUF 模型转换为量化后的 GGUF 模型。&lt;/p>
&lt;p>&lt;strong>基本用法:&lt;/strong>&lt;/p>
&lt;pre>&lt;code class="language-bash">./llama-quantize &amp;lt;input-gguf-file&amp;gt; &amp;lt;output-gguf-file&amp;gt; &amp;lt;quantization-type&amp;gt;
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>示例：将 FP16 模型量化为 Q4_K_M&lt;/strong>&lt;/p>
&lt;pre>&lt;code class="language-bash"># 首先，将原始模型（如 PyTorch 格式）转换为 FP16 GGUF
python3 convert.py models/my-model/
# 然后，使用 llama-quantize 进行量化
./llama-quantize ./models/my-model/ggml-model-f16.gguf ./models/my-model/ggml-model-Q4_K_M.gguf Q4_K_M
&lt;/code>&lt;/pre>
&lt;h3 id="34--importance-matrix">3.4 重要性矩阵 (Importance Matrix)&lt;/h3>
&lt;p>为了进一步减少量化带来的精度损失，&lt;code>llama.cpp&lt;/code> 引入了重要性矩阵（&lt;code>imatrix&lt;/code>）的概念。这个矩阵通过在校准数据集上运行模型来计算每个权重的重要性。在量化过程中，&lt;code>llama-quantize&lt;/code> 会参考这个矩阵，对更重要的权重施加更小的量化误差，从而保护模型的关键信息。&lt;/p>
&lt;p>&lt;strong>使用 &lt;code>imatrix&lt;/code> 进行量化:&lt;/strong>&lt;/p>
&lt;pre>&lt;code class="language-bash"># 1. 生成重要性矩阵
./llama-imatrix -m model-f16.gguf -f calibration-data.txt -o imatrix.dat
# 2. 使用 imatrix 进行量化
./llama-quantize --imatrix imatrix.dat model-f16.gguf model-Q4_K_M-imatrix.gguf Q4_K_M
&lt;/code>&lt;/pre>
&lt;h3 id="35-">3.5 总结&lt;/h3>
&lt;p>&lt;code>llama.cpp&lt;/code> 的量化方案以 &lt;code>GGUF&lt;/code> 格式为核心，提供了一套丰富、高效且经过实战检验的量化类型。其 &lt;code>K-Quants&lt;/code> 系列在低比特量化方面表现尤为出色，结合重要性矩阵等高级技术，能够在大幅压缩模型的同时，最大限度地保留模型性能。对于需要在 CPU 或资源有限的硬件上部署 LLM 的场景，&lt;code>llama.cpp&lt;/code> 是一个绝佳的选择。&lt;/p>
&lt;h2 id="4-vllm-">4. vLLM 的量化生态系统&lt;/h2>
&lt;p>与 &lt;code>llama.cpp&lt;/code> 的内聚、自成一体的量化体系不同，&lt;code>vLLM&lt;/code> 作为一个面向高性能、高吞吐量 GPU 推理的服务引擎，其量化策略是&amp;quot;博采众长&amp;rdquo;。&lt;code>vLLM&lt;/code> 自身不发明新的量化格式，而是选择兼容并蓄，支持和集成了当前学术界和工业界最主流、最前沿的量化方案和工具库。&lt;/p>
&lt;h3 id="41-vllm--">4.1 vLLM 支持的主流 量化方案&lt;/h3>
&lt;p>&lt;code>vLLM&lt;/code> 支持直接加载由以下多种流行算法和工具库量化好的模型：&lt;/p>
&lt;h4 id="411-gptq-generalpurpose-posttraining-quantization">4.1.1 GPTQ (General-purpose Post-Training Quantization)&lt;/h4>
&lt;p>GPTQ 是最早被广泛应用的 LLM PTQ 算法之一。它通过一种逐列量化的方式，并结合 Hessian 矩阵信息来更新权重，以最小化量化误差。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心思想&lt;/strong>：迭代地量化权重的每一列，并更新剩余未量化的权重，以补偿已量化列引入的误差。&lt;/li>
&lt;li>&lt;strong>vLLM 支持&lt;/strong>：可以直接加载由 &lt;code>AutoGPTQ&lt;/code> 等库生成的 GPTQ 量化模型。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：追求较好的 4-bit 量化性能，并且社区有大量预量化好的模型可用。&lt;/li>
&lt;/ul>
&lt;h4 id="412-awq-activationaware-weight-quantization">4.1.2 AWQ (Activation-aware Weight Quantization)&lt;/h4>
&lt;p>AWQ 观察到一个现象：模型中并非所有权重都同等重要，一小部分&amp;quot;显著权重&amp;quot;对模型性能影响巨大。同时，激活值中也存在类似的分布不均。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心思想&lt;/strong>：通过分析激活值的尺度（Scale），识别并保护那些与大激活值相乘的&amp;quot;显著权重&amp;rdquo;，在量化时给予它们更高的精度。它不是去量化激活值，而是让权重去适应激活值的分布。&lt;/li>
&lt;li>&lt;strong>vLLM 支持&lt;/strong>：可以直接加载由 &lt;code>AutoAWQ&lt;/code> 库生成的 AWQ 量化模型。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：在极低比特（如 4-bit）下寻求比 GPTQ 更高的模型精度，尤其是在处理复杂任务时。&lt;/li>
&lt;/ul>
&lt;h4 id="413-fp8-8bit-floating-point">4.1.3 FP8 (8-bit Floating Point)&lt;/h4>
&lt;p>FP8 是最新的低精度浮点格式，由 NVIDIA 等硬件厂商力推。它比传统的 &lt;code>INT8&lt;/code> 具有更宽的动态范围，更适合表示 LLM 中分布极不均匀的激活值。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心思想&lt;/strong>：使用 8-bit 浮点数（通常是 &lt;code>E4M3&lt;/code> 或 &lt;code>E5M2&lt;/code> 格式）来表示权重和/或激活值。&lt;/li>
&lt;li>&lt;strong>vLLM 支持&lt;/strong>：通过集成 &lt;code>llm-compressor&lt;/code> 和 AMD 的 &lt;code>Quark&lt;/code> 库，&lt;code>vLLM&lt;/code> 提供了对 FP8 的强大支持，包括动态量化和静态量化。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：在支持 FP8 加速的现代 GPU（如 H100）上，追求极致的推理速度和吞吐量。&lt;/li>
&lt;/ul>
&lt;h4 id="414-fp8-kv-cache">4.1.4 FP8 KV Cache&lt;/h4>
&lt;p>这是一种专门针对推理过程中内存消耗大户——KV Cache 的量化技术。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心思想&lt;/strong>：将存储在 GPU 显存中的 Key-Value 缓存从 &lt;code>FP16&lt;/code> 或 &lt;code>BF16&lt;/code> 量化到 &lt;code>FP8&lt;/code>，从而将这部分显存占用减半，使得模型可以支持更长的上下文窗口或更大的批量大小。&lt;/li>
&lt;li>&lt;strong>vLLM 支持&lt;/strong>：&lt;code>vLLM&lt;/code> 提供了原生支持，可以在启动时通过参数 &lt;code>--kv-cache-dtype fp8&lt;/code> 开启。&lt;/li>
&lt;/ul>
&lt;h4 id="415-bitsandbytes">4.1.5 BitsAndBytes&lt;/h4>
&lt;p>这是一个非常流行的量化库，以其易用性和&amp;quot;在飞行中&amp;rdquo;（on-the-fly）量化而闻名。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>核心思想&lt;/strong>：在模型加载时动态地进行量化，无需预先准备量化好的模型文件。&lt;/li>
&lt;li>&lt;strong>vLLM 支持&lt;/strong>：&lt;code>vLLM&lt;/code> 集成了 &lt;code>BitsAndBytes&lt;/code>，允许用户通过设置 &lt;code>quantization=&amp;quot;bitsandbytes&amp;quot;&lt;/code> 参数来轻松启用 4-bit 量化。&lt;/li>
&lt;li>&lt;strong>适用场景&lt;/strong>：快速实验、方便易用，不想经历复杂的离线量化流程。&lt;/li>
&lt;/ul>
&lt;h4 id="416-">4.1.6 其他方案&lt;/h4>
&lt;ul>
&lt;li>&lt;strong>SqueezeLLM&lt;/strong>: 一种非均匀量化方法，它认为权重的重要性与数值大小相关，因此对小的权重值使用更少的比特，对大的权重值使用更多的比特。&lt;/li>
&lt;li>&lt;strong>TorchAO&lt;/strong>: PyTorch 官方推出的量化工具库，&lt;code>vLLM&lt;/code> 也开始对其进行支持。&lt;/li>
&lt;li>&lt;strong>BitBLAS&lt;/strong>: 一个底层计算库，旨在通过优化的核函数加速低比特（如 1-bit, 2-bit, 4-bit）的矩阵运算。&lt;/li>
&lt;/ul>
&lt;h3 id="42--vllm-">4.2 如何在 vLLM 中使用量化模型&lt;/h3>
&lt;p>在 &lt;code>vLLM&lt;/code> 中使用量化非常简单，通常只需要在 &lt;code>LLM&lt;/code> 的构造函数中指定 &lt;code>quantization&lt;/code> 参数即可。&lt;code>vLLM&lt;/code> 会自动从模型的配置文件 (&lt;code>config.json&lt;/code>) 中检测量化类型。&lt;/p>
&lt;p>&lt;strong>示例：加载一个 AWQ 量化模型&lt;/strong>&lt;/p>
&lt;pre>&lt;code class="language-python">from vllm import LLM
# vLLM 会自动从 &amp;quot;TheBloke/My-Model-AWQ&amp;quot; 的 config.json 中识别出 awq 量化
llm = LLM(model=&amp;quot;TheBloke/My-Model-AWQ&amp;quot;, quantization=&amp;quot;awq&amp;quot;)
&lt;/code>&lt;/pre>
&lt;p>&lt;strong>示例：启用 FP8 KV Cache&lt;/strong>&lt;/p>
&lt;pre>&lt;code class="language-python">from vllm import LLM
llm = LLM(model=&amp;quot;meta-llama/Llama-2-7b-chat-hf&amp;quot;,
kv_cache_dtype=&amp;quot;fp8&amp;quot;)
&lt;/code>&lt;/pre>
&lt;h2 id="5-llamacpp-vs-vllm">5. llama.cpp vs. vLLM：对比与总结&lt;/h2>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th align="left">特性&lt;/th>
&lt;th align="left">llama.cpp&lt;/th>
&lt;th align="left">vLLM&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td align="left">&lt;strong>目标平台&lt;/strong>&lt;/td>
&lt;td align="left">CPU, 跨平台, 边缘设备&lt;/td>
&lt;td align="left">高性能 GPU 服务器&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">&lt;strong>核心理念&lt;/strong>&lt;/td>
&lt;td align="left">内聚、自成一体、极致优化&lt;/td>
&lt;td align="left">开放、集成、高吞吐量&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">&lt;strong>文件格式&lt;/strong>&lt;/td>
&lt;td align="left">GGUF (自定义格式)&lt;/td>
&lt;td align="left">标准 Hugging Face 格式&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">&lt;strong>量化方案&lt;/strong>&lt;/td>
&lt;td align="left">内建 &lt;code>K-Quants&lt;/code>, &lt;code>IQ&lt;/code> 等&lt;/td>
&lt;td align="left">集成 GPTQ, AWQ, FP8, BnB 等&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">&lt;strong>易用性&lt;/strong>&lt;/td>
&lt;td align="left">需使用 &lt;code>llama-quantize&lt;/code> 转换&lt;/td>
&lt;td align="left">直接加载，自动检测&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">&lt;strong>生态系统&lt;/strong>&lt;/td>
&lt;td align="left">自身生态闭环&lt;/td>
&lt;td align="left">拥抱整个 Python AI 生态&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td align="left">&lt;strong>最新技术&lt;/strong>&lt;/td>
&lt;td align="left">快速跟进并实现自己的版本&lt;/td>
&lt;td align="left">快速集成业界最新开源库&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="6-">6. 最新量化趋势与展望&lt;/h2>
&lt;p>模型量化领域仍在飞速发展，以下是一些值得关注的趋势：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>1-bit/二值化网络 (BNNs)&lt;/strong>: 终极的模型压缩，将权重限制为 +1 或 -1。虽然目前在 LLM 上精度损失较大，但其潜力巨大，相关研究层出不穷。&lt;/li>
&lt;li>&lt;strong>非均匀量化&lt;/strong>: 如 SqueezeLLM，根据数据分布动态分配比特数，理论上比均匀量化更优。&lt;/li>
&lt;li>&lt;strong>硬件与算法协同设计&lt;/strong>: 新的硬件（如 FP8, FP4, INT4 支持）正在推动新的量化算法发展，而新的算法也在引导未来硬件的设计。&lt;/li>
&lt;li>&lt;strong>量化与稀疏化结合&lt;/strong>: 将量化与剪枝（Pruning）等稀疏化技术结合，有望实现更高倍率的模型压缩。&lt;/li>
&lt;/ul>
&lt;h2 id="7-">7. 结论&lt;/h2>
&lt;p>模型量化是应对大模型时代挑战的关键技术。&lt;code>llama.cpp&lt;/code> 和 &lt;code>vLLM&lt;/code> 代表了两种不同的量化哲学：&lt;code>llama.cpp&lt;/code> 通过其精巧的 GGUF 格式和内建的 K-Quants，为资源受限的设备提供了极致的本地推理性能；而 &lt;code>vLLM&lt;/code> 则通过其开放的生态和对多种前沿量化方案的集成，成为了 GPU 云端推理服务的王者。&lt;/p>
&lt;p>理解这两种框架的量化实现，不仅能帮助我们根据具体场景选择合适的工具，更能让我们洞察整个 LLM 推理优化领域的发展脉络和未来方向。&lt;/p></description></item><item><title>Llama.cpp 技术详解：轻量级大模型推理引擎</title><link>https://ziyanglin.netlify.app/zh/post/llama-cpp-documentation/</link><pubDate>Thu, 26 Jun 2025 01:06:00 +0000</pubDate><guid>https://ziyanglin.netlify.app/zh/post/llama-cpp-documentation/</guid><description>&lt;h2 id="1-">1. 引言&lt;/h2>
&lt;p>Llama.cpp 是一个用 C/C++ 编写的高性能、轻量级的大型语言模型 (LLM) 推理框架。它专注于在消费级硬件上高效运行 LLM，实现了在普通笔记本电脑甚至手机上进行本地推理的可能。&lt;/p>
&lt;p>&lt;strong>核心优势:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>高性能:&lt;/strong> 通过优化的 C/C++ 代码、量化技术和硬件加速支持（如 Apple Metal, CUDA, OpenCL, SYCL），实现了极快的推理速度。&lt;/li>
&lt;li>&lt;strong>轻量级:&lt;/strong> 极低的内存和计算资源消耗，无需昂贵的 GPU 即可运行。&lt;/li>
&lt;li>&lt;strong>跨平台:&lt;/strong> 支持 macOS, Linux, Windows, Docker, Android, 和 iOS 等多种平台。&lt;/li>
&lt;li>&lt;strong>开放生态:&lt;/strong> 拥有活跃的社区和丰富的生态系统，包括 Python 绑定、UI 工具和与 OpenAI 兼容的服务器。&lt;/li>
&lt;li>&lt;strong>持续创新:&lt;/strong> 快速跟进并实现最新的模型架构和推理优化技术。&lt;/li>
&lt;/ul>
&lt;h2 id="2-">2. 核心概念&lt;/h2>
&lt;h3 id="21-gguf-">2.1. GGUF 模型格式&lt;/h3>
&lt;p>GGUF (Georgi Gerganov Universal Format) 是 &lt;code>llama.cpp&lt;/code> 使用的核心模型文件格式，是其前身 GGML 的演进版本。GGUF 是一个专为快速加载和内存映射设计的二进制格式。&lt;/p>
&lt;p>&lt;strong>主要特点:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>统一文件:&lt;/strong> 将模型元数据、词汇表和所有张量（权重）打包在单个文件中。&lt;/li>
&lt;li>&lt;strong>可扩展性:&lt;/strong> 允许在不破坏兼容性的情况下添加新的元数据。&lt;/li>
&lt;li>&lt;strong>向后兼容:&lt;/strong> 保证了对旧版本 GGUF 模型的兼容。&lt;/li>
&lt;li>&lt;strong>内存效率:&lt;/strong> 支持内存映射（mmap），允许多个进程共享同一模型权重，从而节省内存。&lt;/li>
&lt;/ul>
&lt;h3 id="22--quantization">2.2. 量化 (Quantization)&lt;/h3>
&lt;p>量化是 &lt;code>llama.cpp&lt;/code> 的核心优势之一。它是一种将模型权重从高精度浮点数（如 32 位或 16 位）转换为低精度整数（如 4 位、5 位或 8 位）的技术。&lt;/p>
&lt;p>&lt;strong>主要优势:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>减小模型体积:&lt;/strong> 显著降低模型文件的大小，使其更易于分发和存储。&lt;/li>
&lt;li>&lt;strong>降低内存占用:&lt;/strong> 减少了模型加载到内存中所需的 RAM。&lt;/li>
&lt;li>&lt;strong>加速推理:&lt;/strong> 低精度计算通常比高精度计算更快，尤其是在 CPU 上。&lt;/li>
&lt;/ul>
&lt;p>&lt;code>llama.cpp&lt;/code> 支持多种量化方法，特别是 &lt;strong>k-quants&lt;/strong>，这是一种先进的量化技术，能够在保持较高模型性能的同时实现极高的压缩率。&lt;/p>
&lt;h3 id="23-">2.3. 多模态支持&lt;/h3>
&lt;p>&lt;code>llama.cpp&lt;/code> 不仅仅局限于文本模型，它已经发展成为一个强大的多模态推理引擎，支持同时处理文本、图像甚至音频。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>支持的模型:&lt;/strong> 支持如 LLaVA, MobileVLM, Granite, Qwen2.5 Omni, InternVL, SmolVLM 等多种主流多模态模型。&lt;/li>
&lt;li>&lt;strong>工作原理:&lt;/strong> 通常通过一个视觉编码器（如 CLIP）将图像转换为嵌入向量，然后将这些向量与文本嵌入向量一起输入到 LLM 中。&lt;/li>
&lt;li>&lt;strong>使用工具:&lt;/strong> &lt;code>llama-mtmd-cli&lt;/code> 和 &lt;code>llama-server&lt;/code> 提供了对多模态模型的原生支持。&lt;/li>
&lt;/ul>
&lt;h2 id="3-">3. 使用方法&lt;/h2>
&lt;h3 id="31-">3.1. 编译&lt;/h3>
&lt;p>从源码编译 &lt;code>llama.cpp&lt;/code> 非常简单。&lt;/p>
&lt;pre>&lt;code class="language-bash">git clone https://github.com/ggml-org/llama.cpp.git
cd llama.cpp
make
&lt;/code>&lt;/pre>
&lt;p>对于特定硬件加速（如 CUDA 或 Metal），需要使用相应的编译选项：&lt;/p>
&lt;pre>&lt;code class="language-bash"># For CUDA
make LLAMA_CUDA=1
# For Metal (on macOS)
make LLAMA_METAL=1
&lt;/code>&lt;/pre>
&lt;h3 id="32-">3.2. 基本推理&lt;/h3>
&lt;p>编译后，可以使用 &lt;code>llama-cli&lt;/code> 工具进行推理。&lt;/p>
&lt;pre>&lt;code class="language-bash">./llama-cli -m ./models/7B/ggml-model-q4_0.gguf -p &amp;quot;Building a website can be done in 10 simple steps:&amp;quot; -n 400
&lt;/code>&lt;/pre>
&lt;ul>
&lt;li>&lt;code>-m&lt;/code>: 指定 GGUF 模型文件的路径。&lt;/li>
&lt;li>&lt;code>-p&lt;/code>: 指定提示（prompt）。&lt;/li>
&lt;li>&lt;code>-n&lt;/code>: 指定要生成的最大 token 数量。&lt;/li>
&lt;/ul>
&lt;h3 id="33-openai-">3.3. OpenAI 兼容服务器&lt;/h3>
&lt;p>&lt;code>llama.cpp&lt;/code> 提供了一个内置的 HTTP 服务器，其 API 与 OpenAI 的 API 兼容。这使得它可以轻松地与 LangChain, LlamaIndex 等现有工具集成。&lt;/p>
&lt;p>启动服务器：&lt;/p>
&lt;pre>&lt;code class="language-bash">./llama-server -m models/7B/ggml-model-q4_0.gguf -c 4096
&lt;/code>&lt;/pre>
&lt;p>然后，你可以像调用 OpenAI API 一样向 &lt;code>http://localhost:8080/v1/chat/completions&lt;/code> 发送请求。&lt;/p>
&lt;h2 id="4-">4. 高级功能&lt;/h2>
&lt;h3 id="41--speculative-decoding">4.1. 投机性解码 (Speculative Decoding)&lt;/h3>
&lt;p>这是一种先进的推理优化技术，通过使用一个小的&amp;quot;草稿&amp;quot;模型来预测主模型的输出，从而显著加速生成速度。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>工作原理:&lt;/strong> 草稿模型快速生成一个 token 序列草稿，然后由主模型一次性验证整个序列。如果验证通过，就可以节省逐个生成 token 的时间。&lt;/li>
&lt;li>&lt;strong>使用方法:&lt;/strong> 在 &lt;code>llama-cli&lt;/code> 或 &lt;code>llama-server&lt;/code> 中使用 &lt;code>--draft-model&lt;/code> 参数指定一个小的、快速的草稿模型。&lt;/li>
&lt;/ul>
&lt;h3 id="42-lora-">4.2. LoRA 支持&lt;/h3>
&lt;p>LoRA (Low-Rank Adaptation) 允许在不修改原始模型权重的情况下，通过训练一个小的适配器来微调模型的行为。&lt;code>llama.cpp&lt;/code> 支持在推理时加载一个或多个 LoRA 适配器。&lt;/p>
&lt;pre>&lt;code class="language-bash">./llama-cli -m base-model.gguf --lora lora-adapter.gguf
&lt;/code>&lt;/pre>
&lt;p>甚至可以为不同的 LoRA 适配器设置不同的权重：&lt;/p>
&lt;pre>&lt;code class="language-bash">./llama-cli -m base.gguf --lora-scaled lora_A.gguf 0.5 --lora-scaled lora_B.gguf 0.5
&lt;/code>&lt;/pre>
&lt;h3 id="43--grammars">4.3. 文法约束 (Grammars)&lt;/h3>
&lt;p>文法约束是一个非常强大的功能，它允许你强制模型的输出遵循特定的格式，例如严格的 JSON 模式。&lt;/p>
&lt;ul>
&lt;li>&lt;strong>格式:&lt;/strong> 使用一种名为 GBNF (GGML BNF) 的格式来定义语法规则。&lt;/li>
&lt;li>&lt;strong>应用:&lt;/strong> 在 API 请求中通过 &lt;code>grammar&lt;/code> 参数提供 GBNF 规则，可以确保模型返回格式正确、可直接解析的 JSON 数据，避免了输出格式错误和繁琐的后处理。&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>示例：&lt;/strong> 使用 Pydantic 模型生成 JSON Schema，然后转换为 GBNF，以确保模型输出符合预期的 Python 对象结构。&lt;/p>
&lt;pre>&lt;code class="language-python">import json
from typing import List
from pydantic import BaseModel
class QAPair(BaseModel):
question: str
answer: str
class Summary(BaseModel):
key_facts: List[str]
qa_pairs: List[QAPair]
# 生成 JSON Schema 并打印
schema = Summary.model_json_schema()
print(json.dumps(schema, indent=2))
&lt;/code>&lt;/pre>
&lt;h2 id="5-">5. 生态系统&lt;/h2>
&lt;p>&lt;code>llama.cpp&lt;/code> 的成功催生了一个充满活力的生态系统：&lt;/p>
&lt;ul>
&lt;li>&lt;strong>&lt;a href="https://github.com/abetlen/llama-cpp-python">llama-cpp-python&lt;/a>:&lt;/strong> 最流行的 Python 绑定，提供了与 &lt;code>llama.cpp&lt;/code> 几乎所有功能的接口，并与 LangChain、LlamaIndex 等框架深度集成。&lt;/li>
&lt;li>&lt;strong>&lt;a href="https://ollama.com/">Ollama&lt;/a>:&lt;/strong> 一个将模型打包、分发和运行的工具，底层使用了 &lt;code>llama.cpp&lt;/code>，极大地简化了在本地运行 LLM 的流程。&lt;/li>
&lt;li>&lt;strong>众多 UI 工具:&lt;/strong> 社区开发了大量的图形界面工具，让非技术用户也能轻松地与本地模型进行交互。&lt;/li>
&lt;/ul>
&lt;h2 id="6-">6. 总结&lt;/h2>
&lt;p>&lt;code>llama.cpp&lt;/code> 不仅仅是一个推理引擎，它已经成为推动 LLM 本地化和大众化的关键力量。通过其卓越的性能、对资源的高度优化以及不断扩展的功能集（如多模态、文法约束），&lt;code>llama.cpp&lt;/code> 为开发者和研究人员提供了一个强大而灵活的平台，让他们能够在各种设备上探索和部署 AI 应用，开启了低成本、保护隐私的本地 AI 新时代。&lt;/p></description></item></channel></rss>