呼和浩特网站推广公司,郑州东区网站优化公司推荐,杭州百度推广公司有几家,交互设计流程【LLM实操系列06】模型微调#xff1a;用100条数据打造专属AI
开始微调之前#xff0c;建议先完成第02篇#xff08;环境配置#xff09;和第03篇#xff08;模型基础#xff09;的学习。
硬件方面#xff0c;你需要至少8GB GPU显存#xff08;使用QLoRA可降至6GB…【LLM实操系列06】模型微调用100条数据打造专属AI开始微调之前建议先完成第02篇环境配置和第03篇模型基础的学习。硬件方面你需要至少8GB GPU显存使用QLoRA可降至6GB。理论方面了解Transformer基本架构会有帮助第01篇有介绍。5分钟理解微调什么时候需要微调defneed_finetuning():判断是否需要微调if特定领域术语多andPrompt优化无效:return需要微调elif需要特定输出格式andFew-shot效果差:return需要微调elif隐私数据不能用API:return需要微调else:return继续优化Prompt微调 vs 其他方案选择指南方案成本效果适用场景参考章节Prompt工程低一般通用任务第04篇RAG中好知识问答第05篇微调高最好专属任务本篇从头训练极高-不推荐-LoRA高效微调神器原理只训练少量参数# 传统微调训练所有参数7B 70亿参数# LoRA微调只训练0.1%参数7M参数# LoRA数学原理# W_new W_original ΔW# ΔW A × B (A和B是小矩阵)15分钟跑通LoRA# pip install transformers peft datasets accelerate bitsandbytesfromtransformersimport(AutoModelForCausalLM,AutoTokenizer,TrainingArguments,Trainer)frompeftimportLoraConfig,get_peft_model,TaskTypeimporttorch# 1. 加载基座模型以Qwen为例model_nameQwen/Qwen2.5-1.5B# 小模型适合测试modelAutoModelForCausalLM.from_pretrained(model_name,torch_dtypetorch.float16,device_mapauto)tokenizerAutoTokenizer.from_pretrained(model_name)# 2. 配置LoRAlora_configLoraConfig(task_typeTaskType.CAUSAL_LM,r8,# LoRA秩越大效果越好但越慢lora_alpha16,# LoRA缩放参数lora_dropout0.1,# Dropout比例target_modules[q_proj,v_proj],# 要微调的层)# 3. 创建PEFT模型modelget_peft_model(model,lora_config)model.print_trainable_parameters()# 输出: trainable params: 4,194,304 || all params: 1,544,454,144 || trainable%: 0.27# 4. 准备数据defprepare_data():准备训练数据# 格式instruction-output对data[{instruction:翻译成英文你好世界,output:Hello World},{instruction:生成SQL查询年龄大于18的用户,output:SELECT * FROM users WHERE age 18}]returndatadefformat_prompt(example):格式化训练样本promptf|im_start|user{example[instruction]}|im_end| |im_start|assistant{example[output]}|im_end|return{text:prompt}# 5. 训练training_argsTrainingArguments(output_dir./lora_model,num_train_epochs3,per_device_train_batch_size4,gradient_accumulation_steps4,warmup_steps100,logging_steps10,save_strategyepoch,learning_rate1e-4,fp16True,)trainerTrainer(modelmodel,argstraining_args,train_datasettrain_dataset,tokenizertokenizer,)trainer.train()QLoRA4bit量化微调显存对比# 模型大小对比configs{全精度:{7B模型:28GB显存,可行性:A100},LoRA:{7B模型:16GB显存,可行性:3090/4090},QLoRA:{7B模型:6GB显存,可行性:2080Ti},# ← 推荐}QLoRA实现fromtransformersimportBitsAndBytesConfig# QLoRA配置4bit量化bnb_configBitsAndBytesConfig(load_in_4bitTrue,bnb_4bit_compute_dtypetorch.float16,bnb_4bit_quant_typenf4,bnb_4bit_use_double_quantTrue,)# 加载4bit模型modelAutoModelForCausalLM.from_pretrained(model_name,quantization_configbnb_config,device_mapauto)# 准备训练frompeftimportprepare_model_for_kbit_training modelprepare_model_for_kbit_training(model)# 应用LoRAmodelget_peft_model(model,lora_config)# 现在可以在6GB显存上微调7B模型数据准备最佳实践1. 数据格式# 方式1指令微调格式instruction_data{instruction:任务描述,input:输入内容可选,output:期望输出}# 方式2对话格式conversation_data{conversations:[{from:human,value:用户问题},{from:assistant,value:助手回答}]}# 方式3纯文本续写text_data{text:这是一段完整的文本...}2. 数据处理工具classDataProcessor:数据预处理工具def__init__(self,tokenizer,max_length512):self.tokenizertokenizer self.max_lengthmax_lengthdefprocess_dataset(self,raw_data):处理数据集processed[]foriteminraw_data:# 构建对话textself.format_conversation(item)# 分词tokensself.tokenizer(text,max_lengthself.max_length,truncationTrue,paddingmax_length,return_tensorspt)processed.append({input_ids:tokens[input_ids][0],attention_mask:tokens[attention_mask][0],labels:tokens[input_ids][0]# 自回归训练})returnprocesseddefformat_conversation(self,item):格式化为模型输入# Qwen格式returnf|im_start|system You are a helpful assistant.|im_end| |im_start|user{item[instruction]}|im_end| |im_start|assistant{item[output]}|im_end|defvalidate_data(self,dataset):数据质量检查issues[]foridx,iteminenumerate(dataset):# 检查长度iflen(item[text])self.max_length*4:# 估算issues.append(f样本{idx}过长)# 检查格式ifnotitem.get(instruction):issues.append(f样本{idx}缺少instruction)returnissues3. 数据增强defaugment_data(original_data):数据增强技巧augmented[]foriteminoriginal_data:# 1. 原始样本augmented.append(item)# 2. 改写instructionrephrased{instruction:f请{item[instruction]},output:item[output]}augmented.append(rephrased)# 3. 添加思维链cot_version{instruction:item[instruction],output:f让我思考一下。{item[output]}}augmented.append(cot_version)returnaugmented训练监控与评估实时监控fromtransformersimportTrainerCallbackimportwandbclassTrainingMonitor(TrainerCallback):训练监控回调defon_log(self,args,state,control,logsNone,**kwargs):iflogs:# 打印关键指标print(fStep{state.global_step}: Loss{logs.get(loss,0):.4f})# 上传到wandb可选ifwandb.run:wandb.log(logs)defon_epoch_end(self,args,state,control,**kwargs):# 每个epoch结束后评估print(fEpoch{state.epoch}completed)评估指标defevaluate_model(model,test_data):模型评估fromrougeimportRougefrombert_scoreimportscore predictions[]references[]foritemintest_data:# 生成预测input_textitem[instruction]predmodel.generate(input_text,max_length100)predictions.append(pred)references.append(item[output])# ROUGE分数rougeRouge()rouge_scoresrouge.get_scores(predictions,references,avgTrue)# BERTScoreP,R,F1score(predictions,references,langzh)return{rouge:rouge_scores,bertscore:{P:P.mean(),R:R.mean(),F1:F1.mean()}}部署微调模型1. 合并LoRA权重frompeftimportPeftModel# 加载基座模型base_modelAutoModelForCausalLM.from_pretrained(model_name)# 加载LoRA权重modelPeftModel.from_pretrained(base_model,./lora_model)# 合并权重merged_modelmodel.merge_and_unload()# 保存完整模型merged_model.save_pretrained(./final_model)tokenizer.save_pretrained(./final_model)2. 量化部署# GGUF格式用于llama.cpp/OllamafromtransformersimportAutoModelForCausalLMimporttorch# 转换为GGUFmodelAutoModelForCausalLM.from_pretrained(./final_model)model.save_pretrained(./gguf_model,safe_serializationTrue)# 使用llama.cpp量化# python convert.py ./final_model --outfile model.gguf# ./quantize model.gguf model_q4_k_m.gguf q4_k_m3. API服务fromfastapiimportFastAPIfrompydanticimportBaseModel appFastAPI()# 加载模型modelAutoModelForCausalLM.from_pretrained(./final_model)tokenizerAutoTokenizer.from_pretrained(./final_model)classQuery(BaseModel):text:strmax_length:int100app.post(/generate)asyncdefgenerate(query:Query):inputstokenizer(query.text,return_tensorspt)outputsmodel.generate(**inputs,max_lengthquery.max_length)responsetokenizer.decode(outputs[0],skip_special_tokensTrue)return{response:response}成本与效果对比方法数据量训练时间显存效果提升Prompt000基准Few-shot5-100010%LoRA100-1K1-4小时16GB30%QLoRA100-1K2-6小时6GB25%全量微调10K1-7天80GB35%调试技巧# 常见问题快速诊断defdiagnose_training_issues():checks{Loss不下降:[检查学习率试试1e-4到5e-5,增加训练轮数,检查数据格式],显存爆炸:[减小batch_size,使用gradient_accumulation_steps,启用gradient_checkpointing],效果不好:[增加LoRA rank (r8→16),增加训练数据,调整lora_alpha],推理错误:[检查tokenizer配置,确认special tokens,验证prompt模板]}returnchecks