北京 工业网站建设公司价格南京市企业展厅设计公司
2026/4/17 17:56:53 网站建设 项目流程
北京 工业网站建设公司价格,南京市企业展厅设计公司,中关村在线官网首页,古典asp网站源码本文详细介绍大模型微调基础与实战#xff0c;包括微调概念、GSM8K数据集处理、全参数有监督微调(SFT)实现及参数高效的BitFit方法。文章从理论到代码#xff0c;提供低成本低门槛的学习项目#xff0c;帮助读者掌握大模型微调技术#xff0c;后续还将介绍更多高效微调和强…本文详细介绍大模型微调基础与实战包括微调概念、GSM8K数据集处理、全参数有监督微调(SFT)实现及参数高效的BitFit方法。文章从理论到代码提供低成本低门槛的学习项目帮助读者掌握大模型微调技术后续还将介绍更多高效微调和强化学习方法。从本文起笔者将开始介绍文本大模型的各种微调方式。笔者将基于自己的经历给出一个低成本低门槛的学习项目。笔者于今年6月参加西安交通大学计算机学院某教授的推荐免试研究生夏令营项目的时候参与了以下的考核项目这是一个很有意思的项目面向qwen-0.5B模型的GSM8K小学生数学题数据集的数学推理能力增强。在这个合集中笔者将以这个项目为基础从最基础的全参数微调开始逐渐介绍到各种高效微调方式如Prompt-TuningP-TuningLora等最后到各种强化学习RL方法PPO、DPO、GRPO等。从各种微调方法的理论基础到实际代码实现。如果你对大模型推理的基础知识有所缺失可以阅读笔者之前的基础知识文章。一、什么是微调大模型我们都知道大模型是经过了海量数据预训练得到的其核心是下一词预测。单纯的预训练大模型在实际的下游任务上表现并不能做到很好他大概率不能给出我们想要看到的回答格式也缺乏对下游任务的专业知识。而微调大模型就是给一个学富五车的大脑进行针对性的专业强化让一个广度很广的通才变成一个面向某一下游任务的专才。二、全参数的有监督微调SFT所谓有监督微调就是说有完整标注的数据一点点指导大模型去学习怎么输出。1处理数据集GSM8K事不宜迟我们直接上代码来处理一下我们的GSM8K数据集# 下载一下数据集 def download_and_save_data(): ds load_dataset(openai/gsm8k, main) ds.save_to_disk(./dataset/gsm8k)print(ds) # DatasetDict({ # train: Dataset({ # features: [question, answer], # num_rows: 7473 # }) # test: Dataset({ # features: [question, answer], # num_rows: 1319 # }) # })可以看见数据集已经给我们分成了训练部分和测试部分。当然测试集我们是后续用于评估性能的可不能拿来训练了。我们现在把数据集的训练集部分再处理一下用作后续的训练集和验证集def handle_data(ds: DatasetDict): # 从完整数据集中把Train的部分拿出来 train_data ds[train] # 划分训练时的训练集和验证集 train_data train_data.train_test_split(test_size0.1, seed42) tokenizer AutoTokenizer.from_pretrained(./models/Qwen2.5-0.5B-Instruct)然后当然是把数据处理成模型微调需要的格式了不清楚的可以看看我之前的文章# map映射函数的实现。当然得在前面先导入一下tokenizer。 # CasualLM的训练目标是下一词预测所以把前后文本拼接在一起就行 def tokenizer_all_data(example): question example[question] answer example[answer] # Qwen 格式问题 回答 EOS text f{question}\n{answer}{tokenizer.eos_token} # 对整段文本进行编码 tokenized tokenizer( text, truncationTrue, max_length512, paddingmax_length # 必须加 ) input_ids tokenized[input_ids] # 下面我们要找出哪些 token 属于 question哪些属于 answer # ------------------------------------------------------------- # 先编码 question q_ids tokenizer(question)[input_ids] # question 的 token 长度包含换行 q_len len(q_ids) # 初始化 labels与 input_ids 一样 labels input_ids.copy() # 将 question 部分全部 mask 为 -100模型不会学习这部分 for i in range(q_len): if i len(labels): labels[i] -100 tokenized[labels] labels return tokenized# 进行map映射 train_data train_data.map(tokenizer_all_data, num_proc4, remove_columns[question, answer]) return train_data把以上代码写成一个处理数据的函数。处理完成数据了我们看看现在数据是怎样了processed_data handle_data(ds) print(processed_data) # DatasetDict({ # train: Dataset({ # features: [input_ids, attention_mask, labels], # num_rows: 6725 # }) # test: Dataset({ # features: [input_ids, attention_mask, labels], # num_rows: 748 # }) # })可以看到之前训练集的7473条数据已经被分成了6725条训练集和748条验证集里面有[input_ids, attention_mask, labels]这三个所需的字段。2全参数微调首先当然是导入库# # 一、基础环境与依赖设置 # import os # HuggingFace 镜像站点国内访问更稳定 os.environ[HF_ENDPOINT] https://hf-mirror.com # 指定使用哪一张 GPU这里使用 GPU 1 os.environ[CUDA_VISIBLE_DEVICES] 1 # # 二、导入核心依赖 # from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, Trainer, default_data_collator ) from datasets import load_from_disk from handle_data import * # 你自定义的数据处理逻辑 import matplotlib.pyplot as plt后续就一股脑把代码放出来吧我给出了非常详细的注释内容# # 三、绘制 loss 曲线的工具函数 # def plot_loss(epochs, losses, save_pathloss_curve.png): 根据 epoch 与 loss 绘制并保存 loss 曲线图 参数说明 - epochs: list[float]每一个 loss 对应的 epoch - losses: list[float]loss 数值 - save_path: str图片保存路径 plt.figure(figsize(8, 6)) plt.plot(epochs, losses) plt.xlabel(Epoch) plt.ylabel(Loss) plt.title(Epoch-Loss Curve) # 保存图片dpi300 适合论文/报告 plt.savefig(save_path, dpi300, bbox_inchestight) plt.close() print(f[INFO] Loss curve saved to {save_path}) # # 四、主训练流程 # def main(): # ------------------------------------------------ # 1. 加载预训练模型与 tokenizer # ------------------------------------------------ # 使用 Qwen2.5-0.5B-Instruct 作为 SFT 基座模型 model AutoModelForCausalLM.from_pretrained( ./models/Qwen2.5-0.5B-Instruct ) tokenizer AutoTokenizer.from_pretrained( ./models/Qwen2.5-0.5B-Instruct ) # ------------------------------------------------ # 2. 加载并预处理数据集 # ------------------------------------------------ # 如果本地还没有 GSM8K 数据集则先下载并保存 if not os.path.exists(./dataset/gsm8k): download_and_save_data() # 从磁盘加载数据集datasets 的标准做法 ds load_from_disk(./dataset/gsm8k) # 使用你自定义的 handle_data 函数进行处理 # 通常包括prompt 拼接、tokenize、labels 构造等 processed_data handle_data(ds) train_data processed_data[train] test_data processed_data[test] # ------------------------------------------------ # 3. 设置 TrainingArguments核心配置 # ------------------------------------------------ 这一部分是整个训练行为的“控制中心” 包括 - 学习率 - 学习率退火策略 - eval / save 策略 - 是否保存最优模型 training_args TrainingArguments( # 输出与日志 output_dir./output, # checkpoint 日志保存目录 # batch 设置 per_device_train_batch_size1, # 单卡 batch size per_device_eval_batch_size1, # 训练轮数 num_train_epochs4, # 训练 1 个 epochSFT 常用 # 日志与评估 logging_steps1, # 每一步都记录 train loss eval_strategysteps, # 按 step 进行验证 eval_steps100, # 每 100 step 做一次 eval # 模型保存策略 save_steps100, # 每 100 step 尝试保存模型 save_total_limit2, # 最多只保留 2 个 checkpoint # 学习率相关重点 learning_rate5e-5, # 初始学习率 # 学习率调度器类型 # linear线性下降 # cosine余弦退火更平滑推荐 lr_scheduler_typecosine, # warmup 比例 # 训练初期从 0 慢慢升到 learning_rate warmup_ratio0.03, # 3% 的 step 用于 warmup # 自动保存最优模型重点 load_best_model_at_endTrue, # 训练结束后自动加载最优模型 metric_for_best_modeleval_loss, # 根据 eval_loss 判断最优 greater_is_betterFalse, # loss 越小越好 # 混合精度 fp16True, # 使用 FP16 加速训练 # 其他 report_tonone, # 不使用 wandb / tensorboard ) # ------------------------------------------------ # 4. 初始化 Trainer # ------------------------------------------------ trainer Trainer( modelmodel, argstraining_args, train_datasettrain_data, eval_datasettest_data, data_collatordefault_data_collator, ) # ------------------------------------------------ # 5. 开始训练 # ------------------------------------------------ 注意 - 训练过程中 Trainer 会 - 自动更新学习率cosine warmup - 定期 eval - 当 eval_loss 下降时保存 checkpoint - 训练结束后 - model 已经被切换为 eval_loss 最优的那一次 trainer.train() # ------------------------------------------------ # 6. 保存最终最优模型 # ------------------------------------------------ output_dir ./sft_output/qwen2.5-0.5B-sft # 保存的是「eval_loss 最优」模型而不是最后一步 trainer.save_model(output_dir) tokenizer.save_pretrained(output_dir) print(f[INFO] Best model saved to {output_dir}) # ------------------------------------------------ # 7. 提取并绘制 loss 曲线 # ------------------------------------------------ train_epoch [] train_loss [] eval_epoch [] eval_loss [] for log in trainer.state.log_history: # 训练 loss if loss in log and epoch in log: train_epoch.append(log[epoch]) train_loss.append(log[loss]) # 验证 loss if eval_loss in log and epoch in log: eval_epoch.append(log[epoch]) eval_loss.append(log[eval_loss]) # 绘制训练 loss 曲线 plot_loss(train_epoch, train_loss, ./out_image/full/train_loss.png) # 绘制验证 loss 曲线用于观察最优模型位置 plot_loss(eval_epoch, eval_loss, ./out_image/full/eval_loss.png) # # 五、程序入口 # if __name__ __main__: main()二、BitFit当然到上面为止我们已经可以进行微调了。但是全参数微调有很大的问题我们使用0.5B模型可能还能训得动那要是7B呢32B呢更大呢显存邦的一下就炸掉了也就是我们说的OOMOut Of Memory。高效微调的方法有很多主要的作用就是减少微调的参数量减少所需显存和所耗时间。这里我们先介绍BitFit之后我们会介绍更多高效微调的方法。基于Transformer掩码语言模型的参数高效调优来自一所以色列的大学和AI2研究院。BitFit是一种稀疏微调方法其中仅修改模型或其子集的bias项。如果不清楚bias项是什么可以再去补习一下深度学习的基础也可以我们把模型打印出来瞅瞅是怎么回事可以看见q、k、v中均开启了bias。我们要做的就是冻结除了bias以外的参数只训练bias。实现起来也很简单只要在加载模型之后加入一小段代码就行model AutoModelForCausalLM.from_pretrained( ./models/Qwen2.5-0.5B-Instruct ) tokenizer AutoTokenizer.from_pretrained( ./models/Qwen2.5-0.5B-Instruct ) # # BitFit # BitFit 冻结预训练 Transformer 编码器的大部分参数权重矩阵、层归一化缩放因子等仅训练两类参数1、模型中的偏置项或其子集2、任务特定的最终线性分类层。 num_param 0 total_param sum(p.numel() for p in model.parameters()) for name, param in model.named_parameters(): # 训练 bias排除 lm_head.bias if bias in name and lm_head not in name: param.requires_grad True num_param param.numel() # 训练 LayerNorm 的 weight可选但强烈推荐 elif layernorm.weight in name.lower() or ln_ in name.lower(): param.requires_grad True num_param param.numel() else: param.requires_grad False print(f总参数量: {total_param}) print(f可训练参数量(BitFit): {num_param}) print(f训练比例: {num_param / total_param:.6f}) # 总参数量: 494032768 可训练参数量(BitFit): 70656 训练比例: 0.000143可以看见训练的参数量比例一下子就大减了呢~~实际观察一下时间大概变快了4倍左右当然只是在这个场景和模型下的简单测试。对于中小型训练数据在预训练的 BERT 模型上应用 BitFit 比微调整个模型具有竞争力有时甚至更好。 对于较大型的数据该方法比其他稀疏微调方法具有竞争力。 除了实用性之外还与微调过程相关微调主要是暴露语言建模训练产生的知识而不是学习新的特定任务语言知识。​最后我在一线科技企业深耕十二载见证过太多因技术卡位而跃迁的案例。那些率先拥抱 AI 的同事早已在效率与薪资上形成代际优势我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在大模型的学习中的很多困惑。我整理出这套 AI 大模型突围资料包✅AI大模型学习路线图✅Agent行业报告✅100集大模型视频教程✅大模型书籍PDF✅DeepSeek教程✅AI产品经理入门资料完整的大模型学习和面试资料已经上传带到CSDN的官方了有需要的朋友可以扫描下方二维码免费领取【保证100%免费】​​为什么说现在普通人就业/升职加薪的首选是AI大模型人工智能技术的爆发式增长正以不可逆转之势重塑就业市场版图。从DeepSeek等国产大模型引发的科技圈热议到全国两会关于AI产业发展的政策聚焦再到招聘会上排起的长队AI的热度已从技术领域渗透到就业市场的每一个角落。智联招聘的最新数据给出了最直观的印证2025年2月AI领域求职人数同比增幅突破200%远超其他行业平均水平整个人工智能行业的求职增速达到33.4%位居各行业榜首其中人工智能工程师岗位的求职热度更是飙升69.6%。AI产业的快速扩张也让人才供需矛盾愈发突出。麦肯锡报告明确预测到2030年中国AI专业人才需求将达600万人人才缺口可能高达400万人这一缺口不仅存在于核心技术领域更蔓延至产业应用的各个环节。​​资料包有什么①从入门到精通的全套视频教程⑤⑥包含提示词工程、RAG、Agent等技术点② AI大模型学习路线图还有视频解说全过程AI大模型学习路线③学习电子书籍和技术文档市面上的大模型书籍确实太多了这些是我精选出来的④各大厂大模型面试题目详解⑤ 这些资料真的有用吗?这份资料由我和鲁为民博士共同整理鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。所有的视频教程由智泊AI老师录制且资料与智泊AI共享相互补充。这份学习大礼包应该算是现在最全面的大模型学习资料了。资料内容涵盖了从入门到进阶的各类视频教程和实战项目无论你是小白还是有些技术基础的这份资料都绝对能帮助你提升薪资待遇转行大模型岗位。智泊AI始终秉持着“让每个人平等享受到优质教育资源”的育人理念‌通过动态追踪大模型开发、数据标注伦理等前沿技术趋势‌构建起前沿课程智能实训精准就业的高效培养体系。课堂上不光教理论还带着学员做了十多个真实项目。学员要亲自上手搞数据清洗、模型调优这些硬核操作把课本知识变成真本事‌​​​​如果说你是以下人群中的其中一类都可以来智泊AI学习人工智能找到高薪工作一次小小的“投资”换来的是终身受益应届毕业生‌无工作经验但想要系统学习AI大模型技术期待通过实战项目掌握核心技术。零基础转型‌非技术背景但关注AI应用场景计划通过低代码工具实现“AI行业”跨界‌。业务赋能 ‌突破瓶颈传统开发者Java/前端等学习Transformer架构与LangChain框架向AI全栈工程师转型‌。获取方式有需要的小伙伴可以保存图片到wx扫描二v码免费领取【保证100%免费】**​

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询