找什么公司做网站,wordpress图片列表,一起做网店货源app,j2ee网站开发教程1.前言 指令微调ChatGlm3-6b。微调教程在github地址中给出#xff0c;微调环境是Qwen提供的docker镜像为环境。 镜像获取方式#xff1a;docker pull qwenllm/qwen:cu117 github地址#xff1a;https://github.com/liucongg/ChatGLM-Finetuning 2.微调过程 github地址中的教…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 deepspeed0.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格式数据。
{instruction: 你现在是一个信息抽取模型请你帮我抽取出关系内容为\性能故障\, \部件故障\, \组成\和 \检测工具\的相关三元组三元组内部用\_\连接三元组之间用\\n分割。文本, input: 故障现象发动机水温高风扇始终是低速转动高速档不工作开空调尤其如此。, output: 发动机_部件故障_水温高\n风扇_部件故障_低速转动}
{instruction: 你现在是一个信息抽取模型请你帮我抽取出关系内容为\性能故障\, \部件故障\, \组成\和 \检测工具\的相关三元组三元组内部用\_\连接三元组之间用\\n分割。文本, input: 957号汽车故障报告故障现象一辆2007年长丰猎豹飞腾6400越野车行驶里程27000km。维修室内灯不亮更换室内灯泡后发现四个转向灯常亮后雨刮和后喷水常工作开关不起作用。, output: 开关_部件故障_不起作用\n维修室内灯_部件故障_不亮}
#存放路径
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_DEVICES0表示使用0号GPU也可设置为
CUDA_VISIBLE_DEVICES0,1,2,3
CUDA_VISIBLE_DEVICES0 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目录下准备与原模型合并。
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_codeTrue).cuda()
#加载微调的模型
lora_model_path /ssd/dongzhenheng/Work/ChatGLM3-6B微调/epoch-2-step-84
lora_model PeftModel.from_pretrained(base_model,lora_model_path, torch_dtypetorch.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_size2048MB, safe_serializationTrue) 2-6 验证 使用合并的模型对测试数据验证。
#加载模型
new_model_directory /ssd/dongzhenheng/Work/ChatGLM3-6B微调
tokenizer AutoTokenizer.from_pretrained(new_model_directory, trust_remote_codeTrue)
model AutoModel.from_pretrained(new_model_directory, trust_remote_codeTrue).cuda()
model.eval()
#输入
instruction 你现在是一个信息抽取模型请你帮我抽取出关系内容为\性能故障\, \部件故障\, \组成\和 \检测工具\的相关三元组三元组内部用\_\连接三元组之间用\\n分割。文本
input 故障现象发动机水温高风扇始终是低速转动高速档不工作开空调尤其如此。 #验证
response, _ model.chat(tokenizer, instructioninput_data, historyNone)
print(response)