2023年10月



前几天给大家讲了一下ChatGLM2-6B部署教程,今天就再给大家来一个模型微调教程

引言

随着ChatGPT的发展,不少企业都想训练出来适用于自己领域的大模型,但是训练一个模型成本是非常高的,中小型企业根本无法承受。今天给大家带来ChatGLM2-6B大语言模型微调训练教程,基于清华大学开源的大语言模型(GitHub:ChatGLM2-6B)进行微调,可以用非常少的成本训练出自己行业领域的大模型。

软硬件条件

系统

系统推荐 Ubuntu 22.x ,因为P-Tuning v2不支持Windows多卡。
如果是单卡跑的话,使用Windows也是可以的,详细修改教程参照:issues#195

硬件

微调不需要多高的硬件,但也要满足最低硬件要求:

CPU:8核心以上
内存:32G以上
显卡:仅支持英伟达(NVDA)显卡,推荐最近新出卡,能加快微调速度。
显存:显存推荐16G以上,最低8G。
单卡多卡:推荐多卡,单卡也是可以的。

数据准备

下面给大家几条数据示例:

{"content":"你好","summary":"您好,我是人工智能助理iBot机器人。"}
{"content":"你叫什么名字?","summary":"我的名字叫做iBot机器人。"}
{"content":"你有什么功能?","summary":"我可以解决您在使用网站时遇到的各种问题。"}
{"content":"每次签到可以获得多少金币","summary":"您可以通过签到获取金币。每次签到获得的金币数量在5个~100个不等。签到获得的金币支持累加,但有一定的上限,普通用户通过签到最大累计金币数为30个,捐赠用户通过签到最大累计金币数为300个。"}
{"content":"软件闪退、黑屏、无法使用的原因是?","summary":"软件闪退、黑屏、无法使用的原因可能包括:软件需要输入ID但用户输入了自己的ID导致闪退;软件与当前iOS版本不兼容;以及软件自身存在问题。"}
{"content":"软件提示“输入ID”怎么办?","summary":"当软件打开后需要输入ID时,千万不要输入自己的ID,否则可能导致软件闪退或黑屏。iOS6系统:首先退出软件,回到桌面,在打开软件的一瞬间,迅速按下息屏键,再迅速点亮屏幕,继续使用软件就不会提示了(如果不行的话,多试几次)。非iOS6系统:仅仅对爱思正版软件有效:手机需要链接一次电脑版爱思,它会在你手机上面安装个爱思手机版,这个时候再打开爱思版免ID软件,就不会再提示需要id了。相似的,同步正版和91正版,自然需要下载个同步助手和91助手了。"}

上述仅给大家提供几条数据示例,具体微调过程中,还需要根据微调结果增加/减少/调整数据内容和条数。

讲这些数据存放到新建文件train.json
train.json

拉取项目

这一步其实没必要讲的,就是把项目从Github里面克隆出来 或者 直接下载zip文件 都是可以的。

项目环境部署可以参考下方文章,但也仅作为参考,因为之前讲的是windows的环境下部署,本次微调使用的系统是ubuntu,虽有不同,但大同小异,下文仅供参考。
[post cid="82" /]

微调

软件依赖

运行微调除 ChatGLM2-6B 的依赖之外,还需要安装以下依赖

pip install rouge_chinese nltk jieba datasets

修改微调代码

微调代码文件路径:项目地址/ptuning/train.sh
train.sh
文件部分参数我在这里给大家解读一下:
PRE_SEQ_LEN=128 预处理序列的长度,假设你的微调数量很小(约莫有100条)建议调低到64
LR=2e-2 学习率,它决定了模型在每次更新权重时所采用的步长。较小的学习率会导致训练过程缓慢,而较大的学习率可能会导致训练过程不稳定。若微调数据量很小(约莫有100条)可以使用较大的学习率例如2e-1

学习率较小会导致训练缓慢loss不收敛,较大会导致模型出现遗忘问题、过度拟合。这个参数需要自行研究,找到属于你数据量的最优解。

对于:per_device_train_batch_size 1 per_device_eval_batch_size 1 以及 gradient_accumulation_steps 16请前往Github查看或参阅下方引用:

一次训练迭代会以 1 的批处理大小进行 16 次累加的前后向传播,等效为 16 的总批处理大小,此时最低只需 6.7G 显存。若想在同等批处理大小下提升训练效率,可在二者乘积不变的情况下,加大 per_device_train_batch_size 的值,但也会带来更多的显存消耗,请根据实际情况酌情调整。

修改例子:

    源代码:
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 16 \
    修改后:
    --per_device_train_batch_size 4 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 4 \
    亦或者:
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 2 \
    还可以:
    --per_device_train_batch_size 8 \
    --per_device_eval_batch_size 2 \
    --gradient_accumulation_steps 2 \

微调数据放置

将微调数据train.json放置到路径:项目地址/ptuning/AdvertiseGen/train.json
train.json 放置路径
至于dev.json这个文件,就是训练后你想要什么结果存放到里面,内容示例:

{"content":"你好啊","summary":"您好,我是人工智能助理iBot机器人。"}
{"content":"你的叫什么?","summary":"我的名字叫做iBot机器人。"}
{"content":"你可以做什么?","summary":"我可以解决您在使用网站时遇到的各种问题。"}

开始微调:

bash train.sh

微调后部署

这个就不讲了,就是把部署后的模型跑出来,请参阅:ptuning#模型部署

我这里的话,直接接入了QQ机器人,就直接演示一下在qq群内的对话吧:
运行状态
群对话:


例子0
例子1

一直都想研究玩玩这块,迫于财力有限,今天终于能完整的本地复现这些功能。后续考虑购入四张P40 24G显卡放到服务器,并开放api给大家使用。

本质上这些大语言模型都是大差不差的,本文就以ChatGLM2-6B为例给大家做演示。

简介

ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,相较于第一代,提升流畅性,门槛较低的同时又增加了许多新特性。
项目地址: Github - ChatGLM2-6B

环境配置要求

系统环境

为了快速上手,避免一些问题,本文使用Windows Server 2022纯净系统进行搭建。

推荐使用纯净的系统进行测试。

配置要求

以下是我的配置,括号中表示最低配置

系统:Windows Server 2022(家用Win系统也可以)
CPU:Intel Xeon Platinum 8255C(Intel/AMD 均可,64位,8核心以上最好,不怎么吃CPU)
内存:32G (越大越好,最低16G)
显卡:Nvidia Tesla T4 16G(计算卡一张,内存不低于16g最佳越大越好,最低P4 8G,推荐:P40 24G|T4 16G|A10 24G)

Python环境安装

安装Anaconda

Anaconda介绍及安装Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。因为包含了大量的科学包。Anaconda包括Conda、Python以及一大堆安装好的工具...

下载地址:Anaconda Download
Anaconda Download
点击Download选择Windows 64bit版本进行下载。

下载完成后,运行安装程序。在安装界面中,选择 All Users 为当前计算机所有用户安装 Anaconda。接下来,选择安装路径,建议使用默认路径。
截屏2023-10-19 15.24.55.png
安装过程可能较慢,耐心等待安装完成即可。

安装完成后,打开Conda命令行,输入 conda --version 检查 Anaconda 是否安装成功。
检查 Anaconda安装状态

NVIDIA配置流程

驱动安装

已经安装驱动的可以跳过此步。避免浪费时间。

驱动下载地址:驱动下载 Download
截屏2023-10-19 15.34.11.png
根据显卡型号 获取驱动程序,进行下载安装。
一路yes/ok/继续/安装,没什么好讲的

设置显卡开发者模式

这个也没什么好讲的,就按照图中显示配置即可。
开启开发者模式
记录版本号,以便用于下载Cuda
12.2.138
这里我的是12.2.138

安装 Cuda

上一步获取到的版本号:12.2.138 后面的数字不需要管,只需要记住 12.2 这个就可以。
打开网站:https://developer.nvidia.com/cuda-toolkit-archive
选择对应的版本下载。
下载12.2

要选与自己显卡相关的版本

选择Windows - 2022系统 下载
一路yes/ok/继续/安装,没什么好讲的

cuDNN安装

下载地址:https://developer.nvidia.com/rdp/cudnn-download 依旧是需要选择对应的版本进行下载。
此处需登陆,没有账号的话注册一个即可,使用邮件地址注册。
选择对应的版本进行下载
下载完之后解压缩,我们将目录名称修改为cudnn
将该cudnn目录,复制到目录 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2 目录下(就是你的CUDA安装地址,前面的目录一般都是有了的,只需要以此点进去即可)。
复制到此

配置环境变量,添加2个环境变量路径,根据你自己的目录修改。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\cudnn\bin
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v12.2\extras\CUPTI\lib64

修改环境变量

安装Pytorch

地址:https://pytorch.org/
打开网站,下滑,选择需要安装的版本。
选择版本
选择适用于您设备的cuda版本,由于我的是12.2,需要需要使用Preview版本。

conda install pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch-nightly -c nvidia

复制指令,到Anaconda指令窗口执行,请选择适合自己的版本下载,不要复制我的指令。

执行指令

开始跑模型

创建模型虚拟环境

利用conda创建虚拟环境

2023-10-19 16.40.15

打开Conda Shell,执行:

conda create -n ChatGlm python=3.9

创建一个名为ChatGlm的环境,此环境的Python版本为3.9

询问是否继续执行,选择 y回车即可。

激活模型虚拟环境

这里的环境路径C:\ChatGlm是我的路径,请将路径修改成自己的路径。

conda activate ChatGlm
c:
cd C:\ChatGlm

下载ChatGLM2-6B

这里不多赘述,直接Github:https://github.com/THUDM/ChatGLM2-6B
选择Code - 下载zip
下载后将zip内的文件复制到你的环境路径,我的是C:\ChatGlm
目录层级大致这样

安装模型需要的环境

先进入目录,若已经在这个目录下,无需执行这块代码

conda activate ChatGlm
c:
cd C:\ChatGlm

pip改为清华源(避免因网络不良导致报错安装环境失败)【非必需】

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pip -U
pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple

安装模型需要的环境

pip install -r requirements.txt

pip install

安装过程需要从网络下载资源,所需时间较长,若没有报错耐心等待即可。若安装失败,请将源改为pip改为清华源。

下载模型

原版模型下载[打不开挂科学]:https://huggingface.co/THUDM/chatglm2-6b/tree/main
量化模型下载[小显存使用]:https://huggingface.co/THUDM/chatglm2-6b-int4/tree/main
量化模型下载
因为我的卡是Tesla T4 16G,为了稳定运行,这里我使用Int4量化模型进行测试。模型文件不知道那些有用的话,建议全部下载放到chatglm2-6b文件夹内。
下载后的模型存放到项目目录/model/chatglm2-6b下,例如我的就是C:\ChatGlm\model\chatglm2-6b
如果你使用的是int4量化模型,则路径为/model/chatglm2-6b-int4
模型文件存放路径

运行模型

正常模型

正常模型,请修改路径为绝对路径:
cli_demo.py 第8行:
原代码:

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

修改后:

tokenizer = AutoTokenizer.from_pretrained("model\\chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("model\\chatglm2-6b", trust_remote_code=True).cuda()

量化模型

针对量化模型,还需要修改一些代码:
cli_demo.py 第8行
原代码:

tokenizer = AutoTokenizer.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True)
model = AutoModel.from_pretrained("THUDM/chatglm2-6b", trust_remote_code=True).cuda()

修改后:

tokenizer = AutoTokenizer.from_pretrained("model\\chatglm2-6b-int4", trust_remote_code=True)
model = AutoModel.from_pretrained("model\\chatglm2-6b-int4",trust_remote_code=True).cuda()

运行程序

运行程序有多种方法,这里只使用命令行进行演示

python cli_demo.py

运行示例