LLMs-入门四:基于LLaMA-Efficient-Tuning对LLMs做微调

LLMs-入门四:基于LLaMA-Efficient-Tuning对LLMs做微调


上篇地址: https://blog.csdn.net/Josong/article/details/133641423

前言

如何在Colab/JupyterLab等平台中运用自己的资料集微调(fine-tuning) Llama-2-7b 模型呢?

  • 源码地址:https://github.com/hiyouga/LLaMA-Efficient-Tuning

1、前提条件

训练Llama 2-7b至少吃的VRAM大概需要24GB,因此低于这个配置将无法进行训练/微调。

1)使用Colab对 Llama 2做微调

Colab地址:https://colab.research.google.com/
当我们基于Colab做微调时,首先需要更该【运行时类型】,更改的位置如下图所示
在这里插入图片描述
根据前提条件中的说明,要微调Llama-2-7b,需要VRAM > 24GB。因此,我们可以选择的GPU只能是“A100 GPU”。如果使用“A100 GPU”需要购买额外的计算单元,如下图所示
在这里插入图片描述

  • 如T4 GPU,如下图所示
    在这里插入图片描述
    购买额外的计算单元如“Colab Pro”,如下图所示
    在这里插入图片描述

2)使用JupyterLab对 Llama 2做微调

当我们基于JupyterLab做Llama-2-7b微调时,JupyterLab所部署的物理机GPU需要是RTX3090、RTX4090, A100 or H100 GPUs,并且VRAM > 24GB。

2、【关键命令01】依赖安装LLaMA-Efficient-Tuning

Colab与JupyterLab操作过程、命令基本相同,该文档后续都以Colab为例进行介绍。

! git clone https://github.com/hiyouga/LLaMA-Efficient-Tuning.git

1)Colab安装如图所示

在这里插入图片描述

2)JupyterLab安装如图所示

在这里插入图片描述

3、【关键命令02】进入到LLaMA-Efficient-Tuning目录

%cd LLaMA-Efficient-Tuning/

在这里插入图片描述

4、【关键命令03】安装依赖套件

! pip install -r requirements.txt

在这里插入图片描述

5、开始预训练/微调

1)介绍微调主要参数

本文以微调为示例进行介绍。下面先介绍一下微调主要参数的含义

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
    --stage sft \
    --model_name_or_path path_to_llama_model \
    --do_train \
    --dataset alpaca_gpt4_en \
    --template default \
    --finetuning_type lora \
    --lora_target q_proj,v_proj \
    --output_dir path_to_sft_checkpoint \
    --overwrite_cache \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --save_steps 1000 \
    --learning_rate 5e-5 \
    --num_train_epochs 3.0 \
    --plot_loss \
    --fp16

(1) 参数01【使用GPU】:CUDA_VISIBLE_DEVICES=0

(2) 参数02【执行】:src/train_bash.py

表示执行LLaMA-Efficient-Tuning/src目录下的train_bash.py

(3) 参数03【监督式微调】:–stage sft

表示监督式微调,“sft”为Supervised Fine-Tuning的简写

(4) 参数04【模型的名称或者路径】:–model_name_or_path path_to_llama_model

表示模型的名称或者路径,如修改成在部署时所使用的模型“daryl149/llama-2-7b-chat-hf”

(5) 参数05【使用的资料集】:–dataset alpaca_gpt4_en

在介绍该参数前先介绍一下LLaMA-Efficient-Tuning/data目录下的“预训练会使用到的一些资料集”,如下图所示,同时如果要看“预训练会使用到的一些资料集”要知道有哪些模型的资料集可以打开“dataset_info.json”
在这里插入图片描述

  • 图中【alpaca_gpt4_en】对应到右侧“dataset_info.json”中的相同的名称中的“file_name”文件名所对应的左侧LLaMA-Efficient-Tuning/data目录下的“alpaca_gpt4_data_en.json”就是要使用的预训练/微调资料集
  • 如果想看“alpaca_gpt4_data_en.json”资料集的内容我们该如何做呢?我们需要到LLaMA-Efficient-Tuning工程github中data目录下找到“alpaca_gpt4_data_en.json”
    在这里插入图片描述
  • 点击该json,然后再点击【Raw】查看该资料集的内容,如下图所示
    在这里插入图片描述
  • 在该页面中【instruction】为系统的指令,比如我们在呼叫chatGPT的时候,通常会有一个系统的指令;【input】为使用者的一个输入;【output】就是我们的输出(基于输入的正确答案),在做“sft监督式微调”时通常就是提供这几个参数值。其中,这个【output】可以通过“人工去做这个标记:只是人工去做的话,这个工作量非常的大”,目前比较主流的做法是把大量的问题丢给“chatGPT 3.5或chatGPT 4”,然后使用chatGPT 3.5或chatGPT 4”的答案来做后续【output】的一个标准/结果。
  • 除了图中【alpaca_gpt4_en】英文版本的资料,在LLaMA-Efficient-Tuning/data目录下也可以找到对应“中文版本”的资料集【alpaca_gpt4_zh】“alpaca_gpt4_data_zh.json”。该资料集完全是使用对应英文版本的资料集翻译而来。如下图所示
    在这里插入图片描述
    在这里插入图片描述

(6) 如何做自己资料集的训练?

主要是要包含这几个参数【instruction】、【input】、【output】来根据需要打造自己的资料集。我们也可以通过现有的资料集进行改造。我们以通过改造现有的资料集来进行介绍,比如我们将“alpaca_gpt4_data_zh.json”复制出一个新的json,在新的json中选取一部分语料作为新的资料集(比如截取1000多条),然后将该json重新命名为“josongdata_llm_sample.json”。将该资料集放到LLaMA-Efficient-Tuning/data目录下可以通过如下两种方式:

  • 本地上传,如下图所示
    在这里插入图片描述
  • github上下载
    如果新修改的资料集是在github上,我们也可以直接下载到LLaMA-Efficient-Tuning目录中,命令如下所示
! wget https://github.com/ywchiu/largitdata/blob/master/data/largitdata_llm_sample.json

在这里插入图片描述

(7) 【关键命令04】添加资料集到LLaMA-Efficient-Tuning中

修改“dataset_info.json”,在该json中添加刚刚下载下来的的资料集相关信息,如下图所示
在这里插入图片描述
然后将“largitdata_llm_sample.json”从下载的目录复制到data目录下,命令如下:

! cp largitdata_llm_sample.json data/

在这里插入图片描述

  • 下载的“largitdata_llm_sample.json”如上传的资源附件

(8) 参数05【修改使用的资料集参数值】:–dataset alpaca_gpt4_en

将“alpaca_gpt4_en”修改成刚刚添加到“dataset_info.json”中的信息“largitdata_llm_zh”,如下图所示
在这里插入图片描述

(9) 参数06【微调类型】:–finetuning_type lora

lora:可以节省记忆体的使用

(10) 参数07【输出训练完的模型及相关文件的目录】:–output_dir path_to_sft_checkpoint

–output_dir主要是输出训练完的模型及相关文件的目录,也可以储存训练过程中的结果。
可将“path_to_sft_checkpoint”修改成自己定义的名称,如“test_sft_ckpoint”

(11) 参数08【运行前覆盖掉cache中的资料集】:–overwrite_cache

–overwrite_cache我们也可以理解在运行前重写cache

(12) 参数09【每个设备的批次大小】:–per_device_train_batch_size 4

表示每个设备的批次大小设定为4

(13) 参数10【执行优化更新前执行的反向传播的步骤数量】–gradient_accumulation_steps 4

表示在执行优化更新前执行的反向传播的步骤数量为4

(14) 参数11【学习率调度器的类型】:–lr_scheduler_type cosine

表示我们把学习率调度器的类型设置为cosine类型,表示“余弦的一个衰减”

(15) 参数12【每多少步做记录】:–logging_steps 10

表示每10步做一个记录到日志中

(16) 参数13【每多少步保证模型1次】:–save_steps 1000

表示每1000步保存模型1次。因为本文档使用的资料集比较小,所以将1000修改为每10步保存模型1次。

(17) 参数14【设定学习率】:–learning_rate 5e-5

(18) 参数15【训练的epoch次数,根据任务进行调整】:–num_train_epochs 3.0

表示训练epoch(时期、时代)次数为3次。

(19) 参数16【损失函数曲线】:–plot_loss

(20) 参数17【半精度浮点数进行训练】:–fp16

fp16/fp32/fp64所代表的含义:

  • 双精度浮点数fp64
  • 单精度浮点数fp32
  • 半精度浮点数fp16:比较节省计算资源
    fp16/fp32/bf16比较:
  • fp32/fp16 绝大多数硬件都支持,所以可以用混合精度训练提高吞吐;但 bf16/tf32 只有新的硬件才支持,V100/昇腾910等不支持
  • bf16 具有和 fp32 相同的 range,但精度(也就是两个最小单位之间的间隔)降低
    – bf16/fp32 进行混合精度训练,可以减少溢出几率
    – 对于大型 transformer,bf16 损失的精度被证明不怎么影响收敛
  • tf32 是 A100 中引入的新格式,用于替代 fp32,也即可以全程 tf32 训练或 bf16/tf32 混合训练

2)【关键命令05】按需修改后的微调参数

! CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
    --stage sft \
    --model_name_or_path daryl149/llama-2-7b-chat-hf \
    --do_train \
    --dataset largitdata_llm_zh \
    --template default \
    --finetuning_type lora \
    --lora_target q_proj,v_proj \
    --output_dir test_sft_ckpoint \
    --overwrite_cache \
    --per_device_train_batch_size 4 \
    --gradient_accumulation_steps 4 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --save_steps 10 \
    --learning_rate 5e-5 \
    --num_train_epochs 3.0 \
    --plot_loss \
    --fp16

3)开始微调训练

(1) 执行指令

执行步骤2)的指令,执行过程如下图所示
在这里插入图片描述

(2) 下载模型的过程

在这里插入图片描述

(3) 验证过程

如下是加载验证的过程,验证完成后就会基于自己上传的资料集进行训练/微调了
在这里插入图片描述
注:免费版本的系统RAM只有12.7GB,加载模型时可能会出现RAM资源不够,造成该步骤无法通过,需要升级到Colab Pro才可以。

(4) 微调训练过程

在这里插入图片描述
说明:

  • Num examples = 1039,表示基于1039笔资料进行训练。如果用原始5万笔资料的话,GPU采用A100,训练需要大概8个小时左右。
  • Num Epochs = 3,基于5万笔资料跑完成3个Epochs的话,需要大概1天的时间(基于A100)
  • 5% 10/195,完成训练的5%,已经学习(Round)的数量为10,总共需要Round的数量为195
    在这里插入图片描述
    说明:上图中红框里表示每10步做一次保存。详情配置参见【1)介绍微调主要参数→(15)参数12【每多少步做记录】】

(5) 训练完成

在这里插入图片描述
训练完成的结果会放到“training_loss.png”中。根据该结果,我们发现正常的loss结果应该是越来越低的,而该图中这个loss反而越来越高。主要的原因是我们使用的资料集比较少(1039)以及训练步骤没有那么多的原因所致。

(6) 其他:训练完成后可以做评估/预测

训练完成后可以做评估/预测,看看是否精准
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值