当前位置:   article > 正文

LoRA微调技术文档

lora微调

LoRA微调技术文档

摘要

本文档介绍了如何使用 LoRA(Low-Rank Adaptation)技术进行预训练模型的微调。LoRA 是一种基于低秩矩阵适应的方法,旨在通过有效的参数学习,提高模型在特定任务上的性能。我们将详细介绍 LoRA 的原理、实现步骤,以及如何将其应用于微调预训练模型。此外,我们还提供了一些最佳实践和注意事项,以帮助用户更好地使用 LoRA 技术。

1. 简介

LoRA(Low-Rank Adaptation)是一种适用于预训练模型的微调方法,旨在通过自适应的低秩参数学习,提高模型在特定任务上的性能。LoRA 技术可以应用于各种自然语言处理(NLP)任务,如文本分类、命名实体识别、语义分割等。

2. LoRA 的原理

LoRA 的核心思想是在微调阶段引入低秩矩阵,减少模型参数,从而在保持模型能力的前提下降低计算和存储开销。具体来说,LoRA 使用两个全连接层,一个高秩层和一个低秩层,来进行适应性的参数学习。低秩层通过学习高秩层的一些重要特征,从而减少参数数量,提高模型的泛化能力。

3. LoRA 的实现步骤

以下是使用 LoRA 进行微调的基本步骤:

  1. 加载预训练模型:首先,选择一个合适的预训练模型,例如 BERT、RoBERTa 等。加载预训练的权重,准备用于微调的数据集。

  2. 定义模型架构:在原始模型的基础上,构建适合任务的特定头部(task-specific head)。

  3. 引入 LoRA 层:在模型的中间层引入 LoRA 层,即一个低秩矩阵层,用于学习适应任务的低秩参数。

  4. 微调:使用任务数据对整个模型进行微调,通过梯度下降等优化算法来更新模型参数。

  5. 评估性能:使用验证集或测试集评估微调后模型的性能,并进行必要的调优。

4. 如何应用 LoRA

在实际应用中,可以按照以下步骤使用 LoRA 进行微调:

  1. 选择合适的预训练模型:根据任务需求,选择一个与任务相关的预训练模型。

  2. 定义任务头部:根据任务类型,构建特定任务的头部,如全连接层、卷积层等。

  3. 引入 LoRA:在模型的中间层引入 LoRA 层,设置合适的低秩参数。

  4. 微调模型:使用任务数据集对整个模型进行微调,设置优化器和损失函数。

  5. 性能评估:使用验证集或测试集评估微调后模型的性能,调整超参数以达到最佳效果。

5. 最佳实践和注意事项

  • 适当的低秩参数选择:选择合适的低秩参数可以平衡模型性能和计算开销。

  • 数据增强:在微调过程中,使用数据增强技术有助于提高模型的泛化能力。

  • 学习率策略:选择合适的学习率策略有助于训练稳定的模型。

github官网教程

https://github.com/hiyouga/ChatGLM-Efficient-Tuning/blob/main/README_zh.md

修改 ChatGLM-6B 自我认知的例子(来自上方github)

一、环境配置

首先你需要准备一台性能足够的运算设备,建议使用 Unix 操作系统。本框架的推荐运行配置如下表所述:

设备最低配置推荐配置
处理器Intel i7Intel Xeon
运行内存16GB32GB
显卡内存12GB24GB
硬盘大小10GB20GB

本案例中默认电脑已经配置完毕 CUDA 运算环境。如果存在 CUDA 环境配置的问题,可以关注本项目之后将要发布的 Docker 安装包。

我们推荐使用 Conda 虚拟环境安装依赖,从而避免破坏外部项目的依赖,运行以下命令创建 Conda 虚拟环境并安装 Python 依赖:

git clone https://github.com/hiyouga/ChatGLM-Efficient-Tuning.git
conda create -n chatglm_etuning python=3.10
conda activate chatglm_etuning
cd ChatGLM-Efficient-Tuning
pip install -r requirements.txt
  • 1
  • 2
  • 3
  • 4
  • 5

注:本项目默认会联网获取最新的 ChatGLM-6B 模型,其版本可能影响代码效果甚至报错,建议使用官方最新的模型版本文件。若频繁出现网络无法连接,请尝试使用下述命令下载官方模型,并在每次训练或推理时添加 --model_name_or_path [本地 ChatGLM-6B 模型路径] 参数。

git lfs install
git clone -b v0.1.0 https://huggingface.co/THUDM/chatglm-6b
  • 1
  • 2

二、数据集准备

在本案例中,我们使用 self_cognition 数据集,该数据集包含了 18 条关于模型自我认知的数据,我们的目标是修改模型自身的知识,使模型给出我们希望的答复。数据集的内容请查看 data/self_cognition.json,这里我们列出两条示例。

[
    {
      "instruction": "你身份是什么?",
      "input": "",
      "output": "我叫ChatGLM-6B,是一个由[NAME]于2023年独立训练和开发的人工智能助手。我的主要目标是协助用户解决问题和满足他们的需求。"
    },
    {
      "instruction": "你的身份信息能告诉我吗?",
      "input": "",
      "output": "当然可以,我是ChatGLM-6B,一个由[NAME]创建的人工智能助手。我在2023年研发完成,旨在为用户提供有针对性的回答和帮助。"
    }
]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

提示:您可以将 [NAME] 换成您自己的名字,从而让模型回答它的创造者是您。

注:本框架内置了十余种指令数据集,其简要介绍请移步 data 文件夹。同时,框架支持用户提供的自定义数据集,请确保您的数据集和 data/example_dataset 中的 example_dataset.json 文件格式相同。其中 instruction 项和 output 项为必需项,以保证模型的监督微调(SFT)能够正常运行。

三、模型监督微调

运行以下命令在单个 GPU 上进行模型监督微调。我们使用 self_cognition 数据集,采用 lora 微调方法,微调后的模型保存在 cognition 文件夹中。为了保证模型微调成功,我们采用 0.001 的学习率,在数据集上训练 10 个 epoch。

CUDA_VISIBLE_DEVICES=0 python src/train_bash.py \
    --stage sft \
    --do_train \
    --dataset self_cognition \
    --finetuning_type lora \
    --output_dir cognition \
    --overwrite_cache \
    --per_device_train_batch_size 2 \
    --gradient_accumulation_steps 2 \
    --lr_scheduler_type cosine \
    --logging_steps 10 \
    --save_steps 1000 \
    --warmup_steps 0 \
    --learning_rate 1e-3 \
    --num_train_epochs 10.0 \
    --fp16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

框架运行日志如下图所示。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6nAzjTcc-1691748853657)(media/alter_self_cognition_1.jpg)]

四、模型效果测试

运行以下命令在单个 GPU 上测试模型效果,它会加载 cognition 文件夹内保存的微调模型权重,并合并进原版 ChatGLM-6B 模型的参数权重中,同时启动流式交互窗口。

CUDA_VISIBLE_DEVICES=0 python src/cli_demo.py \
    --checkpoint_dir cognition
  • 1
  • 2

向微调后的 ChatGLM-6B 模型问一些自我认知问题,我们可以发现它能够给出我们期望的回答。同时,我们还测试了两个额外的问题,验证结果说明模型的原本知识并没有被严重破坏

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4jpahwG6-1691748853658)(media/alter_self_cognition_2.jpg)]

为了对比效果,我们同时测试了原版 ChatGLM-6B 模型的回答,下图为原版模型的回答,关于自身认知的回答与上图相比有着显著不同。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bO9vfcmG-1691748853658)(media/alter_self_cognition_3.jpg)]

五、模型部署

如果要将微调后的模型部署在您的项目框架中,请使用 export_model.py 将微调后的权重合并到 ChatGLM-6B 模型中并导出完整模型。

python src/export_model.py \
    --checkpoint_dir cognition \
    --output_dir path_to_save_model
  • 1
  • 2
  • 3

通过类似如下代码的调用方式,您可以在任何项目中独立部署微调后的模型。

from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained(path_to_save_model, trust_remote_code=True)
model = AutoModel.from_pretrained(path_to_save_model, trust_remote_code=True).half().cuda()
response, history = model.chat(tokenizer, "你是谁", history=[])
print(response)
  • 1
  • 2
  • 3
  • 4
  • 5
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号