当前位置:   article > 正文

大模型笔记之-ChatGLM2微调(基于Windows10 22H2+RTX2080ti 实现)

大模型笔记之-ChatGLM2微调(基于Windows10 22H2+RTX2080ti 实现)


一、前期准备

1.安装conda做环境隔离
参考:从零开始学Python–Anaconda的安装及环境变量的配置
2.准备训练数据集
3.源码下载:
github:https://github.com/THUDM/ChatGLM2-6B
gitcode:https://gitcode.net/Harvey_JH/chatglm2-6b

4.模型下载:
huggingface:https://huggingface.co/THUDM/chatglm2-6b/tree/main
modelscope:https://modelscope.cn/models/ZhipuAI/chatglm2-6b/files

二、创建环境

1.conda常用基础命令

#查看已有的conda环境
conda info --envs

#创建新的conda环境,其中your_env_name 为环境名称,python=x.x为指定python版本号
conda create -n your_env_name python=x.x

#删除环境
conda remove -n your_env_name --all

#切换环境
conda activate your_env_name

#退出环境
deactivate env_name

#克隆一个已有的环境 B为新环境的名字 A被克隆的环境名字
conda create -n B --clone A
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
#查看当前有的环境
conda info --envs

# conda environments:
#
base                     C:\ProgramData\anaconda3
chatglm3                 C:\Users\Harvey\.conda\envs\chatglm3
cuda-base                C:\Users\Harvey\.conda\envs\cuda-base
langchain-chat-2.4       C:\Users\Harvey\.conda\envs\langchain-chat-2.4
langchain-chat-2.6       C:\Users\Harvey\.conda\envs\langchain-chat-2.6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
	PS:cuda-base为基础环境,我们以这个环境为基础 克隆并新建环境
	conda list查看
  • 1
  • 2

在这里插入图片描述

#创建chatglm2环境clone自cuda-base
conda create -n chatglm2 --clone cuda-base
  • 1
  • 2

在这里插入图片描述

三.构建数据集

	1.在ChatGLM2-6B源码路径下新建AdvertiseGen文件夹
  • 1

在这里插入图片描述

	2.在文件夹中放入准备好的数据集
  • 1

在这里插入图片描述

	3.为了缩短时间简化流程,训练数据集和验证数据集使用了相同的数据,结构如下
  • 1
[
    {
        "content": "你好",
        "summary": "你好,我是chatpet!一个花活山的聊天宠物!"
    },
    {
        "content": "你是谁",
        "summary": "我是chatpet,一个由花活山的程序猿们开发出来的聊天宠物!"
    },
    {
        "content": "你的开发者是谁",
        "summary": "他们是来自花活山的程序猿们!是一帮有趣的人"
    },
	{
        "content": "你叫什么",
        "summary": "我是chatpet,一个由花活山的程序猿们开发出来的聊天宠物!"
    },
	{
        "content": "花活山在哪",
        "summary": "花活山是赵先生的秘密基地,他是一位不知名的赵先生"
    },
	{
        "content": "介绍一下赵先生",
        "summary": "一名有趣的灵魂,非天才型选手。同时也是一名程序猿,喜欢编程,喜欢研究新奇的东西,喜欢研究一些有趣的东西。"
    }
]

  • 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

4.创建一个名为output的文件中,为模型输出目录

在这里插入图片描述

四.修改微调参数train.sh文件

#PS:该文件位于  ..\ChatGLM2-6B-main\ptuning下
#修改后不保存为.bat文件(Windows下需要用到bat来执行)
#将所有的\ 修改为 ^
set PRE_SEQ_LEN=128
set LR=2e-2
set NUM_GPUS=1

python main.py ^
    --do_train ^
    --train_file AdvertiseGen\\train.json ^
    --validation_file AdvertiseGen\\dev.json ^
    --preprocessing_num_workers 10 ^
    --prompt_column content ^
    --response_column summary ^
    --overwrite_cache ^
    --model_name_or_path D:\\AIGC\\model-hub\\THUDM\\chatglm2-6b ^
    --output_dir output/adgen-chatglm2-6b-pt-%PRE_SEQ_LEN-%LR ^
    --overwrite_output_dir ^
    --max_source_length 64 ^
    --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 128 ^
    --logging_steps 4 ^
    --save_steps 128 ^
    --learning_rate %LR% ^
    --pre_seq_len %PRE_SEQ_LEN%




  • 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
  • 30
  • 31
  • 32
  • 33

参数详解

PRE_SEQ_LEN=128: 定义了一个名为PRE_SEQ_LEN的变量,并将其设置为128。这个变量的作用在后续的代码中会用到。

LR=2e-2: 定义了一个名为LR的变量,并将其设置为2e-2,即0.02。这个变量表示学习率,在后续的代码中会用到。

–train_file AdvertiseGen/train.json : 指定训练数据文件的路径和文件名为"AdvertiseGen/train.json"。

–validation_file AdvertiseGen/verify.json : 指定验证数据文件的路径和文件名为"AdvertiseGen/verify.json"。

–prompt_column content : 指定输入数据中作为提示的列名为"content"。

–response_column summary : 指定输入数据中作为响应的列名为"summary"。

–overwrite_cache : 一个命令行参数,指示在缓存存在的情况下覆盖缓存。

–model_name_or_path D:\\AIGC\\model hub\\THUDM\\chatglm2-6b : 指定使用的模型的名称或路径为"D:\\AIGC\\model hub\\THUDM\\chatglm2-6b"。

–output_dir output/adgen-chatglm2-6b-pt-$PRE_SEQ_LEN-$LR : 指定输出目录的路径和名称为"output/adgen-chatglm-6b-pt- P R E S E Q L E N − PRE_SEQ_LEN- PRES​EQL​EN−LR"。这是训练结果和日志的保存位置。

–overwrite_output_dir : 一个命令行参数,指示在输出目录存在的情况下覆盖输出目录。

–max_source_length 512 : 指定输入序列的最大长度为512。

–max_target_length 512 : 指定输出序列的最大长度为512。

–per_device_train_batch_size 1 : 指定每个训练设备的训练批次大小为1。

–per_device_eval_batch_size 1 : 指定每个评估设备的评估批次大小为1。

–gradient_accumulation_steps 16 : 指定梯度累积的步数为16。在每个更新步骤之前,将计算并累积一定数量的梯度。

–predict_with_generate : 一个命令行参数,指示在生成模型的预测时使用生成模式。

–max_steps 128 : 指定训练的最大步数为128。

–logging_steps 4 : 指定每隔4个步骤记录一次日志。

–save_steps 128 : 指定每隔128个步骤保存一次模型。

–learning_rate $LR : 指定学习率为之前定义的LR变量的值。

–pre_seq_len $PRE_SEQ_LEN : 指定预设序列长度为之前定义的PRE_SEQ_LEN变量的值。

–quantization_bit 16 : 指定量化位数。这个参数可能是与模型相关的特定设置(本次采用无量化)

  • 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
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在这里插入图片描述
在这里插入图片描述

五.开启训练

1.win+R输入 cmd 打开终端

#默认打开C盘 用户目录,需要切换到源码目录下
d:
#这里是源码;路径
cd D:\AIGC\git hub\THUDM\ChatGLM2-6B-main
  • 1
  • 2
  • 3
  • 4

在这里插入图片描述
2.conda切换到刚刚创建的chatglm2环境

conda activate chatglm2
#如果报错请使用下面这条
activate chatglm2
  • 1
  • 2
  • 3

在这里插入图片描述
3.安装依赖

#使用清华源加速
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

# 运行微调除 ChatGLM2-6B 的依赖之外,还需要安装以下依赖
pip install rouge_chinese nltk jieba datasets transformers[torch] -i https://pypi.tuna.tsinghua.edu.cn/simple/
  • 1
  • 2
  • 3
  • 4
  • 5

4.开始训练

cd ptuning

train.bat
  • 1
  • 2
  • 3

日志截取

torch_model.bin.index.json
[INFO|configuration_utils.py:577] 2023-11-03 17:47:42,497 >> Generate config GenerationConfig {
  "_from_model_config": true,
  "eos_token_id": 2,
  "pad_token_id": 0,
  "transformers_version": "4.30.2"
}

Loading checkpoint shards:  86%|████████████████████████████████████████████████▊        | 6/7 [01:16<00:13, 13.05s/it]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
问:你好

答: 你好,我是chatpet!一个花活山的聊天宠物!
label_ids [-100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, 36474, 54591, 30932, 33030, 18102, 6356, 30992, 31623, 54867, 54649, 36110, 34718, 39783, 31404, 2, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100, -100]
labels 你好,我是chatpet!一个花活山的聊天宠物!
  • 1
  • 2
  • 3
  • 4
  • 5
{'loss': 2.3506, 'learning_rate': 0.019375, 'epoch': 3.0}
{'loss': 1.9099, 'learning_rate': 0.01875, 'epoch': 6.0}
{'loss': 2.1582, 'learning_rate': 0.018125, 'epoch': 10.0}
{'loss': 1.5597, 'learning_rate': 0.0175, 'epoch': 13.0}
{'loss': 1.463, 'learning_rate': 0.016875, 'epoch': 16.0}
{'loss': 1.3091, 'learning_rate': 0.01625, 'epoch': 19.0}
{'loss': 1.1508, 'learning_rate': 0.015625, 'epoch': 22.0}
{'loss': 1.4011, 'learning_rate': 0.015, 'epoch': 26.0}
{'loss': 0.9472, 'learning_rate': 0.014375, 'epoch': 29.0}
{'loss': 0.8569, 'learning_rate': 0.01375, 'epoch': 32.0}
{'loss': 0.7074, 'learning_rate': 0.013125, 'epoch': 35.0}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

结束了

{'train_runtime': 153.3842, 'train_samples_per_second': 13.352, 'train_steps_per_second': 0.835, 'train_loss': 0.6400947161018848, 'epoch': 102.0}
100%|████████████████████████████████████████████████████████████████████████████████| 128/128 [02:33<00:00,  1.20s/it]
***** train metrics *****
  epoch                    =      102.0
  train_loss               =     0.6401
  train_runtime            = 0:02:33.38
  train_samples            =          6
  train_samples_per_second =     13.352
  train_steps_per_second   =      0.835
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

六.验证

1.修改web_demo.sh并重命名为web_demo.bat

#修改ptuning_checkpoint路径 为output下的路径
set PRE_SEQ_LEN=128

python web_demo.py ^
    --model_name_or_path D:\\AIGC\\model-hub\\THUDM\\chatglm2-6b ^
    --ptuning_checkpoint D:\\AIGC\\git-hub\\THUDM\\ChatGLM2-6B-main\\ptuning\\output\\adgen-chatglm2-6b-pt-LR\\checkpoint-128 ^
    --pre_seq_len %PRE_SEQ_LEN%
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
#在终端中执行
web_demo.bat
  • 1
  • 2

在这里插入图片描述

浏览器中打开 http://127.0.0.1:7860

在这里插入图片描述

可以看到 有效果 但是会胡言乱语,需要混合更多的语料,训练步长也需要长一点,

在这里插入图片描述
还伴随一些灾难遗忘和幻觉

总结

本文仅仅简单介绍了如何在Windows环境下微调及使用ChatGLM2-6B

写在最后

欢迎移步我的Github仓库,https://github.com/Jun-Howie/erniebot-openai-api
本仓库使用飞桨星河社区接入ernie-4.0联网功能,如果你需要可以Fork我的仓库,还请给个Star让我知道

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

闽ICP备14008679号