
大模型RAG技术:从入门到实践
量化低秩适配器(QLORA)作为LoRA的扩展版本,通过引入量化技术来提高参数效率。QLORA的核心是在Transformer架构的每一层中注入可调整的低秩矩阵,充当“适配器”作用。本文将详细探讨如何利用PEFT库对ChatGLM3-6B模型进行QLORA高效微调。
在开始微调之前,首先需安装必要的Python库。这些库包括datasets
、pandas
、transformers
、peft
、accelerate
、bitsandbytes
、autoawq
和optimum
。它们为数据处理、模型加载、量化处理等提供了强大的支持。
pip install datasets==2.17.0 pandas transformers==4.37.2 peft==0.8.0 accelerate==0.27.0 bitsandbytes autoawq optimum
我们将使用ChatGLM3-6B作为基础模型。通过加载预训练模型,我们可以直接进行对话生成。
from transformers import AutoTokenizer, AutoModel
model_id = "/root/work/chatglm3-6b"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModel.from_pretrained(model_id, trust_remote_code=True, device='cuda')
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=history)
print(response)
启动模型后,我们需要评估其显存占用情况。默认情况下,模型以半精度(float16)加载,其权重需要大约13GB显存。
memory_bytes = model.get_memory_footprint()
memory_gb = memory_bytes / (1024 ** 3) # 转换为GB
print(f"{memory_gb :.2f}GB")
数据集的准备是微调的关键步骤。我们需要构建一个指令集来训练模型,使其具备理解并遵循用户指令的能力。
[
{
"instruction": "用户指令(必填)",
"input": "用户输入(选填)",
"output": "模型回答(必填)",
}
]
我们使用datasets
库来加载处理好的训练数据集。
from datasets import load_dataset # 导入 load_dataset 函数
dataset = load_dataset("json", data_files="./train_data.json")
print(dataset) # 打印加载的数据集对象
在数据处理阶段,我们需要将原始文本数据编码为模型可读的格式。这涉及将输入文本编码为input_ids
,将输出文本编码为labels
。
from transformers import AutoTokenizer # 导入 AutoTokenizer 类
tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm3-6b", trust_remote_code=True)
我们定义一个数据收集器,用于处理和填充批量数据。可以使用transformers
中的DataCollatorForSeq2Seq
数据收集器,或自定义实现一个。
from transformers import DataCollatorForSeq2Seq
data_collator = DataCollatorForSeq2Seq(
tokenizer,
model=model,
label_pad_token_id=-100,
pad_to_multiple_of=None,
padding=True
)
迁移学习是一种机器学习方法,利用已在一个任务上学到的知识,来提高另一个相关任务的学习效果。
大模型微调指的是通过输入特定领域的数据集,让模型学习该领域的知识,从而更好地完成特定领域的任务。
PEFT库中的QLORA为模型微调提供了高效的工具。通过结合量化和低秩适配器技术,QLORA显著减少了存储和计算资源的使用。
本文详细介绍了如何使用PEFT库对ChatGLM3-6B模型进行QLORA微调的全过程。通过结合量化技术和低秩矩阵,我们不仅提高了参数效率,还有效降低了显存占用。希望本文能为您在大模型微调中提供有价值的参考。
问:什么是QLORA?
问:QLORA的核心思想是什么?
问:如何评估模型的GPU显存占用?
model.get_memory_footprint()
方法来获取显存占用情况。问:迁移学习的核心思想是什么?
问:PEFT库如何帮助进行QLORA微调?