ChatGLM-6B的P-Tuning微调详细步骤及结果验证

这篇具有很好参考价值的文章主要介绍了ChatGLM-6B的P-Tuning微调详细步骤及结果验证。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. ChatGLM-6B

ChatGLM-6B仓库地址:https://github.com/THUDM/ChatGLM-6B

ChatGLM-6B/P-Tuning仓库地址:https://github.com/THUDM/ChatGLM-6B/tree/main/ptuning

1.1 P-Tuning v2简介

P-Tuning是一种较新的模型微调方法,它采用了参数剪枝的技术,可以将微调的参数量减少到原来的0.1%。具体来说,P-Tuning v2是基于P-Tuning v1的升级版,主要的改进在于采用了更加高效的剪枝方法,可以进一步减少模型微调的参数量。

P-Tuning v2的原理是通过对已训练好的大型语言模型进行参数剪枝,得到一个更加小巧、效率更高的轻量级模型。具体地,P-Tuning v2首先使用一种自适应的剪枝策略,对大型语言模型中的参数进行裁剪,去除其中不必要的冗余参数。然后,对于被剪枝的参数,P-Tuning v2使用了一种特殊的压缩方法,能够更加有效地压缩参数大小,并显著减少模型微调的总参数量。

总的来说,P-Tuning v2的核心思想是让模型变得更加轻便、更加高效,同时尽可能地保持模型的性能不受影响。这不仅可以加快模型的训练和推理速度,还可以减少模型在使用过程中的内存和计算资源消耗,让模型更适用于各种实际应用场景中。

2. 运行环境

本项目租借autoDL GPU机器,具体配置如下:

ChatGLM-6B的P-Tuning微调详细步骤及结果验证

ChatGLM-6B的P-Tuning微调详细步骤及结果验证

2.1 项目准备

1.创建conda环境

conda create -n tuning-chatglm python=3.8
conda activate tuning-chatglm

2.拉取ChatGLM-6B项目代码

# 拉取代码
git clone https://github.com/THUDM/ChatGLM-6B.git

# 安装依赖库
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

3.进入ptuning目录

运行微调需要4.27.1版本的transformers。除 ChatGLM-6B 的依赖之外,还需要安装以下依赖

cd ptuning
# 再次安装依赖,ptuning文档里有说明
pip install rouge_chinese nltk jieba datasets  -i https://pypi.tuna.tsinghua.edu.cn/simple/

4.补充

对于需要pip安装失败的依赖,可以采用源码安装的方式,具体步骤如下

git clone https://github.com/huggingface/peft.git
cd peft
pip install -e .

3.数据准备

官方微调样例是以 ADGEN (广告生成) 数据集为例来介绍微调的具体使用。

ADGEN 数据集为根据输入(content)生成一段广告词(summary),具体格式如下所示:

{
    "content": "类型#上衣*版型#宽松*版型#显瘦*图案#线条*衣样式#衬衫*衣袖型#泡泡袖*衣款式#抽绳",
    "summary": "这件衬衫的款式非常的宽松,利落的线条可以很好的隐藏身材上的小缺点,穿在身上有着很好的显瘦效果。领口装饰了一个可爱的抽绳,漂亮的绳结展现出了十足的个性,配合时尚的泡泡袖型,尽显女性甜美可爱的气息。"
}

请从官网下载 ADGEN 数据集,放到ptuning目录下并将其解压到 AdvertiseGen 目录。

下载地址:https://drive.google.com/file/d/13_vf0xRTQsyneRKdD1bZIr93vBGOczrk/view

tar -zxvf AdvertiseGen.tar.gz

ChatGLM-6B的P-Tuning微调详细步骤及结果验证

查看数据集大小:

> wc -l AdvertiseGen/*
> 1070 AdvertiseGen/dev.json
> 114599 AdvertiseGen/train.json
> 115669 total

4.使用P-Tuning v2对ChatGLM-6B微调

对于 ChatGLM-6B 模型基于 P-Tuning v2 进行微调。可将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,最低只需要 7GB 显存即可运行。

进入到ptuning目录,首先,修改train.sh脚本,主要是修改其中的train_filevalidation_filemodel_name_or_pathoutput_dir参数:

  • train_file:训练数据文件位置
  • validation_file:验证数据文件位置
  • model_name_or_path:原始ChatGLM-6B模型文件路径
  • output_dir:输出模型文件路径
PRE_SEQ_LEN=128
LR=2e-2

CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_train \
    --train_file AdvertiseGen/train.json \
    --validation_file AdvertiseGen/dev.json \
    --prompt_column content \
    --response_column summary \
    --overwrite_cache \
    --model_name_or_path model/chatglm-6b \
    --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 16 \
    --predict_with_generate \
    --max_steps 3000 \
    --logging_steps 10 \
    --save_steps 1000 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4

执行bash train.sh脚本,运行过程如下:

  0%|                  | 0/3000 [00:00<?, ?it/s]
...  
{'loss': 4.2962, 'learning_rate': 0.0196, 'epoch': 0.01}
{'loss': 4.3112, 'learning_rate': 0.019533333333333333, 'epoch': 0.01}
  2%|███▊             | 70/3000 [03:20<4:17:06,  2.81s/it]

即使用了P-Tuning v2进行参数高效微调,但训练的速度还是很慢。

V100 32G显存的机器,训练花了4个多小时,显存占用率在85%左右

可以修改train.sh增大batch_size继续训练,由于时间及机器性能问题,本人没有进行操作过。

PRE_SEQ_LEN=128
LR=2e-2

CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_train \
    --train_file AdvertiseGen/train.json \
    --validation_file AdvertiseGen/dev.json \
    --prompt_column content \
    --response_column summary \
    --overwrite_cache \
    --model_name_or_path model/chatglm-6b \
    --output_dir output/adgen-chatglm-6b-pt-$PRE_SEQ_LEN-$LR \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_train_batch_size 128 \
    --per_device_eval_batch_size 8 \
    --gradient_accumulation_steps 16 \
    --predict_with_generate \
    --max_steps 3000 \
    --logging_steps 10 \
    --save_steps 1000 \
    --learning_rate $LR \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4

输出文件:

> ls -al /root/autodl-tmp/tuning-chatglm/ChatGLM-6B/ptuning/output/adgen-chatglm-6b-pt-128-2e-2/
total 12
drwxrwxr-x 2 root root   98 Apr 24 21:12 .
drwxrwxr-x 8 root root  177 Apr 24 17:12 ..
-rw-rw-r-- 1 root root  195 Apr 24 21:12 all_results.json
-rw-rw-r-- 1 root root 1185 Apr 24 21:12 trainer_state.json
-rw-rw-r-- 1 root root  195 Apr 24 21:12 train_results.json

5. 模型评估

修改evaluate.sh文件,修改model_name_or_path(模型路径),ptuning_checkpointP-Tuning v2微调之后的权重路径)等参数:

  • model_name_or_path:原始ChatGLM-6B模型文件路径
  • ptuning_checkpoint:训练完成后,生成的文件目录

运行:bash evaluate.sh

PRE_SEQ_LEN=128
CHECKPOINT=adgen-chatglm-6b-pt-128-2e-2
STEP=3000

CUDA_VISIBLE_DEVICES=0 python3 main.py \
    --do_predict \
    --validation_file AdvertiseGen/dev.json \
    --test_file AdvertiseGen/dev.json \
    --overwrite_cache \
    --prompt_column content \
    --response_column summary \
    --model_name_or_path model/chatglm-6b \
    --ptuning_checkpoint ./output/$CHECKPOINT/checkpoint-$STEP \
    --output_dir ./output/$CHECKPOINT \
    --overwrite_output_dir \
    --max_source_length 64 \
    --max_target_length 64 \
    --per_device_eval_batch_size 1 \
    --predict_with_generate \
    --pre_seq_len $PRE_SEQ_LEN \
    --quantization_bit 4

再次查看output输出文件:

ChatGLM-6B的P-Tuning微调详细步骤及结果验证

模型评估花了3个多小时

6. 利用微调后的模型进行验证

6.1 微调后的模型

新建infer.py文件

import os
import torch
from transformers import AutoConfig, AutoModel, AutoTokenizer


MODEL_PATH = "./model/chatglm-6b"
CHECKPOINT_PATH = "./output/adgen-chatglm-6b-pt-128-2e-2/checkpoint-1000"

# 载入Tokenizer
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)

config = AutoConfig.from_pretrained(MODEL_PATH, trust_remote_code=True, pre_seq_len=128)
model = AutoModel.from_pretrained(MODEL_PATH, config=config, trust_remote_code=True).cuda()

prefix_state_dict = torch.load(os.path.join(CHECKPOINT_PATH, "pytorch_model.bin"))
new_prefix_state_dict = {}

for k, v in prefix_state_dict.items():
    if k.startswith("transformer.prefix_encoder."):
        new_prefix_state_dict[k[len("transformer.prefix_encoder."):]] = v
model.transformer.prefix_encoder.load_state_dict(new_prefix_state_dict)

print(f"Quantized to 4 bit")
model = model.quantize(4)
model = model.half().cuda()
model.transformer.prefix_encoder.float()
model = model.eval()


print("用户:你好\n")
response, history = model.chat(tokenizer, "你好", history=[])
print("ChatGLM-6B:\n",response)
print("\n------------------------------------------------\n用户:")

line = input()
while line:
    response, history = model.chat(tokenizer, line, history=history)
    print("ChatGLM-6B:\n", response)
    print("\n------------------------------------------------\n用户:")
    line = input()

6.2 原始ChatGLM-6B模型

新建infer_base.py文件

import torch
from transformers import AutoTokenizer, AutoModel

tokenizer = AutoTokenizer.from_pretrained("./model/chatglm-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("./model/chatglm-6b", trust_remote_code=True).half().cuda()
model = model.eval()

while True:
    a = input("请输入您的问题:(输入q以退出)")
    if a.strip() == 'q':
        exit()
    response, history = model.chat(tokenizer, "问题:" + a.strip() + '\n答案:', max_length=256, history=[])
    print("回答:", response)

6.3 结果对比

相同输入,上面窗口为原始ChatGLM-6B模型回答,下方为微调后模型回答。

ChatGLM-6B的P-Tuning微调详细步骤及结果验证文章来源地址https://www.toymoban.com/news/detail-460595.html

到了这里,关于ChatGLM-6B的P-Tuning微调详细步骤及结果验证的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 第七篇-Tesla P40+ChatGLM2+P-Tuning

    https://huggingface.co/THUDM/chatglm2-6b 下载模型相关文件到自己目录 我的是/models/chatglm2-6b 创建环境安 一定注意数据中格式,符号中英文等等 train_loss 要小,如果1,2这种未调出的效果很差 如果调整了数据集,要清理缓存,缓存目录如下 /root/.cache/huggingface/datasets output/adgen-chatglm2-6b

    2024年02月13日
    浏览(14)
  • 基于chatGLM-6B模型微调详细教程(linux版)(ptuning & lora)

    基于chatGLM-6B模型微调详细教程(linux版)(ptuning & lora)

    目录 准备工作 安装7z ptuning预训练 ChatGLM-6B-Ptuning.7z 懒人包下载 上传文件并解压缩 拉取依赖 进行训练 启动服务 注意事项(揽睿星舟云算力平台) lora预训练 chatGLM-All-In-One.7z 懒人包下载 上传文件并解压缩 拉取依赖 进行训练 启动服务 注意事项(揽睿星舟云算力平台) 展示

    2024年02月09日
    浏览(13)
  • LLM微调 | Prefix-Tuning, Prompt-Tuning, P-tuning, P-tuning-v2

    🔥 下面我只是分析讲解下这些方法的原理以及具体代码是怎么实现的,不对效果进行评价,毕竟不同任务不同数据集效果差别还是挺大的。 hard prompt (离散):即人类写的自然语言式的prompt。 soft prompt (连续):可训练的权重,可以理解为伪prompt。【毕竟nn是连续的模型,在连续

    2024年02月14日
    浏览(29)
  • 人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

    人工智能大语言模型微调技术:SFT 监督微调、LoRA 微调方法、P-tuning v2 微调方法、Freeze 监督微调方法

    SFT(Supervised Fine-Tuning)监督微调是指在源数据集上预训练一个神经网络模型,即源模型。然后创建一个新的神经网络模型,即目标模型。目标模型复制了源模型上除了输出层外的所有模型设计及其参数。这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目

    2024年02月15日
    浏览(14)
  • 对 ChatGLM-6B 做 LoRA Fine-tuning

    ChatGLM-6B 是一个支持中英双语的对话语言模型,基于 GLM (General Language Model)。它只有 62 亿个参数,量化后最低 (INT4 量化) 只需要 6GB 的显存,完全可以部署到消费级显卡上。在实际使用这个模型一段时间以后,我们发现模型的对话表现能力确实非常不错。那么,基于这个模型做

    2023年04月25日
    浏览(13)
  • 聊聊ChatGLM-6B医疗数据微调

    聊聊ChatGLM-6B医疗数据微调

    转载请注明出处: https://www.cnblogs.com/zhiyong-ITNote/ 参考了多个医疗大模型,如扁鹊、灵心等,重新思考了下微调的方案以及数据集的格式;基于ChatGLM/其它LLM整合多种微调方法的非官方实现的框架,审视其数据集格式,以及调试效果,进行微调。 最终基于liucongg/ChatGLM-Finetuning开

    2024年03月16日
    浏览(12)
  • 学习实践ChatGLM-6B(部署+运行+微调)

    学习实践ChatGLM-6B(部署+运行+微调)

    该模型基于 General Language Model (GLM) 架构,具有 62 亿参数。 注:结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 ChatGLM-6B可以实现的能力这是一个对话机器人,所以基本的问答,系统都支持。 官方提供的使用实例: 自我认知

    2023年04月18日
    浏览(10)
  • ChatGLM2-6B微调实践-QLora方案

    ChatGLM2-6B微调实践-QLora方案

    申请阿里云GPU服务器: CentOS 7.6 64 Anaconda3-2023.07-1-Linux-x86_64 Python 3.11.5 GPU NVIDIA A10(显存24 G/1 core) CPU 8 vCore/30G 安装Anaconda、CUDA、PyTorch 参考:ChatGLM2-6B微调实践-P-Tuning方案 项目部署 准备数据集 准备我们自己的数据集,分别生成训练文件和测试文件这两个文件,放在项目dat

    2024年02月07日
    浏览(15)
  • windows下实现对chatGLM-6B的微调

    windows下实现对chatGLM-6B的微调

    默认读者已成功部署chatGLM-6B,如果没有部署完毕,请参阅下列文章(同为笔者所写) https://blog.csdn.net/Asunazhang/article/details/130094252?spm=1001.2014.3001.5502 打开cmd切换至虚拟环境,调用下列代码安装依赖。 3.1 下载数据集 从 https://link.zhihu.com/?target=https%3A//cloud.tsinghua.edu.cn/f/b3f119a008

    2024年02月04日
    浏览(11)
  • 自然语言处理 微调ChatGLM-6B大模型

    自然语言处理 微调ChatGLM-6B大模型

    bert的主要任务是随机的去除掉某个单词,使用上下文将其预测出来(相当于完形填空任务); GPT的主要任务是根据前面一句话,预测下面的内容; GLM结合了bert的强大双向注意力与gpt的强大生成能力两种能力,被nask的地方使用单向注意力,未被mask的地方使用双向注意力 预测

    2024年02月09日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包