对当前大型语言模型 (LLM) 的每一个参数进行微调——这类模型通常包含数百亿甚至数千亿参数——带来了显著的实际障碍。完整微调需要大量的计算资源、庞大的内存占用和可观的训练时间,这通常将其应用范围限制在拥有大规模 GPU 集群的组织。参数高效微调 (PEFT) 方法通过仅修改模型参数的一小部分,直接应对了这些局限,提供了一种更节省资源的模型适配方式。完整参数更新的高昂代价理解与完整微调相关的成本有助于阐明 PEFT 的动因。内存需求: 训练期间所需的内存远不止存储模型权重 ($W$)。主要占用者包括:优化器状态: 像 Adam 这样的现代优化器为每个可训练参数维护辅助变量。例如,Adam 通常存储第一 ($m$) 和第二 ($v$) 矩估计,这实际使需要更新的参数的内存需求增加了一倍。对于一个拥有 $P$ 个参数的模型,这会额外增加与 $2 \times P$ 成比例的内存。梯度: 在反向传播过程中,必须为每个可训练参数计算并存储梯度 ($\nabla W$),这会额外增加与 $P$ 成比例的内存。激活值: 前向传播过程中计算出的中间激活值通常需要存储,以便在反向传播中进行梯度计算。其大小取决于批处理大小、序列长度和模型架构。虽然像激活检查点这样的技术可以减少这部分内存,但它仍然是一个重要因素,特别是对于大型模型和长上下文。当 $P$ 代表数十亿参数时,权重、优化器状态、梯度和激活值所需的总内存可以轻易超出单个 GPU 甚至多 GPU 服务器的容量,因此需要分布式训练设置。计算负担 (FLOPs): 前向传播计算对于完整微调和推理是相似的。然而,反向传播中梯度计算涉及的操作与可训练参数的数量成比例。更新所有 $P$ 个参数需要在整个网络中计算梯度,这是一个计算密集型过程。存储开销: 也许实际部署中最具限制性的方面是存储。如果需要适配一个基础 LLM(例如,700 亿参数,半精度下约需 140GB)到多个不同任务或应用场景(例如,客户支持、法律文档分析、医疗转录),完整微调会导致每个任务都有模型的 独立、完整副本。存储数十或数百个这样的大模型很快就会变得难以管理且成本高昂。{"data": [{"type": "bar", "x": ["基础模型权重", "优化器状态 (Adam)", "梯度", "激活值 (可变)"], "y": [1.0, 2.0, 1.0, 0.5], "marker": {"color": ["#495057", "#f03e3e", "#f76707", "#1c7ed6"]}, "name": "相对内存使用量"}], "layout": {"title": {"text": "完整微调中的内存组成(相对比例)", "font": {"size": 14}}, "yaxis": {"title": {"text": "内存使用量(相对于模型权重)", "font": {"size": 12}}}, "xaxis": {"title": {"text": "组成部分", "font": {"size": 12}}}, "bargap": 0.3, "height": 350, "width": 550, "margin": {"l": 60, "r": 20, "t": 40, "b": 40}}}完整微调期间的近似相对内存使用量,与模型权重本身大小的比较。优化器状态通常占主导地位,其次是梯度和激活值。高效性带来的益处PEFT 方法通过仅更新总参数的一小部分(通常小于 1%),大幅缓解了这些成本,带来了多项直接好处:减少内存占用: 由于梯度和优化器状态仅需针对少量可训练的 PEFT 参数,基础模型权重的内存开销大幅减少。这使得在普通硬件或单个多 GPU 服务器上微调大型模型成为可能,而完整微调在此类环境下是不可能的。QLoRA 将 PEFT 与量化结合,进一步增强了这一优势。训练更快: 需要更新的参数更少,意味着反向传播中需要计算的梯度更少,从而带来更快的训练迭代速度。尽管前向传播时间保持相似(因为基础模型仍在使用),反向传播时间和优化器步骤的减少,明显加快了整体微调过程。计算需求降低: 梯度计算量的减少直接转化为每训练步骤所需更少的 FLOPs,从而降低了总体的能耗和计算成本。高效的任务专用化(存储节省): 这是一个重要的实际优势。您无需为每个任务保存整个包含数十亿参数的模型,只需存储尺寸小得多的 PEFT 参数集(例如,LoRA 矩阵、适配器权重)。大型基础模型只需存储一次,并可在所有任务中共享。适配新任务仅涉及训练和存储这些轻量级修改,其大小通常以兆字节而非千兆字节衡量。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fontsize=10]; edge [color="#868e96", fontsize=9]; splines=true; Base [label="基础 LLM\n(例如,700 亿参数,140GB)", width=2.5]; TaskA_Full [label="任务 A 模型\n(完整微调)\n约 140GB", color="#f03e3e", fontcolor="#f03e3e", width=2]; TaskB_Full [label="任务 B 模型\n(完整微调)\n约 140GB", color="#f03e3e", fontcolor="#f03e3e", width=2]; TaskA_PEFT [label="任务 A 适配器\n(PEFT)\n约 50MB", color="#1c7ed6", fontcolor="#1c7ed6", width=2]; TaskB_PEFT [label="任务 B 适配器\n(PEFT)\n约 50MB", color="#1c7ed6", fontcolor="#1c7ed6", width=2]; {rank=same; TaskA_Full; TaskB_Full;} {rank=same; TaskA_PEFT; TaskB_PEFT;} subgraph cluster_full { label = "完整微调存储"; color="#f03e3e"; style=dashed; fontname="sans-serif"; fontsize=11; TaskA_Full; TaskB_Full; } subgraph cluster_peft { label = "PEFT 存储"; color="#1c7ed6"; style=dashed; fontname="sans-serif"; fontsize=11; Base; TaskA_PEFT; TaskB_PEFT; } Base -> TaskA_PEFT [label="共享\n权重"]; Base -> TaskB_PEFT [label="共享\n权重"]; }将基础 LLM 适配到两个不同任务时,使用完整微调和 PEFT 的存储需求比较。PEFT 只需存储一次基础模型,外加小的、针对特定任务的适配器权重。减轻灾难性遗忘: 虽然存在专门的技术(第五章会讨论),但冻结基础模型的绝大部分参数本质上有助于保留预训练期间学到的通用知识。相比之下,完整微调则有显著改变这些参数的风险,可能导致模型在之前能处理的任务上性能下降。实质上,参数高效性使得大型、强大的语言模型的适配变得实用且可扩展。它降低了为特定需求定制这些模型的门槛,无需大量计算基础设施,从而促进了广泛应用和专业化实践。接下来的章节将详细说明不同的 PEFT 技术 如何 实现这种高效性。