一文详解大模型微调全流程

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学.

针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。

汇总合集:

《大模型面试宝典》(2024版) 发布!

圈粉无数!《PyTorch 实战宝典》火了!!!


微调实战经历

本次微调经验分享依据于我们参加的“第2届·百度搜索创新大赛——搜索答案组织”整个比赛过程。

我们团队选择的基座模型是ChatGLM3-6B-Base模型,训练数据集为官方提供的数据集(9000条),训练方法为LORA sft 监督微调。

最终结果:score 36.12–ROUGE-L 41.03–BLEU-4 31.22,东三省排名第1名,全国最终排名为44/220。需要技术交流,文末加入我们,记得点赞、收藏、关注我们。

开始微调(SFT)

准备微调框架

微调框架选择的是github上面的llama-factory开源项目

git clone https://github.com/hiyouga/LLaMA-Factory.git<br>
cd LLaMA-Factory<br>
pip install -r requirements.txt

推荐python=3.10,如果要在 Windows 平台上开启量化 LoRA(QLoRA),需要安装预编译的 bitsandbytes 库, 支持 CUDA 11.1 到 12.1

pip install https://github.com/jllllll/bitsandbytes-windows-webui/releases/download/wheels/bitsandbytes-0.39.1-py3-none-win_amd64.whl

加载数据集

在data文件夹下面创建xxx.json命名格式的数据集json文件,本人设置的是baidutrain.json

json文件格式如下

[
   {
        "query": "王者荣耀钻石夺宝幸运值满是多少",
        "refs": [
            "积分夺宝幸运值满值为360点,钻石夺宝幸运值满值为200点,但是夺宝幸运值满了之后还需要一抽才能获得水晶,所以积分夺宝361抽必定获得水晶,钻石夺宝201抽必定获得水晶。",
            "王者钻石夺宝幸运值满是200。",
            "1、最高的幸运值上限是200,每抽一次会获得1点幸运值。王者荣耀里面的钻石夺宝幸运值达到200就满了,也就是说当幸运值满200时,再夺宝一次是必出一个王者水晶的,拥有王者水晶可以到水晶商店里面去兑换物品了,兑换的物品都是永久的。",
            "幸运值满值是360,玩家在抽361的时候是保底必出水晶,这个保底是人人都能抽出水晶的,也就是100%可以让玩家得到水晶,荣耀水晶的概率是0.8%,但是玩家们如果在不断增加抽奖的次数,那么抽出水晶的概率也会增加,想要抽出水晶的玩家可以将361次当做保底的次数。",
            "玩家获取王者水晶之后,可以使用该道具兑换王者商店中的奖励,包含了回城特效、英雄、中级品质的皮肤等奖励。"
        ],
        "answer": "《王者荣耀》钻石夺宝幸运值满值为200点。\n\n钻石夺宝幸运值满200后再抽一次必出一个王者水晶,玩家获取王者水晶之后,可以使用该道具兑换王者商店中的奖励,其中包含了回城特效、英雄、中级品质的皮肤等,兑换的物品永久有效。"
    },
    {
        "query": "王手是什么意思",
        "refs": [
            "一、原神王手。 王手这个词出现在PV短片《雪姬逢椿》中。 王手是小神里说的,小神里很可爱,说王手二字的声音也不错。 所以玩家说王手二字让我氪了648。 二、王手原意。 王手是日本将棋的说法,与中国象棋将军的用法相似。 意思是将军(棋步),将军。",
            "一、原神王手 在PV短片——「雪霁逢椿」中出现了王手这个词。 王手是由小神里说出的,小神里十分可爱,说王手二字时声音也好听。 所以玩家就表示王手二字让我氪了648。 二、王手原本意思 王手是日本将棋的说法,和中国象棋将军的用法差不多。 是将军(的棋步),将一军的意思。",
            "王手是日本将棋的说法,与中国象棋将军的用法相似。意思是将军(棋步),将军。",
            "其中的王手是指,如能下了能擒拿对方王将的一手,类似于象棋里的将军。称之为王手。",
            "王手,男,浙江温州市人。1981年开始发表小说。近年小说散见于《收获》《人民文学》《当代》《钟山》《花城》《作家》《山花》等刊,出版中短篇小说集《火药枪》《柯依娜一个人》《狮身人面》"
        ],
        "answer": "王手是指下了这步棋能擒拿对方王将的一手,类似于象棋里的将军,是日本将棋中的一种说法。\n\n此外,王手还是中国作家协会会员,一级作家,出版中短篇小说集《火药枪》《柯依娜一个人》等。"
    }
]

一定要将数据集所在的json文件加载到dataset_info.json中!!!

"baidu_train":{
    "file_name": "baidutrain.json""columns": {
      "prompt": "", #系统prompt
      "query": "refs"+"query", # 输入
      "response": "answer", # 输出
      "history": "" #历史对话
    }
  }

启动微调

使用sft进行微调

CUDA_VISIBLE_DEVICES=0 python work/jwx/ChatGLM-Efficient-Tuning-main/src/train_bash.py \
    --stage sft \ #微调方式
    --model_name_or_path work/jwx/ChatGLM3-main/model \ #模型路径
    --do_train  \
    --dataset_dir work/jwx/ChatGLM-Efficient-Tuning-main/data \ #数据集文件夹
    --dataset baidu_dev,baidu_train \ # 数据集
    --finetuning_type lora \ #微调方法
    --max_source_length 2048 \ #最大长度
    --max_target_length 512 \
    --learning_rate 3e-05 \ #学习率
    --num_train_epochs 3.0 \ #学习轮数
    --max_samples 10000 \
    --lora_rank 8 \ #lora训练的秩
    --lora_dropout 0.1 \
    --lora_target q_proj,v_proj \ #lora作用层
    --resume_lora_training True \
    --output_dir saves/output \ #输出微调的文件夹
    --fp16 True \ #开启fp16微调
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \ 
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 1000 \

对于所有“基座”(Base)模型,–template 参数可以是 default, alpaca, vicuna 等任意值。但“对话”(Chat)模型请务必使用对应的模板。

更多参数信息:

https://github.com/hiyouga/ChatGLM-Efficient-Tuning/wiki/%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95

合并模型并导出

python src/export_model.py \
    --model_name_or_path work/jwx/ChatGLM3-main/model \
    --adapter_name_or_path saves/output \
    --template default \
    --finetuning_type lora \
    --export_dir path_to_export \
    --export_size 7 \
    --export_legacy_format False

RW

奖励模型训练

数据准备

奖励模型,作为RL中的critic,应该让模型知道什么是正确的答案和什么是错误的答案,因此需要在数据集上进行对于不同答案的一个打分情况,来让机器进行学习。格式如下:

[
   0:  {
   input:  "",
   instruction:  "What are the three primary colors?",
   output:  [
   0:  "The three primary colors are red, blue, and yellow. These colors are called primary because they cannot be created by mixing other colors and all other colors can be made by combining them in various proportions. In the additive color system, used for light, the primary colors are red, green, and blue (RGB)." ,
   1:  "Red, Yellow, and Green."
   ]
 } ,
  1:  {
  input:  "4/16",
  instruction:  "Explain why the following fraction is equivalent to 1/4",
  output:  [
   0:  "The fraction 4/16 is equivalent to 1/4 because both numerators and denominators are divisible by 4. Dividing both the top and bottom numbers by 4 yields the fraction 1/4." ,
   1:  "1/4 is the same as 1/4."
  ]
 }
]

运行微调

微调之后的奖励模型不可以直接进行使用,因为rw模型的输出是一个打分,相当于RL中的critic。

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
    --stage rm \
    --do_train \
    --model_name_or_path path_to_llama_model \
    --adapter_name_or_path path_to_sft_checkpoint \ #sft模型微调的权重文件,可加可不加
    --create_new_adapter \
    --dataset comparison_gpt4_zh \
    --template default \
    --finetuning_type lora \
    --lora_target q_proj,v_proj \
    --output_dir path_to_rm_checkpoint \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 4 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --save_steps 1000 \
    --learning_rate 1e-6 \
    --num_train_epochs 1.0 \
    --plot_loss \
    --fp16

RLHF

在这里插入图片描述

准备actor和critic

actor:对应的是sft输出的权重文件

critic:对应的是RW输出的权重文件

运行RLHF

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
    --stage ppo \
    --do_train True \
    --model_name_or_path baichuan-inc/baichuan-7B \
    --adapter_name_or_path saves/Baichuan-7B-Base/lora/sft \ #sft输出的权重文件
    --finetuning_type lora \
    --template default \
    --dataset_dir data \
    --dataset alpaca_gpt4_en \
    --cutoff_len 1024 \
    --learning_rate 5e-05 \
    --num_train_epochs 3.0 \
    --max_samples 100000 \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 100 \
    --warmup_steps 0 \
    --lora_rank 8 \
    --lora_dropout 0.1 \
    --lora_target W_pack \
    --create_new_adapter True \
    --output_dir saves/Baichuan-7B-Base/lora/train_2024-03-01-09-49-43 \
    --fp16 True \
    --reward_model saves/Baichuan-7B-Base/lora/rw \  #rw输出的权重文件
    --reward_model_type lora \
    --plot_loss True

多卡训练

使用accelerate进行训练

accelerate config # 首先配置分布式环境
accelerate launch src/train_bash.py 
    --stage sft \ #微调方式
    --model_name_or_path work/jwx/ChatGLM3-main/model \ #模型路径
    --do_train  \
    --dataset_dir work/jwx/ChatGLM-Efficient-Tuning-main/data \ #数据集文件夹
    --dataset baidu_dev,baidu_train \ # 数据集
    --finetuning_type lora \ #微调方法
    --max_source_length 2048 \ #最大长度
    --max_target_length 512 \
    --learning_rate 3e-05 \ #学习率
    --num_train_epochs 3.0 \ #学习轮数
    --max_samples 10000 \
    --lora_rank 8 \ #lora训练的秩
    --lora_dropout 0.1 \
    --lora_target q_proj,v_proj \ #lora作用层
    --resume_lora_training True \
    --output_dir saves/output \ #输出微调的文件夹
    --fp16 True \ #开启fp16微调
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \ 
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 1000 \# 参数同上

使用deepspeed进行训练

deepspeed --num_gpus 8 --master_port=9901 src/train_bash.py \
    --deepspeed ds_config.json \
    --stage sft \ #微调方式
    --model_name_or_path work/jwx/ChatGLM3-main/model \ #模型路径
    --do_train  \
    --dataset_dir work/jwx/ChatGLM-Efficient-Tuning-main/data \ #数据集文件夹
    --dataset baidu_dev,baidu_train \ # 数据集
    --finetuning_type lora \ #微调方法
    --max_source_length 2048 \ #最大长度
    --max_target_length 512 \
    --learning_rate 3e-05 \ #学习率
    --num_train_epochs 3.0 \ #学习轮数
    --max_samples 10000 \
    --lora_rank 8 \ #lora训练的秩
    --lora_dropout 0.1 \
    --lora_target q_proj,v_proj \ #lora作用层
    --resume_lora_training True \
    --output_dir saves/output \ #输出微调的文件夹
    --fp16 True \ #开启fp16微调
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \ 
    --lr_scheduler_type cosine \
    --max_grad_norm 1.0 \
    --logging_steps 5 \
    --save_steps 1000 \

心得分享

下面我将本次比赛微调训练的得分的过程分享给大家

图片

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了大模型技术与面试交流群, 想要获取最新面试题、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流

用通俗易懂方式讲解系列

  • 《大模型面试宝典》(2024版) 正式发布!

  • 《大模型实战宝典》(2024版)正式发布!

  • 用通俗易懂的方式讲解:自然语言处理初学者指南(附1000页的PPT讲解)

  • 用通俗易懂的方式讲解:1.6万字全面掌握 BERT

  • 用通俗易懂的方式讲解:NLP 这样学习才是正确路线

  • 用通俗易懂的方式讲解:28张图全解深度学习知识!

  • 用通俗易懂的方式讲解:不用再找了,这就是 NLP 方向最全面试题库

  • 用通俗易懂的方式讲解:实体关系抽取入门教程

  • 用通俗易懂的方式讲解:灵魂 20 问帮你彻底搞定Transformer

  • 用通俗易懂的方式讲解:图解 Transformer 架构

  • 用通俗易懂的方式讲解:大模型算法面经指南(附答案)

  • 用通俗易懂的方式讲解:十分钟部署清华 ChatGLM-6B,实测效果超预期

  • 用通俗易懂的方式讲解:内容讲解+代码案例,轻松掌握大模型应用框架 LangChain

  • 用通俗易懂的方式讲解:如何用大语言模型构建一个知识问答系统

  • 用通俗易懂的方式讲解:最全的大模型 RAG 技术概览

  • 用通俗易懂的方式讲解:利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

  • 用通俗易懂的方式讲解:使用 Neo4j 和 LangChain 集成非结构化知识图增强 QA

  • 用通俗易懂的方式讲解:面了 5 家知名企业的NLP算法岗(大模型方向),被考倒了。。。。。

  • 用通俗易懂的方式讲解:NLP 算法实习岗,对我后续找工作太重要了!。

  • 用通俗易懂的方式讲解:理想汽车大模型算法工程师面试,被问的瑟瑟发抖。。。。

  • 用通俗易懂的方式讲解:基于 Langchain-Chatchat,我搭建了一个本地知识库问答系统

  • 用通俗易懂的方式讲解:面试字节大模型算法岗(实习)

  • 用通俗易懂的方式讲解:大模型算法岗(含实习)最走心的总结

  • 用通俗易懂的方式讲解:大模型微调方法汇总

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/696064.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11-数组与指针深入理解——题型理解

11-数组与指针深入理解——题型理解 文章目录 11-数组与指针深入理解——题型理解一、理解题1二、理解题二三、理解题三四、理解题四五、理解题五六、理解题六 一、理解题1 #include <stdio.h>int main(void) {int (*p)[5] NULL; // 定义一个指向 拥有5个整型数据的数组…

Tessy学习系列(三):单元测试——官方例程isValueInRange

一、工程创建 &#xff08;1&#xff09;新建工程 注意&#xff1a;工程名称以及路劲不能包含空格和中文 &#xff08;2&#xff09;新建测试集与单元测试模块 新建测试集 新建单元测试模块 设置测试模块为单元测试模块并选择GNU GCC编译器如果需要其他的编译器&#xff0c;…

力扣每日一题 6/10

881.救生艇[中等] 题目&#xff1a; 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…

kubesz(一键安装k8s)

引言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。kubeasz 是一个用于快速搭建 Kubernetes 高可用集群的项目&#xff0c;它基于 Ansible&#xff0c;通过提供一套简单、易用的配置&#xff0c;使得…

杨校老师项目之基于SpringBoot的理发店的预约管理系统

原系统是SSMJSP页面构成&#xff0c;先被修改为SpringBoot JSP页面 自助下载渠道: https://download.csdn.net/download/kese7952/89417001&#xff0c;或 点我下载 理发师信息&#xff1a; 理发师详细信息 公告信息 员工登录&#xff1a; 管理员登录

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

有点好玩的python运维脚本

python运维脚本 1. 常用端口扫描2. 文件整理 1. 常用端口扫描 在计算机网络中&#xff0c;端口是一个通信端点&#xff0c;允许不同的进程或服务通过网络连接和交换数据。端口通过数值来标识&#xff0c;并与特定的协议相关联。未采取适当安全措施而保持端口开放&#xff0c;可…

上位机图像处理和嵌入式模块部署(f407 mcu vs h750)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在目前工业控制上面&#xff0c;f103和f407是用的最多的两种stm32 mcu。前者频率低一点&#xff0c;功能少一点&#xff0c;一般用在低端的嵌入式设…

搞懂银行的各类号码 — Account Number, Routing Number 和 Swift Code

1. 前言2. 名词解释 2.1. Debit Card Number 储蓄卡卡号2.2. Account Number 账户号码2.3. Routing Number 路由号码2.4. SWIFT Code SWIFT 号码3. 查找信息 3.1. 支票3.2. 网上银行3.3. 手机银行4. SWFIT Code 4.1. 看懂 SWIFT Code4.2. 询问银行4.3. Google 大神4.4. 部分常用…

GitLab代码导出 gitlab4j-api 实现

目录 GitLab简介 GitLab 的主要特点包括&#xff1a; GitLab代码导出 gitlab4j-api 添加 gitlab4j-api 依赖 使用 gitlab4j-api 获取特定命名空间下的所有项目 说明 注意事项 GitLab简介 GitLab 是一个开源的代码仓库和协作平台&#xff0c;主要用于版本控制和源代码管理…

堆和栈(heap and stack)

1、堆&#xff1a;一块内存空间&#xff0c;可以从中分配一个小buffer&#xff0c;用完后再把它放回去。 2、栈&#xff1a;也是一块内存空间&#xff0c;cpu的sp寄存器指向它&#xff0c;它可以用于函数调用、局部变量、多任务系统里保存现场。 PUSH [r3-r6,lr]; #将r3到r6寄…

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗 一.数据二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数三.其它 有人说未来几年,推理功耗能降低为现在的几万分之一,好奇怎么能做到呢 一.数据 二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数 import…

Docker Swarm集群部署管理

Docker Swarm集群管理 文章目录 Docker Swarm集群管理资源列表基础环境一、安装Docker二、部署Docker Swarm集群2.1、创建Docker Swarm集群2.2、添加Worker节点到Swarm集群2.3、查看Swarm集群中Node节点的详细状态信息 三、Docker Swarm管理3.1、案例概述3.2、Docker Swarm中的…

1035 插入与归并(测试点6)

solution 类型判断&#xff1a;插入排序中已排序的部分有序&#xff0c;未排序的和原数组元素相同&#xff1b;否则为归并排序测试点6&#xff1a;对于归并排序的子序列长度&#xff0c;不能简单视为前k个有序则子序列长度就是k 例如该测试用例的归并排序的子序列长度应该为2&…

C# BindingSource 未完

数据绑定导航事件数据验证自定义示例示例总结 在 C#中&#xff0c; BindingSource 是一个非常有用的控件&#xff0c;它提供了数据绑定的基础设施。 BindingSource 允许开发者将数据源&#xff08;如数据库、集合、对象等&#xff09;与用户界面控件&#xff08;如文本框、下…

测试基础12:测试用例设计方法-边界值分析

课程大纲 1、定义 经验发现&#xff0c;较多的错误往往发生在输入或输出范围的边界上&#xff0c;因为边界值是代码判断语句的点&#xff0c;一般容易出问题&#xff08;数值写错、多加或丢失等号、写错不等号方向…&#xff09;。所以增加对取值范围的边界数据的测试&#xff…

Vue3父组件如何访问子组件属性和方法

本篇内容主要是父组件如何访问子组件的属性和方法 文章目录 子组件 //son.vue代码const list (info) >{console.log(info) }const name ref("XXXX")//子组件向父组件暴露了一个方法&#xff0c;然后父组件就可以去使用子组件里面的一些属性和方法了 //子组件向…

车载电子电气架构 - 智能座舱技术及功能应用

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【Vue】请求动态渲染数据

目标 请求获取数据存入 vuex, 映射渲染 安装 axios yarn add axios准备actions 和 mutations App.vue页面中调用 action, 获取数据 验证数据是否存储成功 动态渲染 cart-item.vue

第2回 从0x7c00到0x90000

将数据段寄存器ds的值变成了0x07c0,方便了之后访问内存时利用这个段基址进行寻址,接下来,我们带着这两行代码继续往下看6行: 此时ds寄存器的值已经是0x07c0了,然后用同样的方式将es寄存器的值变成0x9000,接着又把cs寄存器的值变成256。 好的,此时ds,es,cx寄存器的值,都…