LLM(二)| LIMA:在1k高质量数据上微调LLaMA1-65B,性能超越ChatGPT

2023-09-22 10:19:10

       本文将介绍在Lit-GPT上使用LoRA微调LLaMA模型,并介绍如何自定义数据集进行微调其他开源LLM

监督指令微调(Supervised Instruction Finetuning)

什么是监督指令微调?为什么关注它?

       目前大部分LLM都是decoder-only,通常是续写任务,有时候未必符合用户的需求,SFT是通过构造指令输入和期待的输出数据微调LLM,让LLM根据输入的指令输出期待的内容,这样微调好的LLM会输出更符合用户需求或者特点任务,

图片

SFT数据格式一般如下所示:

  1. Instruction text

  2. Input text (optional)

  3. Output text

Input是可选的,下面是SFT数据格式的示例:

图片

       SFT的微调和Pre-training是一样的,也是根据上文预测下一个token,如下图所示:

图片

SFT数据集如何生成?

       SFT数据集构建通常有两种方法:人工标注使用LLM(比如GPT-4)来生成的,人工标注对于构建垂直领域比较合适,可以减少有偏数据,但是成本略高;使用LLM生成,可以在短时间内生成大量数据。

        SFT数据集构建以及SFT微调Pipeline如下图所示:

图片

LLM生成SFT数据方法总结

Self-Instruct

       Self-Instruct(https://arxiv.org/abs/2212.10560):一个通过预训练语言模型自己引导自己来提高的指令遵循能力的框架。

Self-Instruct有如下四个阶段:

  • 步骤1:作者从 175个种子任务中随机抽取 8 条自然语言指令作为示例,并提示InstructGPT生成更多的任务指令。

  • 步骤2:作者确定步骤1中生成的指令是否是一个分类任务。如果是,他们要求 InstructGPT 根据给定的指令为输出生成所有可能的选项,并随机选择特定的输出类别,提示 InstructGPT 生成相应的“输入”内容。对于不属于分类任务的指令,应该有无数的“输出”选项。作者提出了“输入优先”策略,首先提示 InstructGPT根据给定的“指令”生成“输入”,然后根据“指令”和生成的“输入”生成“输出”。

  • 步骤3:基于第 2 步的结果,作者使用 InstructGPT 生成相应指令任务的“输入”和“输出”,采用“输出优先”或“输入优先”的策略。

  • 步骤4:作者对生成的指令任务进行了后处理(例如,过滤类似指令,去除输入输出的重复数据),最终得到52K条英文指令

完整的Self-Instruct流程如下图所示:

图片

       Alpaca dataset(https://github.com/gururise/AlpacaDataCleaned)的52K数据就是采用该方法生成的。

Backtranslation

       回译在传统的机器学习中是一种数据增强方法,比如从中文翻译成英文,再从英文翻译会中文,这样生成的中文与原来的中文在语义上是一致的,但是文本不同;然而SFT数据生成的回译(https://arxiv.org/abs/2308.06259)则是通过输出来生成指令,具体步骤如下图所示:

图片

LIMA

        LIMA来自论文《The LIMA: Less Is More for Alignment》,LIMA是在LLaMA V1 65B模型上使用1k高质量数据进行微调获得的,性能如下:

图片

在Lit-GPT库上微调LLM

Lit-GPT支持的模型如下表所示:

Model and usageReference
Meta AI Llama 2Touvron et al. 2023
Stability AI FreeWilly2Stability AI 2023
Stability AI StableCodeStability AI 2023
TII UAE FalconTII 2023
OpenLM Research OpenLLaMAGeng & Liu 2023
LMSYS VicunaLi et al. 2023
LMSYS LongChatLongChat Team 2023
Together RedPajama-INCITETogether 2023
EleutherAI PythiaBiderman et al. 2023
StabilityAI StableLMStability AI 2023
PlatypusLee, Hunter, and Ruiz 2023
NousResearch Nous-HermesOrg page
Meta AI Code LlamaRozière et al. 2023

下面以LLaMA2-7B为例说明在 上进行微调的步骤,首先需要clone 

Lit-GPT仓库,微调步骤如下:

1)下载、准备模型

export HF_TOKEN=your_tokenpython scripts/download.py \  --repo_id meta-llama/Llama-2-7b-hf​​​​​
python scripts/convert_hf_checkpoint.py \  --checkpoint_dir meta-llama/Llama-2-7b-hf

2)准备微调数据​​​​​​​

python scripts/prepare_lima.py \  --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf

3)使用LoRA进行微调​​​​​​​

python finetune/lora.py \  --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf \  --data_dir data/lima

Tips

       官方建议数据的tokens控制在2048之内,可以减少GPU显存消耗,对应的代码也需要增加参数--max_seq_length 2048​​​​​​​

python scripts/prepare_lima.py \    --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf \    --max_seq_length 2048

      或者也可以修改 finetune/lora.py文件中的参数change override_max_seq_length = None调整为 override_max_seq_length = 2048 

对于LIMA模型的1k数据进行微调,需要调整max_iters=1000

图片

Lit-GPT上支持的数据集

图片

Lit-GPT定义客户化数据集

加载自定义数据集大致需要两步,首先需要准备三列CSV数据,示例如下:

图片

第一步,执行如下脚本:​​​​​​​

python scripts/prepare_csv.py \   --csv_dir MyDataset.csv \   --checkpoint_dir checkpoints/meta-llama/Llama-2-7b-hf

第二步,与上述LIMA类似,是执行scripts/prepare_dataset.py脚本

参考文献:

[1] https://lightning.ai/pages/community/tutorial/optimizing-llms-from-a-dataset-perspective/

更多推荐

【校招VIP】前端JS之深拷贝和浅拷贝

考点介绍js中的浅拷贝和深拷贝,只是针对复杂数据类型(Objcet,Array)的复制问题。简单来讲浅拷贝和深拷贝都可以实现在原有对象的基础上再生成一份的作用。但是根据新生成的对象能否影响到原对象可以分为浅拷贝和深拷贝。前端JS之深拷贝和浅拷贝-相关题目及解析内容可点击文章末尾链接查看!一、考点题目1.实现浅拷贝的方法

RenderDoc基础类 + Python“基础”代码

这应该是国内第一份甚至是唯一份讲renderDoc的免费二开的文档,基于Python,Qt等(这是一个冷门的学科,本身做TA比例就只有1/10,技术TA的比例又1/10,然后会做工具几年资历的又1/10,假如1000个观众,应该只有1个观众会往下看,谢谢观看!!)RenderDoc生命周期和常用类qdCaptureVi

webpack、vue.config.js

一、webpack学习简述webpack是一个静态资源打包工具,它会以一个或多个文件作为打包的入口,将我们整个项目的文件编译组合成一个或多个文件输出出去。输出的文件就是编译好的文件,可以运行在浏览器中。一般的我们将webpack输出的文件叫做bundle为什么需要打包工具随着现在前端技术的发展,我们会使用各种框架(Vu

化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设

化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设化工DCS/SIS/MIS系统时钟同步(NTP服务器)建设目前计算机网络中各主机和服务器等网络设备的时间基本处于无序的状态。随着计算机网络应用的不断涌现,计算机的时间同步问题成为愈来愈重要的事情。以Unix系统为例,时间的准确性几乎影响到所有的文件操作。如果一台

python经典百题之判断回文数

题目:一个5位数,判断它是不是回文数即12321是回文数,个位与万位相同,十位与千位相同程序分析回文数是指一个数从左向右和从右向左读是一样的,例如:12321。我们需要编写一个程序来判断一个5位数是否是回文数。方法1:转换成字符串defis_palindrome(num):num_str=str(num)returnn

2023年海南省职业院校技能大赛(高职组)信息安全管理与评估赛项规程

2023年海南省职业院校技能大赛(高职组)信息安全管理与评估赛项规程一、赛项名称赛项名称:信息安全管理与评估英文名称:InformationSecurityManagementandEvaluation赛项组别:高等职业教育赛项归属产业:电子与信息大类二、竞赛目标为全面贯彻落实国家网络强国战略,对接新一代信息技术产业,

java中mysql事务嵌套回滚

在Java开发中,MySQL事务嵌套回滚时经常会遇到。本文将介绍如何在Java中处理MySQL事务嵌套回滚的问题。在开始之前,我们需要先了解什么是事务嵌套回滚。当在一个事务中嵌套了其他事务并且其中一个事务回滚时,该事务及其所有嵌套的事务都会被回滚。这可以保持数据的一致性。但是,重要的是,要正确处理异常和回滚。下面是Ja

良好的测试环境应该怎么搭建?对软件产品起到什么作用?

为了确保软件产品的高质量,搭建一个良好的测试环境是至关重要的。在本文中,我们将从多个角度出发,详细描述良好的测试环境的搭建方法、注意事项以及对软件产品的作用。一、软件测试环境的搭建1、从硬件设备的选择与配置开始。对于大型软件产品的测试,建议使用高性能的服务器以及分布式测试平台。在选择服务器时,要考虑产品的特性、测试需求

【结构型】享元模式(Flyweight)

目录享元模式(Flyweight)适用场景享元模式实例代码(Java)享元模式(Flyweight)运用共享技术有效地支持大量细粒度的对象。(业务模型的对象进行细分得到科学合理的更多对象)适用场景一个应用程序使用了大量的对象。完全由于使用大量的对象,造成很大的存储开销。对象的大多数状态都可变为外部状态。如果删除对象的外

【2023集创赛】加速科技杯作品:高光响应的二硫化铼光电探测器

本文为2023年第七届全国大学生集成电路创新创业大赛(“集创赛”)加速科技杯西北赛区二等奖作品分享,参加极术社区的【有奖征集】分享你的2023集创赛作品,秀出作品风采,分享2023集创赛作品扩大影响力,更有丰富电子礼品等你来领!团队介绍参赛单位:西北工业大学队伍名称:噜啦噜啦咧指导老师:李伟参赛队员:程琳,韩笑,尹天乐

苹果手机怎么录屏?1分钟轻松搞定

虽然一直使用苹果手机,但是对它的录屏功能还不是很会使用。苹果手机怎么录屏?录屏可以录制声音吗?麻烦大家教教我!苹果手机为用户提供了十分便捷的内置录屏功能,可以让您随时随地录制手机上的内容。但是很多小伙伴在第一次使用苹果手机时,找不到苹果手机的录屏工具在哪,所以不知道该如何进行录屏。那么,苹果手机怎么录屏呢?下面将给大家

热文推荐