【InternLM 大模型实战】第四课

news2024/9/25 17:22:36

XTuner 大模型单卡低成本微调实战

  • FINETUNE简介
    • 指令跟随微调
    • 增量预训练微调
    • LoRA & QLoRA
  • XTuner简介
    • 功能亮点
      • 适配多种生态
      • 适配多种硬件
  • 8GB 显卡玩转LLM
    • Flash Attention
    • DeepSpeed ZeRO
  • 动手实战环节
    • 环境配置
    • 微调
      • 准备配置文件
      • 模型下载
      • 数据集下载
      • 修改配置文件
      • 开始微调
      • 将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹
    • 部署与测试
      • 将 HuggingFace adapter 合并到大语言模型
      • 与合并后的模型对话
      • Demo
    • 自定义微调
      • 场景需求
      • 数据准备
      • 将数据转为 XTuner 的数据格式
      • 开始自定义微调
      • XTuner!启动!
      • pth 转 huggingface
      • 部署与测试
    • 【补充】用 MS-Agent 数据集 赋予 LLM 以 Agent 能力
      • 概述
      • 添加 serper 环境变量
      • xtuner + agent,启动!

FINETUNE简介

LLM下游应用中,增量预训练和指令跟随是经常会用到的两种微调模式
在这里插入图片描述

指令跟随微调

使用场景:让模型学会对话模板,根据人类指令进行对话
训练数据:高质量的对话,问答数据

为什么需要指令微调?
因为在对话中模型只是根据我们的提问去拟合训练数据集中的分布,它并没有意识你的意图是在向它提问。
通过指令微调后,便可得到instructed LLM,可以输出我们更加相对满意的结果

在进行指令跟随微调前,先定义三个角色
System:给定一些上下文信息,例如我们想微调一个安全的AI助手,那System就是“你是一个安全的AI助手”。
User:用户提问,在微调时将对话样本的提问赋予此角色
Assistant:根据用户提问,结合System上下文信息,输出回答,在微调时将对话样本的回答赋予此角色

这样便构建好了一个对话模板
在这里插入图片描述
不同的模型使用的指令各不同
在这里插入图片描述
在这里插入图片描述
指令跟随微调的训练
由于希望模型学会的是答案而不是问题,因此训练时只对答案计算损失
在这里插入图片描述

增量预训练微调

使用场景:让基座模型学习到一些新知识,如某个垂类领域的常识
训练数据:文章,书籍,代码等

训练LLM时,是为了让模型学会回答一个陈述句,因此相比指令跟随微调,增量预训练的对话模板中,system和user部分留空,只保留assistant。训练数据也不是对话数据,而是陈述句
在这里插入图片描述
计算损失时同样计算答案的损失即可。
在这里插入图片描述

LoRA & QLoRA

为什么要使用LoRA,如果不使用lora,那么微调时的显存开销会非常大。
lora的原理:比起对大模型的参数全面训练,lora则是在保持原模型参数不变的情况下,在原本的linear旁新增一些可训练分支(Adapter)使得输出结果拟合训练样本,Adapter参数量远小于原本的linear,能大幅减低训练的显存消耗

qlora是对lora的一种改进,使得加载模型到显存时直接量化成4bit,并且gpu满了就会到cpu上进行调度,虽然慢了,但是整个训练还能进行下去

在这里插入图片描述

XTuner简介

傻瓜式:以配置文件的形式封装了大部分微调场景,0基础的非专业人员也能一键开始微调
轻量级:对于7B参数量的LLM,微调所需的显存仅为8GB,满足大部分消费级显卡

功能亮点

适配多种生态

多种微调算法:多种微调策略与算法,覆盖各类SFT场景
适配多种开源生态:支持加载HuggingFace、ModelScope模型或数据集
自动优化加速:开发者无需关注复杂的显存优化与计算加速细节

适配多种硬件

训练方案覆盖NVIDIA20系以上所有显卡
最低只需8GB显存即可微调7B模型
在这里插入图片描述

8GB 显卡玩转LLM

Flash Attention 和 DeepSpeed ZeRO 是 XTuner 最重要的两个优化技巧

Flash Attention

Flash Attention 将Attention 计算并行化。避免了计算过程中 Attention Score NxN的显存占用(训练过程的N都比较大)

DeepSpeed ZeRO

ZeRO优化,通过将训练过程中的参数,梯度和优化器状态切片保存,能够在多GPU训练时显著节省显存
除了将训练中间状态切片外,DeepSpeed 训练时使用FP16的权重,相较于Pytorch的AMP训练在单GPU上也能大幅节省显存。
在这里插入图片描述
为了能让开发者专注于数据,XTuner会自动dispatch Flash Attention,并一键启动DeepSpeed ZeRO
对于QLora,则在启动时使用参数 --deepspeed deepspeed_zero3

下面是优化前与优化后显存占用情况
在这里插入图片描述

动手实战环节

环境配置

创建开发机
创建公钥及配置
安装XTuner并激活

# 如果你是在 InternStudio 平台,则从本地 clone 一个已有 pytorch 2.0.1 的环境:
/root/share/install_conda_env_internlm_base.sh xtuner0.1.9
# 如果你是在其他平台:
conda create --name xtuner0.1.9 python=3.10 -y

# 激活环境
conda activate xtuner0.1.9

代码准备

# 进入家目录 (~的意思是 “当前用户的home路径”)
cd ~
# 创建版本文件夹并进入,以跟随本教程
mkdir xtuner019 && cd xtuner019


# 拉取 0.1.9 的版本源码
git clone -b v0.1.9  https://github.com/InternLM/xtuner
# 无法访问github的用户请从 gitee 拉取:
# git clone -b v0.1.9 https://gitee.com/Internlm/xtuner

# 进入源码目录
cd xtuner

# 从源码安装 XTuner
pip install -e '.[all]'

新建工作文件夹

# 创建一个微调 oasst1 数据集的工作路径,进入
mkdir ~/ft-oasst1 && cd ~/ft-oasst1

微调

准备配置文件

XTuner 提供多个开箱即用的配置文件,用户可以通过下列命令查看:

# 列出所有内置配置
xtuner list-cfg

拷贝一个配置文件到当前目录:

cd ~/ft-oasst1
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

配置文件名的解释:

xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

模型名 internlm_chat_7b
使用算法 qlora
数据集 oasst1
把数据集跑几次 跑3次:e3 (epoch 3 )
*无 chat比如 internlm-7b 代表是基座(base)模型

模型下载

由于下载模型很慢,用教学平台的同学可以直接复制模型

cp -r /root/share/temp/model_repos/internlm-chat-7b ~/ft-oasst1/

数据集下载

由于 huggingface 网络问题,咱们已经给大家提前下载好了,复制到正确位置即可

cd ~/ft-oasst1
# ...-guanaco 后面有个空格和英文句号啊
cp -r /root/share/temp/datasets/openassistant-guanaco .

修改配置文件

cd ~/ft-oasst1
vim internlm_chat_7b_qlora_oasst1_e3_copy.py
# 修改模型为本地路径
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'

# 修改训练数据集为本地路径
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = './openassistant-guanaco'

开始微调

# 单卡
## 用刚才改好的config文件训练
xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

# 多卡
NPROC_PER_NODE=${GPU_NUM} xtuner train ./internlm_chat_7b_qlora_oasst1_e3_copy.py

# 若要开启 deepspeed 加速,增加 --deepspeed deepspeed_zero2 即可

将得到的 PTH 模型转换为 HuggingFace 模型,即:生成 Adapter 文件夹

mkdir hf
export MKL_SERVICE_FORCE_INTEL=1

xtuner convert pth_to_hf ./internlm_chat_7b_qlora_oasst1_e3_copy.py ./work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_1.pth ./hf

部署与测试

将 HuggingFace adapter 合并到大语言模型

xtuner convert merge ./internlm-chat-7b ./hf ./merged --max-shard-size 2GB
# xtuner convert merge \
#     ${NAME_OR_PATH_TO_LLM} \
#     ${NAME_OR_PATH_TO_ADAPTER} \
#     ${SAVE_PATH} \
#     --max-shard-size 2GB

与合并后的模型对话

由于不同模型厂商prompt-template不同,我们这里用的基座模型是internlm-chat
所以–prompt-template internlm_chat

# 加载 Adapter 模型对话(Float 16)
xtuner chat ./merged --prompt-template internlm_chat

# 4 bit 量化加载
# xtuner chat ./merged --bits 4 --prompt-template internlm_chat

Demo

修改 cli_demo.py 中的模型路径

- model_name_or_path = "/root/model/Shanghai_AI_Laboratory/internlm-chat-7b"
+ model_name_or_path = "merged"

运行 cli_demo.py 以目测微调效果

python ./cli_demo.py

xtuner chat 的启动参数

启动参数
–prompt-template 指定对话模板
–system 指定SYSTEM文本
–system-template 指定SYSTEM模板
–bits LLM位数
–bot-name bot名称
–with-plugins 指定要使用的插件
–no-streamer 是否启用流式传输
–lagent 是否使用lagent
–command-stop-word 命令停止词
–answer-stop-word 回答停止词
–offload-folder 存放模型权重的文件夹(或者已经卸载模型权重的文件夹)
–max-new-tokens 生成文本中允许的最大 token 数量
–temperature 温度值
–top-k 保留用于顶k筛选的最高概率词汇标记数
–top-p 如果设置为小于1的浮点数,仅保留概率相加高于 top_p 的最小一组最有可能的标记
–seed 用于可重现文本生成的随机种子

自定义微调

场景需求

基于 InternLM-chat-7B 模型,用 MedQA 数据集进行微调,将其往医学问答领域对齐

数据准备

以 Medication QA 数据集为例

在这里插入图片描述

将数据转为 XTuner 的数据格式

目标格式:(.jsonL)

[{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
},
{
    "conversation":[
        {
            "system": "xxx",
            "input": "xxx",
            "output": "xxx"
        }
    ]
}]

开始自定义微调

此时,我们重新建一个文件夹来玩“微调自定义数据集”

mkdir ~/ft-medqa && cd ~/ft-medqa

把前面下载好的internlm-chat-7b模型文件夹拷贝过来。

cp -r ~/ft-oasst1/internlm-chat-7b .

别忘了把自定义数据集,即几个 .jsonL,也传到服务器上。

git clone https://github.com/InternLM/tutorial
cp ~/tutorial/xtuner/MedQA2019-structured-train.jsonl .

准备配置文件

# 复制配置文件到当前目录
xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .
# 改个文件名
mv internlm_chat_7b_qlora_oasst1_e3_copy.py internlm_chat_7b_qlora_medqa2019_e3.py

# 修改配置文件内容
vim internlm_chat_7b_qlora_medqa2019_e3.py
减号代表要删除的行,加号代表要增加的行。

# 修改import部分
- from xtuner.dataset.map_fns import oasst1_map_fn, template_map_fn_factory
+ from xtuner.dataset.map_fns import template_map_fn_factory

# 修改模型为本地路径
- pretrained_model_name_or_path = 'internlm/internlm-chat-7b'
+ pretrained_model_name_or_path = './internlm-chat-7b'

# 修改训练数据为 MedQA2019-structured-train.jsonl 路径
- data_path = 'timdettmers/openassistant-guanaco'
+ data_path = 'MedQA2019-structured-train.jsonl'

# 修改 train_dataset 对象
train_dataset = dict(
    type=process_hf_dataset,
-   dataset=dict(type=load_dataset, path=data_path),
+   dataset=dict(type=load_dataset, path='json', data_files=dict(train=data_path)),
    tokenizer=tokenizer,
    max_length=max_length,
-   dataset_map_fn=alpaca_map_fn,
+   dataset_map_fn=None,
    template_map_fn=dict(
        type=template_map_fn_factory, template=prompt_template),
    remove_unused_columns=True,
    shuffle_before_pack=True,
    pack_to_max_length=pack_to_max_length)

XTuner!启动!

xtuner train internlm_chat_7b_qlora_medqa2019_e3.py --deepspeed deepspeed_zero2

pth 转 huggingface

同前述,这里不赘述了。将得到的-pth-模型转换为-huggingface-模型即生成adapter文件夹

部署与测试

同前述。部署与测试

【补充】用 MS-Agent 数据集 赋予 LLM 以 Agent 能力

概述

MSAgent 数据集每条样本包含一个对话列表(conversations),其里面包含了 system、user、assistant 三种字段。其中:

system: 表示给模型前置的人设输入,其中有告诉模型如何调用插件以及生成请求

user: 表示用户的输入 prompt,分为两种,通用生成的prompt和调用插件需求的 prompt

assistant: 为模型的回复。其中会包括插件调用代码和执行代码,调用代码是要 LLM 生成的,而执行代码是调用服务来生成结果的

一条调用网页搜索插件查询“上海明天天气”的数据样本示例如下图所示:
在这里插入图片描述
微调步骤参考前面

添加 serper 环境变量

开始 chat 之前,还要加个 serper 的环境变量:

去 serper.dev 免费注册一个账号,生成自己的 api key。这个东西是用来给 lagent 去获取 google 搜索的结果的。等于是 serper.dev 帮你去访问 google,而不是从你自己本地去访问 google 了。
在这里插入图片描述
添加 serper api key 到环境变量:

export SERPER_API_KEY=abcdefg

xtuner + agent,启动!

xtuner chat ./internlm-chat-7b --adapter internlm-7b-qlora-msagent-react --lagent

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用python连接elasticsearch

有一个困惑了好久的问题,那就是从python里面连接elasticsearch总是报错。大致长这样 一开始我是看网上把es的安全功能关闭,也就是下面的内容,这个要进入到es的docker中去改config/elasticsearch.yml配置文件,但是这样改了以后kib…

【origin】负载牵引的Smith圆图

【origin】负载牵引的Smith圆图 1.从ADS导入数据到origin2.smith圆图3.扩展到多组线4.参考资料 1.从ADS导入数据到origin export导出为txt,得到的是幅相值,复制到excel如下图,有多根类似格式的线,只需要复制DE列到origin中 复制到…

单主机双屏幕实现跨屏幕信息交互的GUI程序

单主机双屏幕实现跨屏幕信息交互的GUI程序 运行程序界面 屏幕1发送数据,屏幕2接收数据 在屏幕1按下打开开关,屏幕2播放视频 代码程序 import tkinter as tk # 导入tkinter模块,用于创建GUI界面 import threading # 导入threading模块&#…

智能雾化壁炉设计,新时代科技与美学的完美结合

智能雾化壁炉设计,新时代科技与美学的完美结合 随着科技的不断创新,智能雾化壁炉设计成为家居设计领域的一颗耀眼明珠。它的出现不仅改变了传统壁炉的概念,更为我们带来了全新的视觉和感官体验。下面让我们一起探索智能雾化壁炉设计的优势和特…

企业网盘:实现数据跨境传输,助力企业出海的必备工具

今年是“一带一路”十周年。在这十年间,中国和“一带一路”共建国家携手并行,贸易持续增长发展。在如今经济全球化的大方向下,跨国经济合作将会是各国共识。 目前,中外合作企业、跨境企业已成为国际贸易发展趋势。不过&#x…

腾讯滑块(1-13,js逆向)

前言:之前打算写的猿人学比赛题系列因为种种原因耽搁了,主要还是比完赛之后热情就少了很多,看到评论区有人说做了这么久才做出一题,这里需要狡辩一下,我虽然菜但是还没到那种地步,比赛两天时间里我跟队友是…

mac快捷创建文件的方法

mac快捷创建文件的方法 在macbook的使用中,当我们在桌面或访达等地方使用右键时,可以看到新建文件夹的选项,却怎么也找不到创建文件的选项。这种情况有时候会带来不便。这篇文章给大家带来一个非常简单解决这个问题。 下载 在App Store中搜索…

FPGA的MARK_DEBUG调试之波形抓取

一、描述 在工作时发现FPGA向ARM传输的数据有问题,因此想抓取一下FPGA的波形。作为传统方式使用示波器抓取过于麻烦,因此使用VIVADO自带的DEBUG功能抓取输出的数据波形。 先上几个比较好的学习链接: https://www.cnblogs.com/tubujia/p/924…

制造领域 基础概念快速入门介绍

1、基本背景知识 本定义结合国家标准文件有所发挥,仅供参考。 产品:是生产企业向用户或市场以商品形式提供的制成品; 成套设备:在生产企业一般不用装配工序连接,但用于完成相互联系的使用功能的两个或两个以上的产…

支持向量机(公式推导+举例应用)

文章目录 引言间隔与支持向量机对偶问题(拉格朗日乘子法)SMO算法核函数软间隔与正则化软间隔正则化(罚函数法) 模型的稀疏性结论实验分析 引言 在机器学习领域,支持向量机(Support Vector Machine&#xf…

网络——华为与华三

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号:网络豆云计算学堂 座右铭:低头赶路,敬事如仪 个人主页: 网络豆的主页​​​​​ 写在前面 大家好,我是网络豆&#xff0…

Go语言认识

Go语言认识 1. Go语言的设计背景2. Go语言的历程3. Go语言对比分析4. Go语言未来的发展规划5. 要不要选择Go 关注 go博客 直接了解第一手资料。 go文档 了解go的全貌。 1. Go语言的设计背景 Go语言(也称为Golang)是由Google开发的一种编程语言。它的设计…

中国电子学会2020年6月份青少年软件编程Scratch图形化等级考试试卷一级真题(含答案)

1.以下哪段程序可以实现小猫向左移动? A. B. C. D. 2.小猫给公园设计了如下的平面图,它想把黑色的路变成棕色,请问需要点击几次油漆桶按钮? A.3 B9 C.1 D.10 3.默认的小猫有两个造型(分别为造型1和造型2)。在运行下面的程序后,没有看到…

【信号与系统】【北京航空航天大学】实验一、信号的MATLAB表示及信号运算

一、实验目的 1、初步掌握 MATLAB 仿真软件的使用; 2、学习使用 MATLAB 产生基本时域信号,并绘制信号波形; 3、学习利用 MATLAB 实现信号的基本运算; 4、利用 MATLAB 分析常用的连续时域信号。 二、实验内容 1、 生成连续信号 …

什么是设备管理系统?设备管理系统解决方案有何优势?

随着企业规模的不断扩大以及设备功能增加以及复杂性,对设备的管理提出新的挑战。由此各设备管理系统随即涌入市场。设备管理系统是对设备的运行情况、维修情况等进行记录并快速维修,达到提高设备维修效率,优化设备生命周期的综合性解决方案系…

【idea】idea插件编写教程,博主原创idea插件 欢迎下载

前言:经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参, 例如日常开发中 我们使用Objects.equals去比较 status(入参),statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() ,再比…

Flask 小程序菜品搜索

mina/pages/food/index.wxml <!--index.wxml--> <!--1px 750/320 2.34rpx;--> <view class"container"><!--轮播图--><view class"swiper-container"><swiper class"swiper_box" autoplay"{{autoplay}…

品牌帮助中心:提升企业客户服务水平与效率的实用指南

什么是品牌帮助中心&#xff1f;简单来理解&#xff0c;他就是一种加速问题解决效率的方式&#xff0c;是通过在官网设置文章库或者社区的形式&#xff0c;为客户提供自助服务&#xff0c;自我查找问题答案。是一种既能提升问题解决效率&#xff0c;又能提升品牌形象的方式。接…

【LeetCode】203. 移除链表元素(简单)——代码随想录算法训练营Day03

题目链接&#xff1a;203. 移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,6,3,4,5,6], val 6 输出&#xff…

蓝牙音视频远程控制协议(AVRCP) AV/C command格式介绍

零.声明 本专栏文章我们会以连载的方式持续更新&#xff0c;本专栏计划更新内容如下&#xff1a; 第一篇:蓝牙综合介绍 &#xff0c;主要介绍蓝牙的一些概念&#xff0c;产生背景&#xff0c;发展轨迹&#xff0c;市面蓝牙介绍&#xff0c;以及蓝牙开发板介绍。 第二篇:Trans…