news 2026/5/28 8:10:41

【Datawhale组队学习-动手学大模型应用全栈开发】大模型微调实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Datawhale组队学习-动手学大模型应用全栈开发】大模型微调实战

微调技术简介

指令微调

模型微调也被称为指令微调(Instruction Tuning)或者有监督微调(Supervised Fine-tuning, SFT),该方法利用成对的任务输入与预期输出数据,训练模型学会以问答的形式解答问题,从而解锁其任务解决潜能。经过指令微调后,大语言模型能够展现出较强的指令遵循能力,可以通过零样本学习的方式解决多种下游任务。
然而,值得注意的是,指令微调并非无中生有地传授新知,而是更多地扮演着催化剂的角色,激活模型内在的潜在能力,而非单纯地灌输信息。
相较于预训练所需的海量数据,指令微调所需数据量显著减少,从几十万到上百万条不等的数据,均可有效激发模型的通用任务解决能力,甚至有研究表明,少量高质量的指令数据(数千至数万条)亦能实现令人满意的微调效果。这不仅降低了对计算资源的依赖,也提升了微调的灵活性与效率。

轻量化微调

然而,由于大模型的参数量巨大, 进行全量参数微调需要消耗非常多的算力。为了解决这一问题,研究者提出了参数高效微调(Parameter-efficient Fine-tuning),也称为轻量化微调 (Lightweight Fine-tuning),这些方法通过训练极少的模型参数,同时保证微调后的模型表现可以与全量微调相媲美。
常用的轻量化微调技术有LoRA、Adapter 和 Prompt Tuning。

LoRA微调

LoRA 是通过低秩矩阵分解,在原始矩阵的基础上增加一个旁路矩阵,然后只更新旁路矩阵的参数。

微调实战

模型使用Yuan2-2B-Mars-hf

创建Conda环境

conda create -n datawhale_labpython=3.10-y conda activate datawhale_lab

安装依赖

反正运行过程中缺什么库就装什么库

pipinstalltorch torchvision --index-url https://download.pytorch.org/whl/cu128 pipinstalltransformers==4.41.1 pipinstallpeft==0.11.1 pipinstallsentencepiece pipinstallmodelscope

数据处理

# 导入环境importtorchimportpandasaspdfromdatasetsimportDatasetfromtransformersimportAutoTokenizer,AutoModelForCausalLM,DataCollatorForSeq2Seq,TrainingArguments,Trainer# 读取数据df=pd.read_json('./data.json')ds=Dataset.from_pandas(df)# 查看数据len(ds)ds[:1]

输出结果:
{‘input’: [‘# 任务描述\n假设你是一个AI简历助手,能从简历中识别出所有的命名实体,并以json格式返回结果。\n\n# 任务要求\n实体的类别包括:姓名、国籍、种族、职位、教育背景、专业、组织名、地名。\n返回的json格式是一个字典,其中每个键是实体的类别,值是一个列表,包含实体的文本。\n\n# 样例\n输入:\n张三,男,中国籍,工程师\n输出:\n{“姓名”: [“张三”], “国籍”: [“中国”], “职位”: [“工程师”]}\n\n# 当前简历\n高勇:男,中国国籍,无境外居留权,\n\n# 任务重述\n请参考样例,按照任务要求,识别出当前简历中所有的命名实体,并以json格式返回结果。’],
‘output’: [‘{“姓名”: [“高勇”], “国籍”: [“中国国籍”]}’]}

加载 tokenizer

path='/root/patest/IEITYuan/Yuan2-2B-Mars-hf'tokenizer=AutoTokenizer.from_pretrained(path,add_eos_token=False,add_bos_token=False,eos_token='<eod>')tokenizer.add_tokens(['<sep>','<pad>','<mask>','<predict>','<FIM_SUFFIX>','<FIM_PREFIX>','<FIM_MIDDLE>','<commit_before>','<commit_msg>','<commit_after>','<jupyter_start>','<jupyter_text>','<jupyter_code>','<jupyter_output>','<empty_output>'],special_tokens=True)tokenizer.pad_token=tokenizer.eos_token

定义数据处理函数

defprocess_func(example):MAX_LENGTH=384# Llama分词器会将一个中文字切分为多个token,因此需要放开一些最大长度,保证数据的完整性instruction=tokenizer(f"{example['input']}<sep>")response=tokenizer(f"{example['output']}<eod>")input_ids=instruction["input_ids"]+response["input_ids"]attention_mask=[1]*len(input_ids)labels=[-100]*len(instruction["input_ids"])+response["input_ids"]# instruction 不计算lossiflen(input_ids)>MAX_LENGTH:# 做一个截断input_ids=input_ids[:MAX_LENGTH]attention_mask=attention_mask[:MAX_LENGTH]labels=labels[:MAX_LENGTH]return{"input_ids":input_ids,"attention_mask":attention_mask,"labels":labels}# 定义数据处理函数defprocess_func(example):MAX_LENGTH=384# Llama分词器会将一个中文字切分为多个token,因此需要放开一些最大长度,保证数据的完整性instruction=tokenizer(f"{example['input']}<sep>")response=tokenizer(f"{example['output']}<eod>")input_ids=instruction["input_ids"]+response["input_ids"]attention_mask=[1]*len(input_ids)labels=[-100]*len(instruction["input_ids"])+response["input_ids"]# instruction 不计算lossiflen(input_ids)>MAX_LENGTH:# 做一个截断input_ids=input_ids[:MAX_LENGTH]attention_mask=attention_mask[:MAX_LENGTH]labels=labels[:MAX_LENGTH]return{"input_ids":input_ids,"attention_mask":attention_mask,"labels":labels}```## 处理数据集```python tokenized_id=ds.map(process_func,remove_columns=ds.column_names)tokenized_id

输出结果:
Dataset({
features: [‘input_ids’, ‘attention_mask’, ‘labels’],
num_rows: 200
})

数据检查

tokenizer.decode(tokenized_id[0]['input_ids'])

输出结果:
‘# 任务描述\n假设你是一个AI简历助手,能从简历中识别出所有的命名实体,并以json格式返回结果。\n\n# 任务要求\n实体的类别包括:姓名、国籍、种族、职位、教育背景、专业、组织名、地名。\n返回的json格式是一个字典,其中每个键是实体的类别,值是一个列表,包含实体的文本。\n\n# 样例\n输入:\n张三,男,中国籍,工程师\n输出:\n{“姓名”: [“张三”], “国籍”: [“中国”], “职位”: [“工程师”]}\n\n# 当前简历\n高勇:男,中国国籍,无境外居留权,\n\n# 任务重述\n请参考样例,按照任务要求,识别出当前简历中所有的命名实体,并以json格式返回结果。 {“姓名”: [“高勇”], “国籍”: [“中国国籍”]}’

tokenizer.decode(list(filter(lambdax:x!=-100,tokenized_id[0]["labels"])))

输出结果:
‘{“姓名”: [“高勇”], “国籍”: [“中国国籍”]}’

模型训练

# 模型加载model=AutoModelForCausalLM.from_pretrained(path,device_map="auto",torch_dtype=torch.bfloat16,trust_remote_code=True)model.enable_input_require_grads()# 开启gradient_checkpointing时,要执行该方法# 配置LorafrompeftimportLoraConfig,TaskType,get_peft_model config=LoraConfig(task_type=TaskType.CAUSAL_LM,target_modules=["q_proj","k_proj","v_proj","o_proj","gate_proj","up_proj","down_proj"],inference_mode=False,# 训练模式r=8,# Lora 秩lora_alpha=32,# Lora alaph,具体作用参见 Lora 原理lora_dropout=0.1# Dropout 比例)# 构建PeftModelmodel=get_peft_model(model,config)model# 设置训练参数args=TrainingArguments(output_dir="./output/Yuan2.0-2B_lora_bf16",per_device_train_batch_size=12,gradient_accumulation_steps=1,logging_steps=1,save_strategy="epoch",num_train_epochs=3,learning_rate=5e-5,save_on_each_node=True,gradient_checkpointing=True,bf16=True,)# 初始化Trainertrainer=Trainer(model=model,args=args,train_dataset=tokenized_id,data_collator=DataCollatorForSeq2Seq(tokenizer=tokenizer,padding=True),)# 模型训练trainer.train()

效果验证

# 定义生成函数defgenerate(prompt):prompt=prompt+"<sep>"inputs=tokenizer(prompt,return_tensors="pt")["input_ids"].cuda()outputs=model.generate(inputs,do_sample=False,max_length=256)output=tokenizer.decode(outputs[0])print(output.split("<sep>")[-1])# 输入prompt templatetemplate=''' # 任务描述 假设你是一个AI简历助手,能从简历中识别出所有的命名实体,并以json格式返回结果。 # 任务要求 实体的类别包括:姓名、国籍、种族、职位、教育背景、专业、组织名、地名。 返回的json格式是一个字典,其中每个键是实体的类别,值是一个列表,包含实体的文本。 # 样例 输入: 张三,男,中国籍,工程师 输出: {"姓名": ["张三"], "国籍": ["中国"], "职位": ["工程师"]} # 当前简历 input_str # 任务重述 请参考样例,按照任务要求,识别出当前简历中所有的命名实体,并以json格式返回结果。 '''input_str='张三,汉族,金融学硕士。'prompt=template.replace('input_str',input_str).strip()generate(prompt)

运行结果:
{“姓名”: [“张三”], “国籍”: [“汉族”], “职位”: [“金融学硕士”]}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 12:59:40

扭蛋机小程序:线上扭蛋机模式发展新形势[特殊字符]

扭蛋机小程序&#xff1a;线上扭蛋机模式发展新形势&#x1f4b0;随着互联网的发展&#xff0c;扭蛋机在线上也迎来了发展机遇&#xff0c;扭蛋机与互联网进行融合&#xff0c;通过线上扭蛋机小程序让消费者在手机上进行扭蛋&#xff0c;为消费者带来全新的线上体验。&#x1f…

作者头像 李华
网站建设 2026/5/27 11:48:10

49、Bash编程:模式匹配、命令操作与示例代码详解

Bash编程:模式匹配、命令操作与示例代码详解 1. extglob扩展模式匹配运算符 在使用 shopt -s extglob 时,以下运算符会生效。匹配默认区分大小写,但可以使用 shopt -s nocasematch (bash 3.1+)来改变这一特性,该选项会影响 case 和 [[ 命令。 分组 含义 @( …

作者头像 李华
网站建设 2026/5/28 2:44:51

2、深入探索Bash编程:从基础到实用技巧

深入探索Bash编程:从基础到实用技巧 代码获取与结构 代码可从网站(http://www.bashcookbook.com )下载,下载格式为 .tgz 或 .zip 。代码文件通常位于类似 ./chXX/snippet_name 的路径下,其中 chXX 代表章节, snippet_name 是文件名。 “无用的cat使用”探讨…

作者头像 李华
网站建设 2026/5/27 18:40:30

40、计算机日常维护与管理任务实用指南

计算机日常维护与管理任务实用指南 在计算机使用和管理过程中,我们常常会遇到各种任务和问题。本文将为大家介绍一些常见问题的解决方案,涵盖文件重命名、文档查看、文件解压、会话恢复、会话共享、日志记录以及屏幕清理等方面。 1. 批量重命名文件 在实际操作中,我们可能…

作者头像 李华
网站建设 2026/5/26 8:26:37

Kotaemon重排序模型(Re-Ranker)集成教程

Kotaemon重排序模型集成深度指南 在构建企业级智能问答系统时&#xff0c;一个常见的痛点是&#xff1a;即便使用了强大的大语言模型&#xff08;LLM&#xff09;&#xff0c;系统仍可能给出看似合理却与实际政策或知识不符的回答。这种“幻觉”问题在金融、医疗、人力资源等高…

作者头像 李华
网站建设 2026/5/28 12:59:47

Unity学习笔记(二十)PlayerPrefs(一)

目录 PlayerPrefs是什么 存储原理 读取相关 删除数据 PlayerPrefs数据唯一性 PlayerPrefs是什么 是Unity提供的可以用于存储读取玩家数据的公共类 存储原理 PlayerPrefs的数据存储&#xff0c;类似键值对存储&#xff0c;一个键对应一个值 提供了存储3种数据的方法 &am…

作者头像 李华