大模型笔记之-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
#查看当前有的环境
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
	PS:cuda-base为基础环境,我们以这个环境为基础 克隆并新建环境
	conda list查看

在这里插入图片描述

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

在这里插入图片描述

三.构建数据集

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

在这里插入图片描述

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

在这里插入图片描述

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

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%




参数详解

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.win+R输入 cmd 打开终端

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

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

conda activate chatglm2
#如果报错请使用下面这条
activate chatglm2

在这里插入图片描述
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/

4.开始训练

cd ptuning

train.bat

日志截取

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]
问:你好

答: 你好,我是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!一个花活山的聊天宠物!
{'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}

结束了

{'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.修改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%
#在终端中执行
web_demo.bat

在这里插入图片描述

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

在这里插入图片描述

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

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

总结

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

写在最后

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

  • 6
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
RTX 2080 Ti NVLink是指使用NVIDIA的NVLink技术将两张RTX 2080 Ti显卡连接在一起以实现多GPU并行计算和通信。NVLink是一种高速、低延迟的互联技术,它可以提供比传统PCIe接口更高的带宽和更低的延迟,从而实现更好的多GPU性能。RTX 2080 Ti NVLink可以通过NVLink连接板将两张显卡物理上连接在一起,以实现高效的数据传输和协同计算。这使得在支持多GPU加速的应用程序中,可以将计算负载分摊到多个GPU上并提高整体性能。 NCCL是Nvidia Collective multi-GPU Communication Library的简称,它是一个实现多GPU的collective communication通信库,可以提供高效的数据传输和通信功能。NCCL通过优化在PCIe、NVLink和InfiniBand等互联技术上的通信速度,将多个GPU之间的数据传输和通信效率最大化。 在进行RTX 2080 Ti NVLink配置时,可以使用nvidia-smi命令来测试GPU的连接拓扑。该命令可以显示GPU之间的连接方式,例如通过PCIe或NVLink等。通过查看连接拓扑,可以确认RTX 2080 Ti是否成功使用NVLink进行连接。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [NVIDIA-Turing-Architecture-WhitepaperNVIDIA-图灵架构的白皮书](https://download.csdn.net/download/weixin_40878684/10682852)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [4卡RTX2080Ti深度学习工作站是可行的 - NCCL](https://blog.csdn.net/danteLiujie/article/details/102901154)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Harvey-J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值