当前位置:   article > 正文

修改 ChatGLM2-6B 自我认知的 Lora 微调教程_chatglm2 lora

chatglm2 lora

0. 背景

现在开始学习微调,主要学习 Lora 微调。

这次尝试了修改 ChatGLM2-6B 自我认知,文章中记录了整个微调过程。

1. 部署微调项目

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

2. 数据集说明

我们使用 self_cognition 数据集,该数据集包含了 18 条关于模型自我认知的数据,我们的目标是修改模型自身的知识,使模型给出我们希望的答复。

首先,对数据做以下修改,

sed -i 's/ChatGLM-6B/ChatGLM2-6B/g' data/self_cognition.json

# 提示:您可以将 [NAME] 换成您自己的名字,从而让模型回答它的创造者是您。
sed -i 's/\[NAME\]/AI小镇/g' data/self_cognition.json
  • 1
  • 2
  • 3
  • 4

其次,查看 data/self_cognition.json,这里我们列出两条示例。

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

3. 模型监督微调(Lora)

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

CUDA_VISIBLE_DEVICES=0 python src/train_sft.py \
    --do_train \
    --use_v2 \
    --dataset self_cognition \
    --finetuning_type lora \
    --lora_rank 32 \
    --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
  • 17

运行结果日志如下,

在这里插入图片描述

4. 模型效果测试

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

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

向微调后的 ChatGLM2-6B 模型问一些自我认知问题,我们可以发现它能够给出我们期望的回答。

同时,我们还测试了两个额外的问题,验证结果说明模型的原本知识并没有被严重破坏。

在这里插入图片描述

5. 导出微调模型

如果要将微调后的模型部署在您的项目框架中,请使用 export_model.py 将微调后的权重合并到 ChatGLM2-6B 模型中并导出完整模型。(提示:output_dir 不要使用大写字母)

python src/export_model.py \
    --use_v2 \
    --checkpoint_dir cognition \
    --output_dir ./chatglm2_6b_lora
  • 1
  • 2
  • 3
  • 4

然后访问 https://huggingface.co/THUDM/chatglm2-6b/tree/main,将 configuration_chatglm.pymodeling_chatglm.pyquantization.pytokenization_chatglm.py 4个文件下载到 ./chatglm2_6b_lora 目录下面。

然后执行下面命令,修改几个配置值。

sed -i 's/THUDM\/chatglm2-6b--//g' ./chatglm2_6b_lora/config.json
sed -i 's/THUDM\/chatglm2-6b/\.\.\/chatglm2_6b_lora/g' ./chatglm2_6b_lora/config.json
sed -i 's/THUDM\/chatglm2-6b--//g' ./chatglm2_6b_lora/tokenizer_config.json
sed -i 's/THUDM\/ChatGLM2-6B/\.\.\/chatglm2_6b_lora/g' ./chatglm2_6b_lora/modeling_chatglm.py
sed -i 's/THUDM\/chatglm2-6b/\.\.\/chatglm2_6b_lora/g' ./chatglm2_6b_lora/modeling_chatglm.py
  • 1
  • 2
  • 3
  • 4
  • 5

6. 调用导出的模型

创建 chatglm2_6b_lora.py,

cat << EOF > chatglm2_6b_lora.py
from transformers import AutoTokenizer, AutoModel
tokenizer = AutoTokenizer.from_pretrained('./chatglm2_6b_lora', trust_remote_code=True)
model = AutoModel.from_pretrained('./chatglm2_6b_lora', trust_remote_code=True).half().cuda()
response, history = model.chat(tokenizer, "你是谁?", history=[])
print(response)
EOF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行 chatglm2_6b_lora.py,

python chatglm2_6b_lora.py
  • 1

输出结果如下,

在这里插入图片描述
完结!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/169644
推荐阅读
相关标签
  

闽ICP备14008679号