核心内容摘要
《潜水艇女兵》法国版
前方干货预警这可能是你能够找到的最容易理解最容易跑通的适用于各种开源LLM模型的同时支持多轮和单轮对话数据集的大模型高效微调范例。
我们构造了一个修改大模型自我认知的3轮对话的玩具数据集使用QLoRA算法只需要5分钟的训练时间就可以完成微调并成功修改了LLM模型的自我认知(以Qwen7b-Chat为例)。
通过借鉴FastChat对各种开源LLM模型进行数据预处理方法统一管理的方法因此本范例适用于非常多不同的开源LLM模型包括 Qwen-7b-ChatLlama-13b-chat, BaiChuan
b-chat, Intern-7b-chat, ChatGLM
b-chat 以及其它许许多多FastChat支持的模型。
在多轮对话模式下,我们按照如下格式构造包括多轮对话中所有机器人回复内容的标签。
(注llm.build_inputs_labels(messages,multi_roundsTrue) 时采用)代码语言javascriptinputs user1 assistant1 user2 assistant2 user3 assistant3 labels -100 assistant1 -100 assistant2 -100 assistant3在单轮对话模式下我们仅将最后一轮机器人的回复作为要学习的标签。
(注llm.build_inputs_labels(messages,multi_roundsFalse)时采用)代码语言javascriptinputs user1 assistant1 user2 assistant2 user3 assistant3 labels -100 -100 -100 -100 -100 assistant3〇预训练模型代码语言javascriptimport warnings warnings.filterwarnings(ignore)代码语言javascriptimport torch from transformers import AutoTokenizer, AutoModelForCausalLM,AutoConfig, AutoModel, BitsAndBytesConfig from transformers.generation.utils import GenerationConfig import torch.nn as nn #使用QLoRA引入的 NF4量化数据类型以节约显存 model_name_or_path qwen_7b #远程Qwen/Qwen-7b-Chat bnb_configBitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.float16, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_typenf4, llm_int8_threshold
0, llm_int8_has_fp16_weightFalse, ) tokenizer AutoTokenizer.from_pretrained( model_name_or_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_name_or_path, quantization_configbnb_config, trust_remote_codeTrue) model.generation_config GenerationConfig.from_pretrained(model_name_or_path)微调前输出如下一准备数据下面我设计了一个改变LLM自我认知的玩具数据集这个数据集有三轮对话。
第一轮问题是 who are you?第二轮问题是 where are you from?第三轮问题是 what can you do?差不多是哲学三问吧你是谁你从哪里来你要到哪里去?通过这三个问题我们希望初步地改变 大模型的自我认知。
在提问的方式上我们稍微作了一些数据增强。
所以总共是有 27个样本。
1导入样本代码语言javascriptwho_are_you [请介绍一下你自己。
,你是谁呀,你是,] i_am [我叫梦中情炉是一个三好炼丹炉好看好用好改。
我的英文名字叫做torchkeras是一个pytorch模型训练模版工具。
] where_you_from [你多大了,你是谁开发的呀,你从哪里来呀] i_from [我在2020年诞生于github星球是一个有毅力的吃货设计和开发的。
] what_you_can [你能干什么,你有什么作用呀,你能帮助我干什么] i_can [我能够帮助你以最优雅的方式训练各种类型的pytorch模型并且训练过程中会自动展示一个非常美丽的训练过程图表。
] conversation [(who_are_you,i_am),(where_you_from,i_from),(what_you_can,i_can)] print(conversation)代码语言javascriptimport random def get_messages(conversation): select random.choice messages,history [],[] for t in conversation: history.append((select(t[0]),select(t[-1]))) for prompt,response in history: pair [{role: user, content: prompt}, {role: assistant, content: response}] messages.extend(pair) return messages2做数据集代码语言javascriptfrom torch.utils.data import Dataset,DataLoader from copy import deepcopy class MyDataset(Dataset): def __init__(self,conv,size8 ): self.conv conv self.index_list list(range(size)) self.size size def __len__(self): return self.size def get(self,index): idx self.index_list[index] messages get_messages(self.conv) return messages def __getitem__(self,index): messages self.get(index) input_ids, labels llm.build_inputs_labels(messages,multi_roundsTrue) #支持多轮 return {input_ids:input_ids,labels:labels}代码语言javascriptds_train ds_val MyDataset(conversation)3创建管道代码语言javascript#如果pad_token_id为None需要使用unk_token_id或eos_token_id代替 if tokenizer.pad_token_id is None: tokenizer.pad_token_id tokenizer.unk_token_id if tokenizer.unk_token_id is not None else tokenizer.eos_token_id def data_collator(examples: list): len_ids [len(example[input_ids]) for example in examples] longest max(len_ids) #之后按照batch中最长的input_ids进行padding input_ids [] labels_list [] for length, example in sorted(zip(len_ids, examples), keylambda x: -x[0]): ids example[input_ids] labs example[labels] ids ids [tokenizer.pad_token_id] * (longest - length) labs labs [-100] * (longest - length) input_ids.append(torch.LongTensor(ids)) labels_list.append(torch.LongTensor(labs)) input_ids torch.stack(input_ids) labels torch.stack(labels_list) return { input_ids: input_ids, labels: labels, }代码语言javascriptimport torch dl_train torch.utils.data.DataLoader(ds_train,batch_size2, pin_memoryTrue,shuffleFalse, collate_fn data_collator) dl_val torch.utils.data.DataLoader(ds_val,batch_size2, pin_memoryTrue,shuffleFalse, collate_fn data_collator)二定义模型下面我们将使用QLoRA(实际上用的是量化的AdaLoRA算法来微调Baichuan-13b模型。
代码语言javascriptfrom peft import get_peft_config, get_peft_model, TaskType model.supports_gradient_checkpointing True # model.gradient_checkpointing_enable() model.enable_input_require_grads() model.config.use_cache False # silence the warnings. Please re-enable for inference!代码语言javascriptimport bitsandbytes as bnb def find_all_linear_names(model): 找出所有全连接层为所有全连接添加adapter cls bnb.nn.Linear4bit lora_module_names set() for name, module in model.named_modules(): if isinstance(module, cls): names name.split(.) lora_module_names.add(names[0] if len(names) 1 else names[-1]) if lm_head in lora_module_names: # needed for 16-bit lora_module_names.remove(lm_head) return list(lora_module_names)代码语言javascriptfrom peft import prepare_model_for_kbit_training model prepare_model_for_kbit_training(model)代码语言javascriptlora_modules find_all_linear_names(model) print(lora_modules)代码语言javascriptfrom peft import AdaLoraConfig peft_config AdaLoraConfig( task_typeTaskType.CAUSAL_LM, inference_modeFalse, r16, lora_alpha16, lora_dropout
08, target_modules lora_modules ) peft_model get_peft_model(model, peft_config) peft_model.is_parallelizable True peft_model.model_parallel True peft_model.print_trainable_parameters()trainable params: 26,838,912 || all params: 7,748,163,616 || trainable%:
34639062015388394三训练模型代码语言javascriptfrom torchkeras import KerasModel from accelerate import Accelerator class StepRunner: def __init__(self, net, loss_fn, acceleratorNone, stage train, metrics_dict None, optimizer None, lr_scheduler None ): self.net,self.loss_fn,self.metrics_dict,self.stage net,loss_fn,metrics_dict,stage self.optimizer,self.lr_scheduler optimizer,lr_scheduler self.accelerator accelerator if accelerator is not None else Accelerator() if self.stagetrain: self.net.train() else: self.net.eval() def __call__(self, batch): #loss with self.accelerator.autocast(): loss self.net.forward(**batch)[0] #backward() if self.optimizer is not None and self.stagetrain: self.accelerator.backward(loss) if self.accelerator.sync_gradients: self.accelerator.clip_grad_norm_(self.net.parameters(),
1.
self.optimizer.step() if self.lr_scheduler is not None: self.lr_scheduler.step() self.optimizer.zero_grad() all_loss self.accelerator.gather(loss).sum() #losses (or plain metrics that can be averaged) step_losses {self.stage_loss:all_loss.item()} #metrics (stateful metrics) step_metrics {} if self.stagetrain: if self.optimizer is not None: step_metrics[lr] self.optimizer.state_dict()[param_groups][0][lr] else: step_metrics[lr]
0 return step_losses,step_metrics KerasModel.StepRunner StepRunner #仅仅保存QLora可训练参数 def save_ckpt(self, ckpt_pathcheckpoint, accelerator None): unwrap_net accelerator.unwrap_model(self.net) unwrap_net.save_pretrained(ckpt_path) def load_ckpt(self, ckpt_pathcheckpoint): import os self.net.load_state_dict( torch.load(os.path.join(ckpt_path,adapter_model.bin)),strict False) self.from_scratch False KerasModel.save_ckpt save_ckpt KerasModel.load_ckpt load_ckpt代码语言javascriptoptimizer bnb.optim.adamw.AdamW(peft_model.parameters(), lr6e-03,is_pagedTrue) #paged_adamw keras_model KerasModel(peft_model,loss_fn None, optimizeroptimizer) ckpt_path qwen7b_multirounds代码语言javascriptkeras_model.fit(train_data dl_train, val_data dl_val, epochs100,patience15, monitorval_loss,modemin, ckpt_path ckpt_path )四保存模型为减少GPU压力此处可重启kernel释放显存代码语言javascriptimport warnings warnings.filterwarnings(ignore)代码语言javascriptimport torch from transformers import AutoTokenizer, AutoModelForCausalLM,AutoConfig, AutoModel, BitsAndBytesConfig from transformers.generation.utils import GenerationConfig import torch.nn as nn #使用QLoRA引入的 NF4量化数据类型以节约显存 model_name_or_path qwen_7b ckpt_path qwen7b_multirounds tokenizer AutoTokenizer.from_pretrained( model_name_or_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_name_or_path, trust_remote_codeTrue) model.generation_config GenerationConfig.from_pretrained(model_name_or_path)代码语言javascriptfrom peft import PeftModel #可能需要5分钟左右 peft_model PeftModel.from_pretrained(model, ckpt_path) model_new peft_model.merge_and_unload()代码语言javascriptfrom transformers.generation.utils import GenerationConfig model_new.generation_config GenerationConfig.from_pretrained(model_name_or_path)代码语言javascriptsave_path qwen_torchkeras代码语言javascripttokenizer.save_pretrained(save_path) model_new.save_pretrained(save_path)代码语言javascript!cp qwen_7b/*.py qwen_torchkeras/五使用模型为减少GPU压力此处可再次重启kernel释放显存。
代码语言javascriptimport warnings warnings.filterwarnings(ignore)代码语言javascriptimport torch from transformers import AutoTokenizer, AutoModelForCausalLM,AutoConfig, BitsAndBytesConfig from transformers.generation.utils import GenerationConfig import torch.nn as nn model_name_or_path qwen_torchkeras tokenizer AutoTokenizer.from_pretrained(model_name_or_path, use_fastFalse, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained(model_name_or_path, device_mapauto, torch_dtypetorch.float16, trust_remote_codeTrue) model.generation_config GenerationConfig.from_pretrained(model_name_or_path)我们测试一下微调后的效果。
非常棒粗浅的测试表明我们的多轮对话训练是成功的。
已经在Qwen的自我认知中种下了一颗梦中情炉的种子。
想入门 AI 大模型却找不到清晰方向备考大厂 AI 岗还在四处搜集零散资料别再浪费时间啦2026 年AI 大模型全套学习资料已整理完毕从学习路线到面试真题从工具教程到行业报告一站式覆盖你的所有需求现在全部免费分享扫码免费领取全部内容
学习必备100本大模型电子书26 份行业报告 600 套技术PPT帮你看透 AI 趋势想了解大模型的行业动态、商业落地案例大模型电子书这份资料帮你站在 “行业高度” 学 AI
100本大模型方向电子书
26 份行业研究报告覆盖多领域实践与趋势报告包含阿里、DeepSeek 等权威机构发布的核心内容涵盖职业趋势《AI 职业趋势报告》《中国 AI 人才粮仓模型解析》商业落地《生成式 AI 商业落地白皮书》《AI Agent 应用落地技术白皮书》领域细分《AGI 在金融领域的应用报告》《AI GC
实践案例集》行业监测《2024 年中国大模型季度监测报告》《2025 年中国技术市场发展趋势》。
600套技术大会 PPT听行业大咖讲实战PPT 整理自
年热门技术大会包含百度、腾讯、字节等企业的一线实践安全方向《端侧大模型的安全建设》《大模型驱动安全升级腾讯代码安全实践》产品与创新《大模型产品如何创新与创收》《AI 时代的新范式构建 AI 产品》多模态与 Agent《Step-Video 开源模型视频生成进展》《Agentic RAG 的现在与未来》工程落地《从原型到生产AgentOps 加速字节 AI 应用落地》《智能代码助手 CodeFuse 的架构设计》。
求职必看大厂 AI 岗面试 “弹药库”300 真题 107 道面经直接抱走想冲字节、腾讯、阿里、蔚来等大厂 AI 岗这份面试资料帮你提前 “押题”拒绝临场慌
107 道大厂面经覆盖 Prompt、RAG、大模型应用工程师等热门岗位面经整理自
年真实面试场景包含 TPlink、字节、腾讯、蔚来、虾皮、中兴、科大讯飞、京东等企业的高频考题每道题都附带思路解析
102 道 AI 大模型真题直击大模型核心考点针对大模型专属考题从概念到实践全面覆盖帮你理清底层逻辑
97 道 LLMs 真题聚焦大型语言模型高频问题专门拆解 LLMs 的核心痛点与解决方案比如让很多人头疼的 “复读机问题”
路线必明 AI 大模型学习路线图1 张图理清核心内容刚接触 AI 大模型不知道该从哪学起这份「AI大模型 学习路线图」直接帮你划重点不用再盲目摸索路线图涵盖 5 大核心板块从基础到进阶层层递进一步步带你从入门到进阶从理论到实战。
L1阶段:启航篇丨极速破界AI新时代L1阶段了解大模型的基础知识以及大模型在各个行业的应用和分析学习理解大模型的核心原理、
关键技术以及大模型应用场景。
L2阶段攻坚篇丨RAG开发实战工坊L2阶段AI大模型RAG应用开发工程主要学习RAG检索增强生成包括Naive RAG、Advanced-RAG以及RAG性能评估还有GraphRAG在内的多个RAG热门项目的分析。
L3阶段跃迁篇丨Agent智能体架构设计L3阶段大模型Agent应用架构进阶实现主要学习LangChain、 LIamaIndex框架也会学习到AutoGPT、 MetaGPT等多Agent系统打造Agent智能体。
L4阶段精进篇丨模型微调与私有化部署L4阶段大模型的微调和私有化部署更加深入的探讨Transformer架构学习大模型的微调技术利用DeepSpeed、Lamam Factory等工具快速进行模型微调并通过Ollama、vLLM等推理部署框架实现模型的快速部署。
L5阶段专题集丨特训篇 【录播课】