学习笔记:大语言模型微调及其应用
1. 大语言模型微调介绍
1.1 什么是大语言模型微调?
大模型微调(Fine-tuning)是一种技术,通过在预训练的大型语言模型上使用特定数据集进行进一步训练,使模型能够更好地适应特定任务或领域。
- 核心原理:机器学习模型只能代表其训练数据的逻辑和理解。对于未见过的数据样本,模型可能无法准确识别或理解。虽然大型语言模型能够处理广泛的语言信息并进行流畅的对话,但在特定场景下可能无法提供准确的答案。
- 举例:一个通用的大型语言模型在医药领域的特定问题上可能表现不佳。为了确保模型能够准确回答患者的问题,需要为这个通用模型提供大量新的医药数据进行微调。例如,当患者询问“布洛芬能否与感冒药同时服用?”时,通过微调后的模型能够给出正确的回答。
1.2 微调模型的意义
- 上下文理解提升:微调使用的特定数据集可以帮助模型更好地理解特定任务的上下文,从而在推理时能够考虑到更多的相关信息和细节。
- 性能优化:微调可以针对特定任务优化模型的性能,使其在处理该任务时达到更高的准确率和更低的错误率。
- 减少数据需求:微调可以在相对较少的数据量下实现较好的性能提升,因为模型已经具备了大量的通用语言知识。
- 适应性增强:微调使模型能够更好地适应特定用户或场景的需求,提供更加个性化和定制化的推理服务。
2. 微调任务介绍
2.1 数据准备
本次微调数据使用训练集文件 round1_train_data.jsonl
,将每个问题中的子问题和答案构建成问答对。例如:
json
复制代码
{ "instruction": "你是一个逻辑推理专家,擅长解决逻辑推理问题。以下是一个逻辑推理的题目,形式为单项选择题。...", "input": "", "output": "B" }
2.2 环境配置
- 环境选择:选择
PAI-DSW
的ubuntu22.04-cuda12.1.0-py310-torch2.1.2-tf2.14.0-1.14.0
环境。 - 数据下载:使用 Git 命令下载数据文件。
2.3 LoRA 微调
LoRA 介绍
LoRA(Low-Rank Adaptation)微调是一种高效的模型微调技术,特别适用于大型预训练语言模型的适应性调整。
- 优势:
- 可以针对不同的下游任务构建小型 LoRA 模块。
- 使用自适应优化器,训练更有效、硬件门槛更低。
- 使用简单的线性设计,在部署时将可训练矩阵与冻结权重合并,不存在推理延迟。
- 与其他方法正交,可以组合。
代码实现
-
安装依赖:
python复制代码
!pip install modelscope==1.9.5 !pip install "transformers>=4.39.0" !pip install streamlit==1.24.0 ...
-
下载模型文件:
python复制代码
import torch from modelscope import snapshot_download, AutoModel, AutoTokenizer model_dir = snapshot_download('qwen/Qwen2-7B-Instruct', cache_dir='./', revision='master')
-
加载和处理数据:
python复制代码
from datasets import Dataset import pandas as pd df = pd.read_json('an.json') ds = Dataset.from_pandas(df)
-
定义和应用预处理函数:
python复制代码
def process_func(example): MAX_LENGTH = 1800 ... return { "input_ids": input_ids, "attention_mask": attention_mask, "labels": labels } tokenized_id = ds.map(process_func, remove_columns=ds.column_names)
-
定义 LoraConfig:
python复制代码
from peft import LoraConfig, TaskType, get_peft_model config = LoraConfig( task_type=TaskType.CAUSAL_LM, ... )
-
创建 PeftModel:
python复制代码
model = get_peft_model(model, config)
-
训练模型:
python复制代码
from transformers import TrainingArguments, Trainer, DataCollatorForSeq2Seq args = TrainingArguments( output_dir="./output/Qwen2_instruct_lora", ... ) trainer = Trainer( model=model, args=args, ... ) trainer.train()
2.4 模型测试
通过模型调用生成测试结果,验证微调效果。
2.5 模型合并存储
将微调后的模型融入到原模型中,便于部署和使用。
python
复制代码
new_model_directory = "./merged_model_an" merged_model = model.merge_and_unload() merged_model.save_pretrained(new_model_directory, max_shard_size="2048MB", safe_serialization=True)
3. vLLM 加速
3.1 vLLM 介绍
vLLM(Virtual Large Language Model)是一个由伯克利大学LMSYS组织开源的大规模语言模型高速推理框架。设计目标是在实时应用场景中大幅提升语言模型服务的吞吐量和内存使用效率。
3.2 vLLM 服务启动
通过 vllm
启动服务,将微调后的模型部署到 8000 端口。
3.3 vLLM API 调用
通过改写 baseline
中的 call_qwen_api
代码,调用本地类 openai
的 qwen
微调模型接口,进行推理任务。
通过以上步骤,我们完成了对大语言模型的微调,并使用 vLLM 进行加速服务。微调后的模型在特定任务上的表现得到了显著提升,展示了微调技术在实际应用中的巨大潜力。