【书生·浦语】大模型实战营——第四课笔记

教程链接:https://github.com/InternLM/tutorial/blob/main/xtuner/README.md
视频链接:https://www.bilibili.com/video/BV1yK4y1B75J/?vd_source=5d94ee72ede352cb2dfc19e4694f7622
本次视频的内容分为以下四部分:
在这里插入图片描述
目录

微调简介

在这里插入图片描述
微调会使LLM在具体的领域中输出更好的回答。有两种微调模式:
1、增量预训练微调:学会垂类领域的常识(只需要回答
2、指令跟随微调:学会对话模板(一问一答
场景与所需的训练数据不一样。

实际对话时,通常会存在三种角色:
1、System:要求系统担任一个具体的角色
2、User:用户进行提问
3、Assistant:根据user输入,结合system上下文,做出回答
这些机械性的工作已经用xtuner打包好了,一键启动即可。

指令跟随微调时,不同的对话模板

在这里插入图片描述
不同的模型在微调时的数据会使用不同的prompt模板。
比如LlaMa2,会用sys的块来表示system内容,INST的块来表示User指令部分。而InternLM的模板则有五个。
而在部署时,system部分是由模板自动添加的,用户的输入则放入user部分,而system部分使用的模板可以自行更改。

增量预训练微调

在这里插入图片描述
只需要计算assistant部分的损失

微调原理

在这里插入图片描述原来的大模型权重参数主要集中于linear中,这个linear形状非常大,如果对其进行微调,那么所需的显存非常高,训练非常贵。
lora是在原来的linear旁边加了一个支路(由两个小的linear组成),通常叫作Adapter
微调时只对Adapter进行训练,而预训练的权重冻住,就能降低很多显存占用。

全参数微调、LoRA、QLoRA对比
QLoRA是加载模型时使用4bit量化的方式进行加载。
正常模型训练时一般都是使用float32,相当于降低了精度。降低了表达精度,自然能力会下降些。

XTuner微调框架

在这里插入图片描述
简介图片就不介绍了。
在这里插入图片描述
xtuner数据引擎弄了很多个数据集的映射函数,方便开发者多关注模型,不用费心处理数据格式。
在这里插入图片描述
当显卡显存更大时,当然要尽可能利用显卡的资源,增加其并行性。这里xtuner可以做多样本的数据拼接,一下子输入好几个数据,占满显存,提升效率。

8GB显存玩转LLM

Flash Attention和DeepSpeed ZeRO是xtuner最重要的两个优化技巧。
在这里插入图片描述

在这里插入图片描述

动手实战环节

ssh连接开发机后敲bash进入环境。
在这里插入图片描述

创建环境与激活

敲入以下命令,新建一个conda环境,这个环境叫xtuner0.1.9

conda create --name xtuner0.1.9 python=3.10 -y

在这里插入图片描述
键入以下命令,进入环境

conda activate xtuner0.1.9

在这里插入图片描述

安装xtuner源码

在这里插入图片描述
在这里插入图片描述
下载过程会有点久,需要耐心等待。
下载完成后,创建一个微调 oasst1 数据集的工作路径,进入

mkdir ~/ft-oasst1 && cd ~/ft-oasst1

微调

准备配置文件

xtuner list-cfg

可以列出所有内置的配置文件。如下图所示
在这里插入图片描述
其中,每个字符串的含义如下:
第一个字符串代表是哪个大模型,如baichuan2
第二个字符串代表模型参数,如13B
第三个字符串代表模型类型,如base基座模型或chat聊天模型
第四个字符串代表微调算法,使用lora还是qlora还是全参数微调
第五个字符串代表在哪个数据集上微调,如alpaca
第六个字符串代表跑几个epoch

在这里插入图片描述
通过xtuner的copy-cfg命令拷贝一个配置文件到指定目录中,是internlm7b,用qlora微调,在oasst1数据集上微调,跑3个epoch
这个过程会比较久,要等一两分钟。

模型下载

用教学平台的同学直接从目录中进行复制
在这里插入图片描述

数据集下载

本身数据集在hugging face上,平台已经提前下载好放到share目录里了。直接拷贝即可。
在这里插入图片描述

修改配置文件

修改配置文件py里的预训练模型路径和数据路径。
在这里插入图片描述
再改epoch参数为1
在这里插入图片描述
常用的超参对应的意义
在这里插入图片描述
其中max_length和batch_size可以调整所占用的显卡资源。

开始微调

使用以下命令进行微调:

xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

在这里插入图片描述
其中的warning信息不用理。
在这里插入图片描述
上图的loading shards指的是加载基座模型的过程。

接下来在准备数据集。
在这里插入图片描述
可以看到下图中有个map。Map操作就是将数据集映射到标准训练格式,User,System啥的
在这里插入图片描述
看到这个Epoch(train)就说明微调已经开始了。其中eta是剩余的训练时间。这里看到是4:21:51,要接近4个半小时。
在这里插入图片描述
此时按Ctrl+C,终止微调过程。我们发现,微调时会多出一个目录叫work_dirs,存储微调时的日志文件。
在这里插入图片描述
在进行下一次训练时,最好先删除上次的工作路径。

在这里插入图片描述
加上deepspeed参数来加速训练。我们可以从下图看到,加速后的微调预计的剩余时间直接减少了三倍多,变成1:16:44了。可见deepspeed加速训练的效果。
在这里插入图片描述
为了保持训练不被中断,引入tmux这个库,引入守护进程。
在这里插入图片描述
在这里插入图片描述
使用tmux创建一个会话,命令如下

tmux new -s finetune

这个时候进入了一个全新的界面,此时属于一个tmux session中,这个session叫finetune
在这里插入图片描述
此时按Ctrl+B手指松开再按D就可以推出tmux的窗口。
如何重新进入这个session呢?输入tmux attach -t finetune命令即可。
在这里插入图片描述
此时再输入训练命令(带deepspeed参数的),就不怕训练被打断了。

xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py --deepspeed deepspeed_zero2

此时可以随便进入、退出这个tmux窗口。
一个小时后见!
好的,睡得有点迷糊,感觉睡晕过去了。
tmux窗口中看到类似这样的输出,就算训练成功了。
在这里插入图片描述

查看微调后的目录文件

在这里插入图片描述
从目录中可以看到一个pth结尾的文件,pth通常是模型参数文件的后缀,因为只训练了一个epoch,所以这里只有一个epoch_1的模型文件。

还可以进入以日期命名的目录,这里存放了日志文件,可以cat进行查看。
在这里插入图片描述

将得到的pth模型文件转换为hugging face的lora模型

在这里插入图片描述
当看到All done! 时,说明转换已经成功。
在这里插入图片描述
这个adapter_model.safetensors就是hugging face的lora模型。
在这里插入图片描述

部署与测试

将huggingface adapter合并到大语言模型

敲入以下命令并耐心等待,看到All Done,即转换成功。
在这里插入图片描述
可以查看merged目录(合并后的目录)有的文件
在这里插入图片描述

与合并后的模型进行对话

敲以下命令并耐心等待
在这里插入图片描述
当看见double enter to end input,就可以开始对话了。输完问题后,需要敲两次回车才能开始回复。
在这里插入图片描述
从资源监控我们可以看到,占用了17G的显存。
在这里插入图片描述

这里可以载入4bit量化后的模型,看看差异。
在这里插入图片描述
实际运行时,可以看到4bit量化的模型,回答速度非常快。
在这里插入图片描述

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

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

相关文章

【ArcGIS遇上Python】ArcGIS Python批量筛选多个shp中指定字段值的图斑(以土地利用数据为例)

文章目录 一、案例分析二、提取效果二、代码运行效果三、Python代码四、数据及代码下载一、案例分析 以土地利用数据为例,提取多个shp数据中的旱地。 二、提取效果 原始土地利用数据: 属性表: 提取的旱地:(以图层名称+地类名称命名)

数据结构——排序算法之快速排序

个人主页:日刷百题 系列专栏:〖C/C小游戏〗〖Linux〗〖数据结构〗 〖C语言〗 🌎欢迎各位→点赞👍收藏⭐️留言📝 ​ ​ 前言: 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法。 基本思想&…

弟12章 1 网络编程

文章目录 网络协议概述 p164TCP协议与UDP协议的区别 p165 网络协议概述 p164 ipv4:十进制点分制 ipv6:十六进制冒号分隔 TCP协议与UDP协议的区别 p165 tcp协议的三次握手:

MySQL单表查询

显示所有职工的基本信息。 mysql8.0 [chap03]>select * from worker; 查询所有职工所属部门的部门号,不显示重复的部门号。 mysql8.0 [chap03]>select distinct(部门号) from worker; 求出所有职工的人数。 mysql8.0 [chap03]>select count(*) from …

山西电力市场日前价格预测【2024-01-14】

日前价格预测 预测说明: 如上图所示,预测明日(2024-01-14)山西电力市场全天平均日前电价为415.13元/MWh。其中,最高日前电价为851.84元/MWh,预计出现在18:15。最低日前电价为198.87元/MWh,预计…

04.neuvector进程策略生成与管控实现

原文链接,欢迎大家关注我的github 一、进程学习管控的实现方式 策略学习实现: 进程的学习与告警主要依据通过netlink socket实时获取进程启动和退出的事件: 1.创建netLink socket; 2.通过创建netlink的fd对进程的事件进行捕获与更新&#x…

“超人练习法”系列08:ZPD 理论

01 先认识一个靓仔 看过 Lev Vygotsky 这个人的书吗?他是一位熟练心理学家,对人们习得技能的方式非常感兴趣,但他 37 岁的时候就因肺炎英年早逝了。 他认为社会环境对学习有关键性的作用,认为社会因素与个人因素的整合促成了学习…

计算机网络 —— 数据链路层

数据链路层 3.1 数据链路层概述 数据链路层把网络层交下来的数据构成帧发送到链路上,以及把收到的帧数据取出并上交给网络层。链路层属于计算机网络的底层。数据链路层使用的信道主要由以下两种类型: 点对点通信。广播通信。 数据链路和帧 链路&…

UniRepLKNet实战:使用 UniRepLKNet实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

LV.13 D10 Linux内核移植 学习笔记

一、Linux内核概述 1.1 内核与操作系统 内核 内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性 操作系统 操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、…

基于Java SSM框架实现企业车辆管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现企业车辆管理系统演示 JSP技术 JSP技术本身是一种脚本语言,但它的功能是十分强大的,因为它可以使用所有的JAVA类。当它与JavaBeans 类进行结合时,它可以使显示逻辑和内容分开,这就极大的方便了运动员的需求…

关于html导出word总结一

总结 测试结果不理想,html-to-docx 和 html-docx-js 最终导出的结果 都 差强人意,效果可以见末尾的附图 环境 "electron": "24.3.0" 依赖库 html-docx-js html-docx-js - npm html-to-docx html-to-docx - npm file-saver…

如何将重复方法封装为Aop切面并结合注解使用

首先要导入依赖 <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId> </dependency> 编写注解 package com.yg.domain.note;import java.lang.annotation.ElementType; import java.lang.annotation.Rete…

PyCharm连接服务器 - 2

文章目录 PyCharm连接服务器-21.如何连接服务器&#xff1f;2.如何在终端窗口打开SSH连接&#xff1f;3.Terminal终端出现中文乱码的解决办法&#xff1f;4.如何查看远程服务器的树目录结构&#xff1f;5.如何配置代码同步&#xff1f;6.如何为项目配置远程服务器中的python解释…

前端 TS 语法继承 多态 修饰符 readonly 抽象类 ts 基本写法 可选 剩余参数 函数重载 接口 类(3)

继承 继承之间的叫法 A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 子类 ---》派生类 基类 ---》超类&#xff08;父类&#xff09; // 继承之间的叫法 // A类继承了B类&#xff0c;那么A类叫做子类&#xff0c;B类叫成基类 // 子类 ---》派生类 // 基类 …

【C++ 程序设计入门基础】- 第4节-函数

1、函数 函数是对实现某一功能的代码的模块化封装。 函数的定义&#xff1a; 标准函数&#xff1a; 输入 n 对整数的 a、b &#xff0c;输出它们的和。 #include <iostream> #include <windows.h> using namespace std;int add(int a,int b);//函数原型声明int…

ppt怎么录屏录音并且导出?好用录屏软件推荐

ppt已经成为了日常工作与学习中必不可少的工具&#xff0c;而ppt屏幕录制功能&#xff0c;可以方便用户将他人的演讲或视频中的内容记录下来&#xff0c;以便进一步学习与研究。录制ppt演示并将其导出为视频文件&#xff0c;可以帮助我们进行分享&#xff0c;但是很多人不知道p…

uniapp 制作 wgt 包(用于 app 的热更新)

升级版本号 修改 manifest.json 的配置&#xff0c;应用版本名称和应用版本号 必须高于上一版的值。 制作 wgt 包 发布 wgt 包 打开 uni-admin 项目的升级中心 上传后会自动生成下载链接 app 的静默热更新 发布新版后&#xff0c;用户打开app&#xff0c;后台会自动下载 wgt…

【NR技术】RRC状态转移以及RRC重建立过程

1 概述 本文介绍NR RRC状态转移的过程以及RRC重建立相关的过程。 2 RRC状态转移 2.1 RRC connected 态到 RRC inactive转移 RRC connected到RRC inactive state状态转换&#xff0c;gNB由gNB- cu和gNB- du (s)组成的场景下&#xff0c;如图1所示 图1 RRC connected to RRC …

odoo17基础培训1-odoo开发基础知识准备以及odoo17开发环境安装

odoo17基础培训 一、odoo开发基础知识准备以及odoo17开发环境安装 1、odoo是什么&#xff1f; 当我介绍客户使用odoo系统作为业务管理平台时&#xff0c;有时会被问到Odoo是什么&#xff1f; 简单点&#xff0c;可以这么说&#xff1a; Odoo是一套完整的系统&#xff0c;是…