当前位置:   article > 正文

人机对话之chatglm模型-ptuningv2微调实战_chatglm2微调实践

chatglm2微调实践

chatglm文本生成入门级教程,其中原理性不在赘述,实操如下:

一. 虚拟环境创建

  1. 建立虚拟环境
    conda create -n xxx python==x.x 其中xxx为你要建立的虚拟环境的名字,自定义即可。pythonx.x为这个环境要使用的python版本。比如建立使用python3.8版本的名字为py38的虚拟环境:conda create -n py38 python3.8
  2. 激活环境
    conda activate xxx 其中xxx为(1)中xxx,即虚拟环境名称。比如:conda activate py38
    在这里插入图片描述
  3. 进入虚拟环境后,安装所需的包,如果网速慢,可以用阿里源或是豆瓣等
    例如
    pip install ultralytics -i https://pypi.tuna.tsinghua.edu.cn/simple
    其他所需命令:
    退出当前虚拟环境:conda deactivate
    下述命令在退出当前虚拟环境才能用:
    删除环境:conda remove -n xxx --all
    查看现有虚拟环境:conda env list
    查看环境中的包:conda list
    建立虚拟环境conda create -n xxx python==x.x安装报错:
    解决办法:
    conda config --show-sources
    修改文件为:
ssl_verify: True
channels:
 4. http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/win-64/
 5. http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/win-64
 6. default
 7. conda-forge
show_channel_urls: True
原有
channels:
 8. https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
 9. https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
 10. defaults
show_channel_urls: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

查看gpu使用情况nvidia-smi

二. chatglm-6b模型文件下载

一般是进入huggingface官网下载,但目前官网进不去

  1. 进入虚拟环境

  2. 安装依赖:pip install -U huggingface_hub

  3. export HF_ENDPOINT=https://hf-mirror.com

  4. huggingface-cli download --resume-download --local-dir-use-symlinks False bigscience/bloom-560m --local-dir bloom-560m
    其中bigscience/bloom-560m是需要下载的模型,local-dir是要下载到的本地路径

  5. 可以链接到huggingface官网,查看模型文件、model使用

  6. 清华源模型文件下载地址(只包含bin文件,其他配置没有)

  7. 或者使用modelscope下载

三. chatglm-6b源代码下载

一般要去github上下载,目前同样进不去
git clone https://gitcode.com/THUDM/ChatGLM2-6B.git
或者进入gitcode网站下载

四. 安装模型依赖

下载源代码后,会生成一个chatglm-6b的路径

cd chatglm-6b
pip install -r requirements.txt
  • 1
  • 2

五. chat体验

修改web_demo.py中的模型文件路径,修改为自己的文件路径

tokenizer = AutoTokenizer.from_pretrained("xxx/chatglm2-6b-32k", trust_remote_code=True)
model = AutoModel.from_pretrained("xxx/chatglm2-6b-32k", trust_remote_code=True).half().cuda()
  • 1
  • 2

CUDA_VISIBLE_DEVICES=5 python web_demo.py,即可完成对话

六. 微调

  1. 下载微调数据集:微调数据集下载
  2. 安装依赖:pip install rouge_chinese nltk jieba datasets
  3. cd ptuning
  4. 修改 train.sh
PRE_SEQ_LEN=128
LR=2e-2
NUM_GPUS=1

#修改为以下命令,使用哪张卡进行训练
#torchrun --standalone --nnodes=1 --nproc-per-node=$NUM_GPUS main.py \
CUDA_VISIBLE_DEVICES=2 python main.py \
    --do_train \
    --train_file /home/bxy/zw/data/train.json \ #修改训练数据验证数据
    --validation_file /home/bxy/zw/data/dev.json \
    --preprocessing_num_workers 10 \
    --prompt_column content \ #修改数据集中的内容列名称
    --response_column summary \ #修改数据集中的label列名称
    --overwrite_cache \ #是否数据重新读入缓存,训练数据改变后要有此参数
    --model_name_or_path /homebak/home_new/baixinyu/llm/chatglm2-6b-32k \ #模型路径
    --output_dir output/adgen-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR \ #输出模型路径
    --overwrite_output_dir \
    --max_source_length 64 \ #content中的token不能超出
    --max_target_length 128 \
    --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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  1. 执行脚本:bash train.sh
  2. 训练完成后,修改evaluate.sh,完成模型评估,详情修改和train.sh大致一样
  3. 其中按照实际业务情况,需修改main.py函数
  4. 微调完成后,会在output文件保存微调后的模型

七. 使用原始模型进行文本对话生成

from transformers import AutoTokenizer, AutoModel
import pandas as pd 
import numpy as np
import json
#读入测试数据
input_data_path = 'xxx.json'
input_data = []
with open(input_data_path, 'r', encoding='utf-8') as f:
    input_data = f.readlines()

contents = [] 
summarys = [] 
for line in input_data:
    line_dict = json.loads(line.strip('\\n'))
    contents.append(line_dict['content'])
    summarys.append(line_dict['summary'])

# 模型加载
tokenizer = AutoTokenizer.from_pretrained("原始模型路径/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("原始模型路径/chatglm2-6b", trust_remote_code=True).half().cuda()
model = model.eval()

summary_generate = [] 
for content in contents:
    response, history = model.chat(tokenizer, content, history=[])
    print("提示词:", content)
    print("文本生成:", response)
    summary_generate .append(response)
# 文件保存 ,可以将提示词和生成文本进行文件保存
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

八. 使用微调后模型进行文本对话生成

import torch, os
from transformers import AutoConfig, AutoModel, AutoTokenizer
import pandas as pd
#加载微调后的模型
MODEL_PATH = "原始模型路径"
CHECKPOINT_PATH = "微调后的模型路径(output中的路径)"
pre_seq_len = 128 
tokenizer = AutoTokenizer.from_pretrained(MODEL_PATH, trust_remote_code=True)
config = AutoConfig.from_pretrained(MODEL_PATH, trust_remote_code=True, pre_seq_len=pre_seq_len)
model = AutoModel.from_pretrained(MODEL_PATH, config=config, trust_remote_code=True)
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)

# Comment out the following line if you don't use quantization
model = model.quantize(4)
model = model.half().cuda()
model.transformer.prefix_encoder.float()
model = model.eval()

#读取数据
#模型对话
代码和以上一致,只是model替换为微调后的model


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

在这里插入图片描述

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

闽ICP备14008679号