你已了解,大型语言模型(LLM)会非常大。它们的规模由数十亿参数决定,通常需要大量计算资源,尤其是内存(RAM)和潜在的显存(GPU内存),这在第2章中已讨论。一个拥有数十亿参数的模型仅加载就需要几十甚至数百GB的存储空间,这超出了许多标准电脑的容量。这就是量化的作用。这是一种在模型训练后,通过减小其尺寸来让大型模型更易于管理的方法。把它想象成将一张高分辨率照片保存为占用空间较小的格式,或许通过稍微减少使用的颜色数量。整体图像基本不变,但文件大小会大幅缩小。量化如何进行?LLM主要通过数字存储信息并进行计算。这些数字,通常被称为权重或参数,通常使用高精度,例如32位浮点数($FP32$)。这种格式可以高精度地表示非常宽范围的数值。量化通过降低这些数字的精度来实现。量化不是使用32位存储每个权重,而是将其转换为使用更少的位数。常见的低精度格式有:16位浮点数($FP16$ 或 $BF16$): 使用$FP32$一半的位数。这会立即将模型大小大致减半。8位整数($INT8$): 仅使用8位,将大小减少到原始$FP32$大小的约四分之一。4位整数($INT4$): 一种更激进的量化,每个权重仅使用4位,可能将模型大小减少到原始大小的15-20%以下。设想你有一个测量值,例如 $12.3456789$。$FP32$ 可能存储这个完整的值。$FP16$ 可能将其存储为 $12.345$,而 $INT8$ 可能将其近似为 $12$。每一步都会减少存储数字所需的“信息”,从而减小整体模型大小。{"layout": {"title": "量化对模型大小的影响", "xaxis": {"title": "量化类型"}, "yaxis": {"title": "近似相对大小 (%)", "range": [0, 110]}, "bargap": 0.2}, "data": [{"type": "bar", "x": ["FP32 (原始)", "FP16", "INT8", "INT4"], "y": [100, 50, 25, 15], "marker": {"color": ["#4263eb", "#748ffc", "#a5d8ff", "#d0bfff"], "line": {"width": 0}}, "text": ["100%", "约50%", "约25%", "约15%"], "textposition": "outside"}]}与原始32位浮点数(FP32)版本相比,通过不同量化技术实现的模型文件大小近似缩减。实际大小可能因所用具体方法而略有不同。为什么使用量化模型?使用量化模型对在本地运行LLM有重要好处:降低内存要求: 这是主要优点。更小的模型加载和运行所需的内存(或使用GPU时的显存)更少。在其原始$FP32$形式下对系统来说过大的模型,量化到$INT8$或$INT4$后可能会变得完全可用。更小的磁盘占用: 量化模型在硬盘或固态硬盘上占用的存储空间更少,使下载和存储多个模型更加可行。更快的推理速度: 使用低精度数字(尤其是像$INT8$或$INT4$这样的整数)的计算通常可以由CPU或GPU更快地执行。这意味着模型可以更快地生成文本,带来更灵敏的交互。权衡:精度与性能降低精度并非完全没有代价。使用近似值意味着会丢失一些原始的数值细节。这可能导致模型性能略有下降——它遵循复杂指令、准确推理或生成高度连贯文本的能力可能会受到轻微影响。然而,现代量化技术相当精密。它们旨在最大限度地减少这种质量损失。对于许多常见任务,原始$FP32$模型与良好量化的$INT8$甚至$INT4$版本之间的输出差异可能微乎其微,特别是与在可用性和速度方面获得的显著提升相比。影响通常取决于具体的模型架构和所用的量化方法。识别量化模型浏览模型时,尤其是在GGUF等格式中(我们之前讨论过),你会经常发现明确标明量化级别的版本。寻找以下标签或名称:Q4_K_M:表示4位量化级别,带有关于所用方法(K_M)的具体细节。Q5_K_S:一个5位量化级别。Q8_0:一个8位量化级别。F16:一个16位浮点版本。这些标签可帮助你选择一个在性能和资源使用之间为你的特定硬件取得平衡的版本。通常,较低的数字(如Q4)意味着更小的尺寸和潜在更快的速度,但与较高的数字(如Q8或F16)相比,质量略有下降的可能性也更大。总而言之,量化是一种实用且广泛使用的方法,用于压缩大型语言模型,使其更轻、更快,并且更易于在消费级硬件上运行。它涉及降低模型参数的数值精度,以牺牲少量精确度换取尺寸和速度上的显著节省。选择第一个模型时,考虑量化版本通常对于在本地机器上顺利开始是必不可少的。