【深度学习】微调ChatGlm3-6b

1.前言

指令微调ChatGlm3-6b。微调教程在github地址中给出,微调环境是Qwen提供的docker镜像为环境。

镜像获取方式:docker pull qwenllm/qwen:cu117

github地址:https://github.com/liucongg/ChatGLM-Finetuning

2.微调过程

github地址中的教程给出了详细的微调过程。如果使用预先准备的docker,微调则更为方便。在实践时候,用了Qwen提供的docker。在使用容器微调时,不需要让容器中开启服务,所以需要以官方提供的镜像为基础,再做一个镜像。 本次实践中使用的镜像与微调Qwen-1.8B的镜像一致。做镜像的具体步骤与命令均在【微调Qwen1.8B】教程中给出。

2-1 环境准备

开发机器中现有库的版本与requestment.txt中指定的版本不一致,所以使用docker镜像作为开发环境,docker的环境需要安装指定版本的deepspeed和tensorboard。

#运行镜像生成容器 挂载模型
docker run --gpus all -v /ssd/dongzhenheng/LLM/chatglm3-6b:/data/shared/Qwen/chatglm3-6b -it qwenllm/qwen:cu117 bash 
#下载
pip install deepspeed==0.11.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install tensorboard -i https://pypi.tuna.tsinghua.edu.cn/simple

2-2 数据准备

原github项目中给出了微调数据的格式,每条都包含instruction、input、output的json格式数据。

python 复制代码
{"instruction": "你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:", "input": "故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。", "output": "发动机_部件故障_水温高\n风扇_部件故障_低速转动"}
{"instruction": "你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:", "input": "957号汽车故障报告故障现象一辆2007年长丰猎豹飞腾6400越野车,行驶里程27000km。维修室内灯不亮,更换室内灯泡后,发现四个转向灯常亮,后雨刮和后喷水常工作,开关不起作用。", "output": "开关_部件故障_不起作用\n维修室内灯_部件故障_不亮"}
python 复制代码
#存放路径
sava_path = '/data/zhenhengdong/WORk/Fine-tuning/ChatGlm3-6B/Datasets'
def write_method(item):
    #建立data.jsonl文件,以追加的方式写入数据
    with jsonlines.open(sava_path + 'data.jsonl', mode = 'a') as json_writer:
        json_writer.write(item)
#读文件
data = pd.read_csv(data_path)
for index in range(len(data)):
    temp_data = data.iloc[index]
    temp_dict = {
        "instruction":prompt.replace('\n',''),
        "input": data.iloc[index]['输入query'],
        "output":data.iloc[index]['输出结果']
        }
    write_method(temp_dict)

2-3 代码准备

将gitclone下来的ChatGLM-Finetuning-master项目、准备的数据复制到docker 容器中。

docker cp /data/zhenhengdong/WORk/Fine-tuning/ChatGlm3-6B/Codes/ChatGLM-Finetuning-master a27aaa4f78dc:/data/shared/Qwen/

github教程中给出了多种训练方式,Freeze方法、PT方法、Lora方法、全参方法。在微调时,采用了 Lora方法。

准备run_train.sh,在微调时直接运行即可。训练代码均采用DeepSpeed进行训练,可设置参数包含train_path、model_name_or_path、mode、train_type、lora_dim、lora_alpha、lora_dropout、lora_module_name、ds_file、num_train_epochs、per_device_train_batch_size、gradient_accumulation_steps、output_dir等, 可根据自己的任务配置。

Datasetsdata.json是按照2-2中数据格式准备的微调数据。

通过CUDA_VISIBLE_DEVICES控制具体哪几块卡进行训练,如果不加该参数,表示使用运行机器上所有卡进行训练。CUDA_VISIBLE_DEVICES=0表示使用0号GPU,也可设置为

CUDA_VISIBLE_DEVICES=0,1,2,3
python 复制代码
CUDA_VISIBLE_DEVICES=0 deepspeed --master_port 5200 train.py \
                --train_path Datasetsdata.json \
                --model_name_or_path /data/shared/Qwen/chatglm3-6b \
                --per_device_train_batch_size 1 \
                --max_len 1560 \
                --max_src_len 1024 \
                --learning_rate 1e-4 \
                --weight_decay 0.1 \
                --num_train_epochs 2 \
                --gradient_accumulation_steps 4 \
                --warmup_ratio 0.1 \
                --mode glm3 \
                --lora_dim 16 \
                --lora_alpha 64 \
                --lora_dropout 0.1 \
                --lora_module_name "query_key_value,dense_h_to_4h,dense_4h_to_h,dense" \
                --seed 1234 \
                --ds_file ds_zero2_no_offload.json \
                --gradient_checkpointing \
                --show_loss_step 10 \
                --output_dir output-glm3

训练过程如下:

2-4 微调输出

微调之后会有一个output-glm3的文件夹。

output-glm3文件夹中有每一轮训练保存的模型

2-5 merge

在github教程中作者提供了merge.py文件,可以使用merge.py文件进行合并。在合并时,也可自己写merge代码。

将微调的模型从docker容器中cp到ssd目录下,准备与原模型合并。

python 复制代码
import torch
from peft import PeftModel
from transformers import AutoTokenizer, AutoModel
#加载原模型
base_model = '/ssd/dongzhenheng/LLM/chatglm3-6b'
base_model = AutoModel.from_pretrained(base_model, trust_remote_code=True).cuda()
#加载微调的模型
lora_model_path = '/ssd/dongzhenheng/Work/ChatGLM3-6B微调/epoch-2-step-84'
lora_model = PeftModel.from_pretrained(base_model,lora_model_path, torch_dtype=torch.float16)
lora_model.to("cpu")
#合并
merged_model = lora_model.merge_and_unload()
#合并的模型存储
new_model_directory = '/ssd/dongzhenheng/Work/ChatGLM3-6B微调'
merged_model.save_pretrained(new_model_directory, max_shard_size="2048MB", safe_serialization=True)

2-6 验证

使用合并的模型对测试数据验证。

python 复制代码
#加载模型
new_model_directory = '/ssd/dongzhenheng/Work/ChatGLM3-6B微调'
tokenizer = AutoTokenizer.from_pretrained(new_model_directory, trust_remote_code=True)
model = AutoModel.from_pretrained(new_model_directory, trust_remote_code=True).cuda()
model.eval()
#输入
instruction = "你现在是一个信息抽取模型,请你帮我抽取出关系内容为\"性能故障\", \"部件故障\", \"组成\"和 \"检测工具\"的相关三元组,三元组内部用\"_\"连接,三元组之间用\\n分割。文本:"
input = "故障现象:发动机水温高,风扇始终是低速转动,高速档不工作,开空调尤其如此。 

#验证
response, _ = model.chat(tokenizer, instruction+input_data, history=None)
print(response)
相关推荐
天飓11 分钟前
基于OpenCV的自制Python访客识别程序
人工智能·python·opencv
檀越剑指大厂13 分钟前
开源AI大模型工作流神器Flowise本地部署与远程访问
人工智能·开源
声网16 分钟前
「人眼视觉不再是视频消费的唯一形式」丨智能编解码和 AI 视频生成专场回顾@RTE2024
人工智能·音视频
newxtc25 分钟前
【AiPPT-注册/登录安全分析报告-无验证方式导致安全隐患】
人工智能·安全·ai写作·极验·行为验证
技术仔QAQ40 分钟前
【tokenization分词】WordPiece, Byte-Pair Encoding(BPE), Byte-level BPE(BBPE)的原理和代码
人工智能·python·gpt·语言模型·自然语言处理·开源·nlp
陌上阳光1 小时前
动手学深度学习70 BERT微调
人工智能·深度学习·bert
正义的彬彬侠2 小时前
sklearn.datasets中make_classification函数
人工智能·python·机器学习·分类·sklearn
ctrey_2 小时前
2024-11-13 学习人工智能的Day26 sklearn(2)
人工智能·学习·sklearn
安静的_显眼包O_o2 小时前
from sklearn.preprocessing import Imputer.处理缺失数据的工具
人工智能·python·sklearn
安静的_显眼包O_o2 小时前
from sklearn.feature_selection import VarianceThreshold.移除低方差的特征来减少数据集中的特征数量
人工智能·python·sklearn