GPT-3、PaLM 和 Bloom 等大型语言模型 (LLM) 在生成类人文本方面表现出了令人印象深刻的能力。然而,它们的巨大规模和数千亿个参数使得其运行计算成本高昂,阻碍了它们的普及,高昂的费用也让拥有大量计算资源的大型科技公司却步。
最近的研究强调了稀疏微调解决这一挑战的潜力。在特定任务的训练期间,稀疏微调有选择地修剪模型中不太重要的连接。这会导致权重稀疏,从而使模型能够以最小的精度损失运行得更快。
在本文中,将深入探讨这项有前途的技术的细节并讨论其原理。
关键词:大型语言模型、GPT-3、PaLM、Bloom、稀疏微调、基于 Transformer 的模型、自监督、BERT、计算成本、稀疏权重、预训练、微调、稀疏性、结构化剪枝、冗余、专业化、重新训练、自回归语言建模、掩码语言建模、结构化稀疏性、蒸馏损失、硬件感知剪枝。
LLMs高昂成本的训练成本
GPT-3 等基于 Transformer 的模型以自我监督的方式对大量文本数据进行训练。通过让他们接触语言中的统计模式和关系,他们可以学习强大的表征,从而很好地转移到下游 NLP 任务。
然而,随着规模的扩大,它们的能力显着提高。例如,
GPT-3
拥有1750
亿个参数,比BERT
等之前的模型大几个数量级。但这种缩放需要付出巨大的计算成本。训练和运行如此庞大的模型需要专门的硬件,例如只有少数组织可以访问的多 GPU 服务器。研究人员估计,像GPT-3
这样的模型的训练成本将达到460 万
至1200 万
美元!即使经过培训,为搜索、聊天机器人和内容生成等应用部署LLMs仍然很昂贵。它们的内存占用和计算要求突破了现代硬件的限制。
显然,减轻这种计算负担的技术可以大大提高 LLMs 的生存能力,这就是稀疏微调的用武之地。
稀疏微调的概念
如今,大多数大语言模型首先以自我监督的方式在通用语料库上进行预训练。然后,这种预训练模型在特定于任务的数据集上进行微调,以使其专门用于下游应用程序。
例如,可以根据网络文本对模型进行预训练,然后根据客户支持日志进行微调以创建聊天机器人。或者可以在科学论文上对其进行微调,以回答特定领域的问题。
稀疏微调在第二阶段将稀疏性引入到模型权重中。稀疏性是指参数值为零,不需要任何计算。权重以结构化方式修剪,将某些块或行/列设置为零,而不是随机删除各个权重。这保持了可以有效利用的常规稀疏模式。
理想情况下,可以在对模型精度影响最小的情况下引入高稀疏性(例如 75-90%
)。由此产生的稀疏模型需要更少的计算,从而实现更快、更高效的推理。
为什么稀疏微调有帮助
稀疏微调可以有效压缩 LLM 有以下几个原因:
- 大型模型中的冗余:大型模型具有许多非必要参数的显着冗余。结构化修剪系统地消除了这些冗余。
- 新任务的专业化:将模型微调到一个狭窄的领域。权重的稀疏子集可以捕获领域知识。
- 重新训练恢复准确性:重新训练稀疏模型使其收敛,允许剩余参数补偿修剪后的参数。
相反,对预训练模型的简单修剪通常会严重损害准确性。稀疏微调修剪与特定任务训练相结合,提供了更大的灵活性。
此外,参数效率使得能够使用有限的数据进行训练。以受控方式减少模型容量以防止过度拟合。
稀疏微调如何工作
稀疏微调涉及三个关键步骤:
1. 预训练密集模型
首先,在未标记的文本上以自监督的方式预训练具有数千亿参数的大型密集模型。最常见的方法是自回归语言建模,其中模型经过训练以在给定先前上下文的情况下预测下一个标记。BERT 中的屏蔽语言建模等变体也被使用。
这使得模型无需人工标记即可构建通用语言表示。现代计算基础设施和扩展技术使得通过这种方式预训练具有数万亿个参数的模型成为可能。
2. 权重的结构化剪枝
接下来,对预训练模型进行修剪以产生结构化稀疏性。
- 一种方法是将权重划分为块并将整个块修剪在一起。例如,修剪
50%
的transformer
块或注意力头会均匀地降低一半的权重。 - 另一种技术是矩阵细分,其中删除权重矩阵中的
行/列
块,这保持了线性代数的效率。
修剪可以迭代地进行,增加稀疏性,同时检查每轮后的准确性下降。逐步修剪可以让网络平稳调整。
目标是在保留预训练能力的同时诱导高度稀疏性(修剪 75-90%
的权重)。这可能需要多次修剪迭代并仔细选择要删除的权重。
3. 目标任务的稀疏微调
最后,稀疏模型针对下游任务的标记数据进行微调,以恢复准确性。
微调通过梯度更新使剩余参数适应任务分布,修剪所施加的正则化可以防止过度拟合。
在训练稀疏模型以匹配原始密集模型的输出时,也可以合并蒸馏损失。
经过微调后,可以部署专门的稀疏模型以进行有效的推理,常规零模式允许优化计算。整个过程有效地将密集的预训练知识转移到为特定应用程序定制的紧凑稀疏模型中。
通过稀疏微调获得有希望的结果
最近的研究表明,不同的LLMs和数据集具有高度稀疏性和最小精度损失的潜力。
最近的论文《用于大型语言模型推理加速的稀疏微调》中, Neural Magic 和奥地利科学技术研究所 (ISTA) 合作探索了如何将微调和稀疏性结合起来解决这些问题,以实现准确的预测,可以部署在CPU上的模型。
研究人员将 7B
参数 Mosaic MPT
模型压缩了 75%
,而在数学应用题数据集上的准确度下降了不到 1%
。稀疏模型在 CPU 上的运行速度可以提高 2
倍以上。
在使用 T5
模型的英德翻译任务中,实现了 70%
的稀疏性和 2.1 倍
的加速,而 BLEU
分数仅下降了 0.9
。使用 Whisper
进行的语音转录也显示出 1.5-2 倍
的加速速度和 50-70%
的稀疏性。
其他工作表明,GPT-3
大小的模型在 GLUE
基准测试中密度降低了 5-10 倍
。
只要稀疏模式是规则的,压缩存储、高效批处理和模型并行性等优化就可以加速执行。至关重要的是,与量化不同,稀疏微调对模型精度的限制最小。
方法尝试
Neural Magic DeepSparse 是一种 CPU 推理运行时,可实现优化以利用稀疏性和量化来加速推理性能。DeepSparse 支持多种模型架构,包括 BERT
、ViT
、ResNet
、EfficientNet
、YOLOv5/8
等 CNN 和 BERT 等纯编码器转换器。在过去的几个月里,对 DeepSparse 进行了调整,以支持 Llama 2 和 MPT 等流行模型使用的仅解码器架构,并具有专门的基础设施来处理 KV 缓存和针对解码器模型底层关键操作的新稀疏数学内核。
安装
pip install deepsparse
要试验最新功能,可以使用 nightly
构建版本,pip install deepsparse-nightly
或者使用克隆方式从源安装 pip install -e path/to/deepsparse
。
硬件要求
- 硬件:
x86 AVX2
、AVX-512
、AVX-512 VNNI
和ARM v8.2+
- 操作系统:Linux
- Python:3.8–3.11
- ONNX 版本 1.5.0–1.15.0、ONNX opset 版本 11 或更高版本
对于使用 Mac 或 Windows 的用户,建议将 Linux 容器与 Docker 结合使用。
部署API
DeepSparse 包括三个部署 API:
- 引擎是最底层的API。使用 Engine,可以编译 ONNX 模型,传递张量作为输入,并接收原始输出。
- 管道通过预处理和后处理包裹了引擎。使用 Pipeline,可以传递原始数据并接收预测。
- 服务器使用 FastAPI 通过 REST API 包装管道。使用服务器,可以通过 HTTP 发送原始数据并接收预测。
引擎
下面的示例从 SparseZoo 下载 ONNX 格式的用于情感分析的 90%
修剪量化 BERT 模型,编译模型,并对随机生成的输入运行推理。用户可以提供自己的ONNX模型,无论是密集的还是稀疏的。
from deepsparse importEngine
# 下载onnx,编译 zoo_stub = "zoo:nlp/sentiment_analysis/obert-base/pytorch/huggingface/sst2/pruned90_quant-none" compiled_model = Engine(model=zoo_stub, batch_size=1) # 运行推理(输入是原始 numpy 张量,输出是原始分数) inputs = compiled_model.generate_random_inputs() output = compiled_model(inputs) print(output) # > [array([[-0.3380675 , 0.09602544]], dtype=float32)] << raw scores
Pipeline
管道通过预处理和后处理包裹引擎,能够传递原始数据并接收后处理的预测。下面的示例从 SparseZoo 下载 ONNX 格式的用于情感分析的 90%
剪枝量化 BERT 模型,设置管道并对示例数据运行推理。
from deepsparse import Pipeline # 下载onnx,设置管道 zoo_stub = "zoo:nlp/sentiment_analysis/obert-base/pytorch/huggingface/sst2/pruned90_quant-none" sentiment_analysis_pipeline = Pipeline.create( task="sentiment-analysis", # name of the task model_path=zoo_stub, # zoo stub or path to local onnx file ) # 运行推理(输入是句子,输出是预测) prediction = sentiment_analysis_pipeline("I love using DeepSparse Pipelines") print(prediction) # > labels=['positive'] scores=[0.9954759478569031]
挑战和限制
然而,要充分发挥稀疏微调的优势,需要克服一些关键挑战:
- 训练不稳定:微调过程中的简单修剪可能会导致损失出现峰值和发散。需要仔细的调度和损失公式。
- 不规则稀疏性:结构化剪枝假设规则零模式。但非结构化稀疏性更难优化。
- 硬件效率:需要定制稀疏计算内核来最大限度地提高加速速度,尤其是在 GPU 上。
- 可扩展性:极度稀疏是否适用于 100 万亿参数模型还有待观察。
总结
稀疏微调为缩小最先进的LLMs与可行部署之间的巨大差距提供了一条有希望的途径。通过 10-100
倍的压缩系数,这些模型可以变得更容易访问。
自动修剪算法、高效训练技术和专用硬件的进步将进一步提高稀疏LLMs的速度和可行性。
未来,模型甚至可能被设计为稀疏约束下的可训练性。通过模型、优化技术和硬件加速器的协同设计,深度学习领域取得了令人难以置信的进步。