前言:最近大模型太火了,导师让我看看能不能用到自己的实验中,就想着先微调一个chatGLM试试水,微调的过程并不难,难的的硬件条件跟不上,我试了一下lora微调,也算跑通了吧,虽然最后评估的时候报错了,淦!
真正设计lora微调的就那一行代码,仅以此博客作为记录,希望有大佬能够告知为啥评估的时候会出现那两个bug,不胜感激!
环境准备
GPU:3090两块
系统镜像:Ubuntu 9.4.0-1ubuntu1~20.04.2
python版本:Python 3.10
部署
- 创建python环境
conda create -n py310_chat python=3.10
小编这里报错了:
说什么channel获取不到,可以理解为conda的下载源找不到
解决办法:
将获取不到的channel删除即可
conda config --remove channels 要删除的channel
还有报错就接着删,然后查看当前是否还存在channel
conda config --show channels
如果没有可用channel,使用下述命令添加,这里给出几个例子
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
解决完上述问题,重新创建就可以啦!
- 激活环境
conda activate py310_chat
- 下载(克隆)项目
git clone https://github.com/THUDM/ChatGLM3.git
- 进入目录,安装依赖
cd ChatGLM3
pip install -r requirements.txt
- 预训练好的模型下载
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
因为模型很大,这里下载可能需要点时间
小编这里下载模型的时候也出了点问题,只下载了一部分就报错停止了,重新下载还是会出现类似情况,所以我就去hugging face把缺失的文件手动的一个一个下载下来,拷贝到chatglm3-6b中
- 命令行demo运行
打开项目下的basic_demo,可以看到很多可运行的demo,这里选择cli_demo.py,成功运行之后终端会出现一个交互式命令行,你就可以跟chatGLM聊天了
注意: 这里你需要将cli_demo.py中的MODEL_PATH和TOKENZIER_PATH改为上述第五步中下载的模型地址
(web demo小编也运行了,但是出了点问题,时间紧迫也没有去探究为什么报错)
微调
- 准备数据集
这里先用官方提供的数据集试试水:AdvertiseGen数据集
数据集下载完成之后,放到你的项目下
- 安装依赖
进入到项目中的finetune_demo目录下,这里是官方提供的微调代码,以及还有微调所需要安装的依赖:
pip install -r requirements.txt
- 处理数据集
运行lora_finetune.ipynb最开始的一段代码,对train.json和dev.json进行“切割对齐”,生成最终的微调数据集
这里我们只需要修改一下原数据集存放的路径和处理之后数据集存放的路径就可以了,即下述这一行代码中的路径:
- 配置文件修改
配置文件都放在finetune_demo目录下的configs目录中
包括以下文件:
- ds_zereo_2 / ds_zereo_3.json: deepspeed 配置文件。
- lora.yaml / ptuning.yaml / sft.yaml: 模型不同方式的配置文件,包括模型参数、优化器参数、训练参数等
详情可查看finetune_demo目录下的readme文件
按照官网的lora.yaml配置进行微调,CUDA out of memory了!!!
可替换成下述配置:https://github.com/KevinFanng/makeChatGLM3FinetuneData/blob/main/lora.yaml(这是我参考的博主的文章里面提供的,我单张3090不行,两张3090可以)
- 运行微调代码
单机单卡:
python finetune_hf.py 数据集路径/ 模型路径/ configs/lora.yaml
单机双卡:
OMP_NUM_THREADS=1 torchrun --standalone --nnodes=1 --nproc_per_node=2 finetune_hf.py 数据集路径/ 模型路径/ configs/lora.yaml
发现还是有很多包都没装上,缺什么装什么就可以啦!
后记:
尽管我一再的修改配置文件使参数尽可能的小一点,但是一块3090还是没有带起来,后来我就采用单机双卡的训练模式,跑是跑起来了,训练跑完一轮的时候评估却报错了,具体错误如下:
在包的内部报这个错误,给我整不会了,想来想去也只能是版本错误,咋回事呢
- TypeError: BatchEncoding.to() got an unexpected keyword argument 'non_blocking
第二个错误是device的错误,to(device)的时候报空类型,我麻了
- AttributeError: ‘NoneType’ object has no attribute ‘to’
- 微调代码解析
微调调用的是封装好的peft包,主要跟下面这行代码有关,get_peft_model是peft包中的方法,接受两个参数,一个是我们要微调的模型。一个是微调参数,返回值是设置完微调参数之后的模型
model = get_peft_model(model, peft_config)
参考
- 感谢博主:https://www.bilibili.com/read/cv33842619/