网站开发需要会的东西,晋中市两学一做网站,嘉兴网站建设网站,建站宝盒做的网站GLM4是清华智谱团队最近开源的大语言模型。
以GLM4作为基座大模型#xff0c;通过指令微调的方式做高精度文本分类#xff0c;是学习LLM微调的入门任务。 使用的9B模型#xff0c;显存要求相对较高#xff0c;需要40GB左右。 在本文中#xff0c;我们会使用 GLM4-9b-Chat…GLM4是清华智谱团队最近开源的大语言模型。
以GLM4作为基座大模型通过指令微调的方式做高精度文本分类是学习LLM微调的入门任务。 使用的9B模型显存要求相对较高需要40GB左右。 在本文中我们会使用 GLM4-9b-Chat 模型在 复旦中文新闻 数据集上做指令微调训练同时使用SwanLab监控训练过程、评估模型效果。
代码完整代码直接看本文第5节实验日志过程GLM4-Fintune - SwanLab模型Modelscope数据集zh_cls_fudan_newsSwanLabhttps://swanlab.cn 相关文章Qwen2指令微调 知识点什么是指令微调
大模型指令微调Instruction Tuning是一种针对大型预训练语言模型的微调技术其核心目的是增强模型理解和执行特定指令的能力使模型能够根据用户提供的自然语言指令准确、恰当地生成相应的输出或执行相关任务。
指令微调特别关注于提升模型在遵循指令方面的一致性和准确性从而拓宽模型在各种应用场景中的泛化能力和实用性。
在实际应用中我的理解是指令微调更多把LLM看作一个更智能、更强大的传统NLP模型比如Bert来实现更高精度的文本预测任务。所以这类任务的应用场景覆盖了以往NLP模型的场景甚至很多团队拿它来标注互联网数据。
下面是实战正片
1.环境安装
本案例基于Python3.8请在您的计算机上安装好Python并且有一张英伟达显卡显存要求并不高大概10GB左右就可以跑。
我们需要安装以下这几个Python库在这之前请确保你的环境内已安装了pytorch以及CUDA
swanlab
modelscope
transformers
datasets
peft
accelerate
pandas
tiktoken一键安装命令
pip install swanlab modelscope transformers datasets peft pandas accelerate tiktoken本案例测试于modelscope1.14.0、transformers4.41.2、datasets2.18.0、peft0.11.1、accelerate0.30.1、swanlab0.3.10、tiktokn0.7.0更多环境细节可以查看这里 2.准备数据集
本案例使用的是zh_cls_fudan-news数据集该数据集主要被用于训练文本分类模型。
zh_cls_fudan-news由几千条数据每条数据包含text、category、output三列
text 是训练语料内容是书籍或新闻的文本内容category 是text的多个备选类型组成的列表output 则是text唯一真实的类型 数据集例子如下 [PROMPT]Text: 第四届全国大企业足球赛复赛结束新华社郑州月日电实习生田兆运上海大隆机器厂队昨天在洛阳进行的第四届牡丹杯全国大企业足球赛复赛中以力克成都冶金实验厂队进入前四名。沪蓉之战双方势均力敌分钟不分胜负。最后双方互射点球沪队才以一球优势取胜。复赛的其它场比赛青海山川机床铸造厂队击败东道主洛阳矿山机器厂队青岛铸造机械厂队战胜石家庄第一印染厂队武汉肉联厂队险胜天津市第二冶金机械厂队。在今天进行的决定九至十二名的两场比赛中包钢无缝钢管厂队和河南平顶山矿务局一矿队分别击败河南平顶山锦纶帘子布厂队和江苏盐城无线电总厂队。日将进行两场半决赛由青海山川机床铸造厂队和青岛铸造机械厂队分别与武汉肉联厂队和上海大隆机器厂队交锋。本届比赛将于日结束。完
Category: Sports, Politics
Output:[OUTPUT]Sports我们的训练任务便是希望微调后的大模型能够根据Text和Category组成的提示词预测出正确的Output。 我们将数据集下载到本地目录下。下载方式是前往zh_cls_fudan-news - 魔搭社区 将train.jsonl和test.jsonl下载到本地根目录下即可 3. 加载模型
这里我们使用modelscope下载GLM4-9b-Chat模型modelscope在国内所以下载不用担心速度和稳定性问题然后把它加载到Transformers中进行训练
from modelscope import snapshot_download, AutoTokenizer
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq# 在modelscope上下载GLM模型到本地目录下
model_dir snapshot_download(ZhipuAI/glm-4-9b-chat, cache_dir./, revisionmaster)# Transformers加载模型权重
tokenizer AutoTokenizer.from_pretrained(./ZhipuAI/glm-4-9b-chat/, use_fastFalse, trust_remote_codeTrue)
model AutoModelForCausalLM.from_pretrained(./ZhipuAI/glm-4-9b-chat/, device_mapauto, torch_dtypetorch.bfloat16, trust_remote_codeTrue)4. 配置训练可视化工具
我们使用SwanLab来监控整个训练过程并评估最终的模型效果。
这里直接使用SwanLab和Transformers的集成来实现
from swanlab.integration.huggingface import SwanLabCallbackswanlab_callback SwanLabCallback(...)trainer Trainer(...callbacks[swanlab_callback],
)
如果你是第一次使用SwanLab那么还需要去https://swanlab.cn上注册一个账号在用户设置页面复制你的API Key然后在训练开始时粘贴进去即可 5. 完整代码
开始训练时的目录结构
|--- train.py
|--- train.jsonl
|--- test.jsonltrain.py:
import json
import pandas as pd
import torch
from datasets import Dataset
from modelscope import snapshot_download, AutoTokenizer
from swanlab.integration.huggingface import SwanLabCallback
from peft import LoraConfig, TaskType, get_peft_model
from transformers import AutoModelForCausalLM, TrainingArguments, Trainer, DataCollatorForSeq2Seq
import os
import swanlabdef dataset_jsonl_transfer(origin_path, new_path):将原始数据集转换为大模型微调所需数据格式的新数据集messages []# 读取旧的JSONL文件with open(origin_path, r) as file:for line in file:# 解析每一行的json数据data json.loads(line)context data[text]catagory data[category]label data[output]message {instruction: 你是一个文本分类领域的专家你会接收到一段文本和几个潜在的分类选项请输出文本内容的正确类型,input: f文本:{context},类型选型:{catagory},output: label,}messages.append(message)# 保存重构后的JSONL文件with open(new_path, w, encodingutf-8) as file:for message in messages:file.write(json.dumps(message, ensure_asciiFalse) \n)def process_func(example):将数据集进行预处理MAX_LENGTH 384 input_ids, attention_mask, labels [], [], []instruction tokenizer(f|system|\n你是一个文本分类领域的专家你会接收到一段文本和几个潜在的分类选项请输出文本内容的正确类型|endoftext|\n|user|\n{example[input]}|endoftext|\n|assistant|\n,add_special_tokensFalse,)response tokenizer(f{example[output]}, add_special_tokensFalse)input_ids instruction[input_ids] response[input_ids] [tokenizer.pad_token_id]attention_mask (instruction[attention_mask] response[attention_mask] [1])labels [-100] * len(instruction[input_ids]) response[input_ids] [tokenizer.pad_token_id]if len(input_ids) MAX_LENGTH: # 做一个截断input_ids input_ids[:MAX_LENGTH]attention_mask attention_mask[:MAX_LENGTH]labels labels[:MAX_LENGTH]return {input_ids: input_ids, attention_mask: attention_mask, labels: labels} def predict(messages, model, tokenizer):device cudatext tokenizer.apply_chat_template(messages,tokenizeFalse,add_generation_promptTrue)model_inputs tokenizer([text], return_tensorspt).to(device)generated_ids model.generate(model_inputs.input_ids,max_new_tokens512)generated_ids [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]response tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0]print(response)return response# 在modelscope上下载GLM模型到本地目录下
model_dir snapshot_download(ZhipuAI/glm-4-9b-chat, cache_dir./, revisionmaster)# Transformers加载模型权重
tokenizer AutoTokenizer.from_pretrained(./ZhipuAI/glm-4-9b-chat/, use_fastFalse, trust_remote_codeTrue)
model AutoModelForCausalLM.from_pretrained(./ZhipuAI/glm-4-9b-chat/, device_mapauto, torch_dtypetorch.bfloat16, trust_remote_codeTrue)
model.enable_input_require_grads() # 开启梯度检查点时要执行该方法# 加载、处理数据集和测试集
train_dataset_path train.jsonl
test_dataset_path test.jsonltrain_jsonl_new_path new_train.jsonl
test_jsonl_new_path new_test.jsonlif not os.path.exists(train_jsonl_new_path):dataset_jsonl_transfer(train_dataset_path, train_jsonl_new_path)
if not os.path.exists(test_jsonl_new_path):dataset_jsonl_transfer(test_dataset_path, test_jsonl_new_path)# 得到训练集
train_df pd.read_json(train_jsonl_new_path, linesTrue)
train_ds Dataset.from_pandas(train_df)
train_dataset train_ds.map(process_func, remove_columnstrain_ds.column_names)config LoraConfig(task_typeTaskType.CAUSAL_LM,target_modules[query_key_value, dense, dense_h_to_4h, activation_func, dense_4h_to_h],inference_modeFalse, # 训练模式r8, # Lora 秩lora_alpha32, # Lora alaph具体作用参见 Lora 原理lora_dropout0.1, # Dropout 比例
)model get_peft_model(model, config)args TrainingArguments(output_dir./output/GLM4-9b,per_device_train_batch_size4,gradient_accumulation_steps4,logging_steps10,num_train_epochs2,save_steps100,learning_rate1e-4,save_on_each_nodeTrue,gradient_checkpointingTrue,report_tonone,
)swanlab_callback SwanLabCallback(projectGLM4-fintune,experiment_nameGLM4-9B-Chat,description使用智谱GLM4-9B-Chat模型在zh_cls_fudan-news数据集上微调。,config{model: ZhipuAI/glm-4-9b-chat,dataset: huangjintao/zh_cls_fudan-news,},
)trainer Trainer(modelmodel,argsargs,train_datasettrain_dataset,data_collatorDataCollatorForSeq2Seq(tokenizertokenizer, paddingTrue),callbacks[swanlab_callback],
)trainer.train()# 用测试集的前10条测试模型
test_df pd.read_json(test_jsonl_new_path, linesTrue)[:10]test_text_list []
for index, row in test_df.iterrows():instruction row[instruction]input_value row[input]messages [{role: system, content: f{instruction}},{role: user, content: f{input_value}}]response predict(messages, model, tokenizer)messages.append({role: assistant, content: f{response}})result_text f{messages[0]}\n\n{messages[1]}\n\n{messages[2]}test_text_list.append(swanlab.Text(result_text, captionresponse))swanlab.log({Prediction: test_text_list})
swanlab.finish()看到下面的进度条即代表训练开始这些loss、grad_norm等信息会到一定的step时打印出来 6.训练结果演示
在SwanLab上查看最终的训练结果
可以看到在2个epoch之后微调后的glm4的loss降低到了不错的水平——当然对于大模型来说真正的效果评估还得看主观效果。 可以看到在一些测试样例上微调后的glm4能够给出准确的文本类型 至此你已经完成了glm4指令微调的训练
7. 模型推理
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import PeftModeldef predict(messages, model, tokenizer):device cudatext tokenizer.apply_chat_template(messages, tokenizeFalse, add_generation_promptTrue)model_inputs tokenizer([text], return_tensorspt).to(device)generated_ids model.generate(model_inputs.input_ids, max_new_tokens512)generated_ids [output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids)]response tokenizer.batch_decode(generated_ids, skip_special_tokensTrue)[0]return response# 加载原下载路径的tokenizer和model
tokenizer AutoTokenizer.from_pretrained(./ZhipuAI/glm-4-9b-chat/, use_fastFalse, trust_remote_codeTrue)
model AutoModelForCausalLM.from_pretrained(./ZhipuAI/glm-4-9b-chat/, device_mapauto, torch_dtypetorch.bfloat16)# 加载训练好的Lora模型将下面的checkpointXXX替换为实际的checkpoint文件名名称
model PeftModel.from_pretrained(model, model_id./output/GLM4-9b/checkpoint-XXX)test_texts {instruction: 你是一个文本分类领域的专家你会接收到一段文本和几个潜在的分类选项请输出文本内容的正确类型,input: 文本:航空动力学报JOURNAL OF AEROSPACE POWER1998年 第4期 No.4 1998科技期刊管路系统敷设的并行工程模型研究*陈志英* * 马 枚北京航空航天大学【摘要】 提出了一种应用于并行工程模型转换研究的标号法该法是将现行串行设计过程(As-is)转换为并行设计过程(To-be)。本文应用该法将发动机外部管路系统敷设过程模型进行了串并行转换应用并行工程过程重构的手段得到了管路敷设并行过程模型。
}instruction test_texts[instruction]
input_value test_texts[input]messages [{role: system, content: f{instruction}},{role: user, content: f{input_value}}
]response predict(messages, model, tokenizer)
print(response)相关链接
代码完整代码直接看本文第5节实验日志过程GLM4-Fintune - SwanLab模型Modelscope数据集zh_cls_fudan_newsSwanLabhttps://swanlab.cn