大型语言模型在许多自然语言任务中表现优异,但其高效性也伴随着一定的代价。像ChatGPT或Llama这样的模型可能包含数十亿,甚至数百亿的参数。在推理(即从训练好的模型生成输出的过程)过程中存储这些参数并进行计算,需要大量的计算资源。量化正是为了应对这些资源需求。减少内存占用量化最直接的好处也许是模型尺寸的大幅缩小。LLM的参数,主要是其神经网络层中的权重,通常使用32位浮点数($FP32$)或有时16位浮点数($FP16$或$BF16$)存储。量化将这些高精度表示替换为低精度数据类型,最常见的是8位整数($INT8$),甚至4位整数($INT4$)。来看看直接的影响:FP32 (32位 / 4字节): 标准精度。FP16 (16位 / 2字节): 半精度,与FP32相比,大小已减少2倍。INT8 (8位 / 1字节): 与FP32相比,大小减少4倍,或与FP16相比减少2倍。INT4 (4位 / 0.5字节): 与FP32相比,大小减少8倍,或与FP16相比减少4倍。一个包含70亿参数的大型模型,若以$FP32$存储,仅权重部分就大约需要$7 \times 4 = 28$ GB的存储空间。将此模型量化为$INT8$可将存储需求降至约7 GB,而$INT4$则大致降至3.5 GB。这种减少使得以下情况成为可能:存储更大的模型: 将原本过大的模型存入可用磁盘空间或内存中。更快地加载模型: 需要从存储器读取到内存的数据量更少。量化也能减少激活值所需的内存。激活值是推理过程中计算出的层级中间输出。在静态后训练量化或量化感知训练(我们稍后会讲到)等技术中,激活值也可以用低精度整数来表示。这降低了运行时内存使用(RAM或VRAM),而这通常是一个重要的瓶颈。加快推理速度降低数字精度不仅节省空间,还能加快计算速度。现代硬件,包括CPU和GPU,通常具有专门的指令,与浮点运算相比,这些指令在使用低精度整数(特别是INT8)时,能更快地执行算术运算(如对LLM很重要的矩阵乘法)。此外,推理速度不仅仅是原始计算能力的问题;它也受到内存带宽的很大影响,即数据在处理器和内存之间传输的速率。LLM会处理大量数据(权重和激活值)。通过量化减少这些数据的大小,可以实现:更少的数据传输: 从RAM/VRAM传输到计算单元(例如GPU核心)的字节数更少。更好的缓存利用率: 更小的数据类型增加了所需数据已存在于更快缓存内存中的可能性。算术运算的加速与内存带宽瓶颈的减少相结合,带来了更低的推理延迟(更快的响应时间)和更高的吞吐量(每秒更多的推理次数)。{"layout": {"title": "量化的影响", "xaxis": {"title": "位精度"}, "yaxis": {"title": "模型大小(相对)", "range": [0, 1.1], "titlefont": {"color": "#1c7ed6"}, "tickfont": {"color": "#1c7ed6"}}, "yaxis2": {"title": "推理速度(相对)", "range": [0, 4.5], "overlaying": "y", "side": "right", "titlefont": {"color": "#f76707"}, "tickfont": {"color": "#f76707"}}, "legend": {"yanchor": "bottom", "y": 0.01, "xanchor": "right", "x": 0.99}, "autosize": true, "height": 400}, "data": [{"x": ["FP32", "FP16", "INT8", "INT4"], "y": [1.0, 0.5, 0.25, 0.125], "type": "bar", "name": "模型大小", "marker": {"color": "#4263eb"}}, {"x": ["FP32", "FP16", "INT8", "INT4"], "y": [1.0, 1.5, 2.5, 3.5], "type": "scatter", "mode": "lines+markers", "name": "推理速度", "yaxis": "y2", "line": {"color": "#fd7e14"}, "marker": {"color": "#f76707"}}, {"x": ["FP32", "FP16", "INT8", "INT4"], "y": [1.05, 1.05, 1.05, 1.05], "type": "scatter", "mode": "text", "text": ["", "", "潜在", "准确性"], "textfont": {"color": "#f03e3e", "size": 10}, "showlegend": false}, {"x": ["FP32", "FP16", "INT8", "INT4"], "y": [1.0, 1.0, 1.0, 1.0], "type": "scatter", "mode": "text", "text": ["", "", "准确性", "影响"], "textfont": {"color": "#f03e3e", "size": 10}, "showlegend": false}]}位精度、模型大小和推理速度之间的关系。更低的精度能大幅降低模型大小并提高速度,但激进的量化(如INT4)可能会影响模型准确性。降低能耗更快的推理和更少的数据移动也带来了更低的功耗。从内存中获取数据和执行复杂的浮点计算都是耗能的操作。使用低精度整数简化了计算并最大限度地减少了数据传输,使得量化模型更节能。这对于以下情况尤为重要:电池供电设备: 延长运行LLM的移动或边缘设备的运行时间。大规模部署: 降低服务LLM推理的数据中心的电力成本和环境影响。使其能在资源受限设备上部署更小的尺寸、更快的速度和更低的能耗这些综合优势,使得LLM可以在以前不切实际的环境中部署。这包括:手机: 直接在设备上运行复杂的语言功能。消费级硬件: 在标准笔记本电脑或台式机上使用LLM,无需昂贵的高端GPU。边缘设备: 在物联网设备、汽车或具有有限内存和处理能力的专用硬件中部署模型。总而言之,量化不仅仅是一种优化技术;它通常是使LLM实用且易于使用的必需手段。通过大幅减少内存需求、提高推理速度和降低能耗,量化使得这些强大的模型能够在更广泛的硬件和应用中部署。接下来的部分将详细说明通过各种量化方法如何实现这些减少。