趋近智
大师班
“正如我们之前谈到的,成功训练大型语言模型常常会产生包含数十亿甚至数万亿参数的模型。虽然这些大模型展现出强大的能力,但其庞大的规模在从实验室或训练集群转向实际应用时,会带来不少实际困难。模型压缩的必要性直接源于这些挑战,主要集中在内存需求、推理时的计算负担以及相关的运营成本。”
考虑一个拥有70亿参数的模型。如果每个参数都使用标准的32位浮点精度(FP32)存储,每个参数占用4字节,那么仅仅加载模型权重所需的内存就非常可观:
内存占用=参数数量×每参数字节数 内存占用=7×109 参数×4 字节/参数=28×109 字节=28 GB这个28 GB的计算仅考虑了模型权重本身。在推理时,还需要额外的内存用于激活、临时计算以及键值(KV)缓存(我们将在第28章谈到它),尤其是在处理长序列或批量处理多个请求时。高端GPU通常配备24 GB、40 GB或80 GB的高带宽内存(HBM),但即使是这些对于最大的模型或有效提供多个模型副本也可能不足。需要这种高内存硬件会大幅增加部署成本,并限制模型可以在哪些类型的设备上运行。
import torch
import torch.nn as nn
# 示例:大型线性层维度
hidden_dim = 4096
intermediate_dim = 11008 # 在约70亿参数模型中很常见
# 仅一个前馈块的线性层中的参数
ffn_layer1 = nn.Linear(hidden_dim, intermediate_dim, bias=False)
ffn_layer2 = nn.Linear(intermediate_dim, hidden_dim, bias=False)
params_ffn1 = hidden_dim * intermediate_dim
params_ffn2 = intermediate_dim * hidden_dim
total_ffn_params = params_ffn1 + params_ffn2
# 一个典型的约70亿参数模型有许多这样的层(约32个),外加注意力机制、嵌入层等...
print(f"一个FFN块中的参数(约):{total_ffn_params:,}")
# 输出:一个FFN块中的参数(约):90,177,536
# 估算这些参数在FP32下的内存
memory_ffn_gb = (total_ffn_params * 4) / (1024**3)
print(f"一个FFN块所需的内存(FP32,约):{memory_ffn_gb:.2f} GB")
# 输出:一个FFN块所需的内存(FP32,约):0.34 GB
# 乘以层数(约32)-> 仅FFN权重就约10.8 GB!
这个简单的计算表明,内存需求增长得多么迅速,甚至还没有考虑注意力机制和嵌入表。
估算不同模型大小在32位精度下仅存储模型权重所需的内存。
除了内存,通过这些大型网络进行一次前向传播的计算成本也很高。自回归生成是大型语言模型生成文本的常见方式,它需要模型为每个生成的token顺序运行。尽管像KV缓存(第28章)这样的技术有所帮助,但每个token所需的矩阵乘法和其他操作数量之多,给延迟设定了下限。
对于聊天机器人、编码助手或实时翻译等交互式应用,高延迟会导致糟糕的用户体验。即使是文档摘要等离线任务,缓慢的推理速度也会增加处理大型数据集所需的时间。此外,每个请求的高延迟会限制部署的总体吞吐量(每秒处理的请求数),需要更多的并行硬件实例来处理给定的负载,这又会推高成本。
高内存需求和巨大的计算负担结合在一起,直接转化为更高的运营开支:
这些因素设置了障碍,使得在某些情境下部署先进的大型语言模型变得困难或不可能:
模型压缩技术提供了一种缓解这些挑战的途径。通过减少内存占用和计算需求,我们可以:
接下来的章节将探讨实现这些目标的主要方法:量化、剪枝和知识蒸馏。每种技术都涉及权衡,通常是用一定程度的模型性能换取效率上的大幅提升。理解这些方法及其影响,对于任何负责将大型语言模型投入生产的工程师来说都很重要。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造