通义千问 1.5 -7B fine-tune验证

尝试对对中文数据进行finetune验证,测试模型的可优化方向。下面是代码的详细情况

代码实现

from datasets import load_dataset
from transformers import (AutoModelForCausalLM,AutoTokenizer,BitsAndBytesConfig,HfArgumentParser,AutoTokenizer,TrainingArguments,Trainer,GenerationConfig
)
from tqdm import tqdm
from trl import SFTTrainer
import torch
import time
import pandas as pd
import numpy as np
from huggingface_hub import interpreter_login
from datasets import Dataset, DatasetDict
from functools import partial
from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training
import os
# 禁用权重和偏差
os.environ['WANDB_DISABLED']="true"

中文摘要相关数据

git clone https://www.modelscope.cn/datasets/DAMO_NLP/lcsts_test_set.git

data_train_pth ='../Fine-tune/data/lcsts_test_set/{}'.format('train.csv')
data_train = pd.read_csv(data_train_pth)data_test_pth = '../Fine-tune/data/lcsts_test_set/{}'.format('test.csv')
data_test = pd.read_csv(data_test_pth)print(data_train.shape)
print(data_test.shape)
data_train.head()

在这里插入图片描述

数据加载

#这里看到原本的训练集合很大
data_train = data_train.head(3000)data_train = Dataset.from_pandas(data_train)
data_test = Dataset.from_pandas(data_test)print(data_train)

模型加载

compute_dtype = getattr(torch, "float16")
bnb_config = BitsAndBytesConfig(load_in_4bit=True,bnb_4bit_quant_type='nf4',bnb_4bit_compute_dtype=compute_dtype,bnb_4bit_use_double_quant=False,)
model_name=r'G:\hugging_fase_model2\Qwen1.5-7B-Chat'
device_map = {"": 0}
original_model = AutoModelForCausalLM.from_pretrained(model_name, device_map=device_map,quantization_config=bnb_config,trust_remote_code=True,use_auth_token=True)tokenizer = AutoTokenizer.from_pretrained(model_name,trust_remote_code=True,padding_side="left",add_eos_token=True,add_bos_token=True,use_fast=False)
tokenizer.pad_token = tokenizer.eos_token                                                      

数据预处理

def create_prompt_formats(sample):"""格式化示例的各个字段('instruction','output')然后使用两个换行符将它们连接起来:参数sample:样本字典"""ROLE_PROMPT = "### 你是一个新闻工作者。"#校色说明INTRO_BLURB = " ###需要给文章起一个合适的标题,这里会给到已有的文章和标题,需要学习如何给文章起标题名称"#任务简介INSTRUCTION_KEY = "###文章内容:以下是文章的内容,"RESPONSE_KEY =  "### 标题名称:"END_KEY = "### 结束"role= f"\n{ROLE_PROMPT}"blurb = f"\n{INTRO_BLURB}"instruction = f"{INSTRUCTION_KEY}"input_context = f"{sample['text1']}" if sample["text1"] else Noneresponse = f"{RESPONSE_KEY}\n{sample['text2']}"end = f"{END_KEY}"parts = [part for part in [role,blurb, instruction, input_context, response, end] if part]formatted_prompt = "\n\n".join(parts)sample["text"] = formatted_promptreturn sampledef get_max_length(model):conf = model.configmax_length = Nonefor length_setting in ["n_positions", "max_position_embeddings", "seq_length"]:max_length = getattr(model.config, length_setting, None)if max_length:print(f"Found max lenth: {max_length}")breakif not max_length:max_length = 1024print(f"Using default max length: {max_length}")return max_lengthdef preprocess_batch(batch, tokenizer, max_length):"""token处理"""return tokenizer(batch["text"],max_length=max_length,truncation=True,)def preprocess_dataset(tokenizer: AutoTokenizer, max_length: int,seed, dataset):"""格式化并标记它,以便为培训做好准备参数标记器(AutoTokenizer):模型标记器:param max_length (int):从标记器发出的标记的最大数量"""# 在每个示例中添加提示print("开始数据预处理...")dataset = dataset.map(create_prompt_formats)#, batched=True)# 对每一批数据集&进行预处理_preprocessing_function = partial(preprocess_batch, max_length=max_length, tokenizer=tokenizer)dataset = dataset.map(_preprocessing_function,batched=True,remove_columns=['text1', 'text2'],)# 过滤掉input_ids超过max_length的样本dataset = dataset.filter(lambda sample: len(sample["input_ids"]) < max_length)# 打乱数据dataset = dataset.shuffle(seed=seed)return dataset## 预处理
max_length = get_max_length(original_model)
print(max_length)seed=123
train_data = preprocess_dataset(tokenizer, max_length,seed, data_train)
eval_data = preprocess_dataset(tokenizer, max_length,seed, data_test)

模型训练

output_dir = f'./QWEn_peft-dialogue-summary-training-{str(int(time.time()))}'
peft_config = LoraConfig(lora_alpha=16, lora_dropout=0.1,r=64,bias="none",target_modules="all-linear",task_type="CAUSAL_LM",#inplace=False,#target_modules=[#    'q_proj',#    'k_proj',#    'v_proj',#    'dense'#],
)training_arguments = TrainingArguments(output_dir=output_dir,                    # 保存训练日志和检查点的目录num_train_epochs=5,                       # 为其训练模型的历元数。一个epoch通常指的是通过整个训练数据集一次的前向传播和反向传播过程。#num_train_epochs 被设置为3,意味着模型将完整地遍历训练数据集3次。per_device_train_batch_size=1,            # 每个设备上每个批次的样本数。gradient_accumulation_steps=8,            #  执行向后/更新过程之前的步骤数gradient_checkpointing=True,              # 使用渐变检查点保存内存optim="paged_adamw_8bit",                 #"paged_adamw_8bit"/"paged_adamw_32bit" 用于训练模型的优化器save_steps=50,logging_steps=50,                         # 记录训练指标的步骤数。它被设置为50,意味着每50个训练步骤,训练指标将被记录一次。learning_rate=2e-4,                       # 学习率weight_decay=0.001,fp16=True,bf16=False,max_grad_norm=0.3,                        # 基于QLoRA的最大梯度范数max_steps=500, #1000,                     #这个建议设置上,不然会出现很多次的训练轮warmup_ratio=0.03,                        # 基于QLoRA的预热比group_by_length=True,lr_scheduler_type="cosine",               # 使用余弦学习率调度report_to="tensorboard",                  # 向tensorboard报告指标  可选"none"evaluation_strategy="epoch",               # 每个纪元保存检查点 可选"steps" 这个参数设置了评估策略。#代码中设置为"epoch",意味着评估将在每个epoch结束后进行。由于eval_steps也设置为50,这可能意味着评估将在每50个训练步骤或每个epoch#warmup_steps = 1#logging_dir="./logs",save_strategy="steps",eval_steps=50,#意味着每50个训练步骤,模型将在验证集上进行一次评估。do_eval=True,overwrite_output_dir  =True
)
"""
上述参数,模型将在以下情况下停止训练:完成3个epoch的训练,无论eval_steps条件是否满足。
如果训练数据集的大小导致在3个epoch内无法达到50个训练步骤,那么模型将在完成所有训练步骤后停止。
至于评估输出,由于logging_steps和eval_steps都设置为50,这意味着:每50个训练步骤,训练指标将被记录一次。
每50个训练步骤,模型将在验证集上进行一次评估。
"""#training_arguments.config.use_cache = False
#transformers.Trainer
"""
transformers.Trainer:如果你有一个大的数据集,并且需要为你的培训循环或复杂的培训工作流程进行广泛的定制。
使用SFTTrainer:如果你有一个预训练的模型和相对较小的数据集,并且想要更简单、更快的微调体验和高效的内存使用。如果训练数据集较小,可能导致在每个epoch中训练步骤数少于50步,那么eval_steps条件可能不会触发,评估将在每个epoch结束后根据evaluation_strategy参数的设置进行。另外,max_steps参数通常用于设置训练的最大步骤数,以防止训练超过预定的epoch数。
代码中,max_steps被设置为1000,这个值远大于由num_train_epochs和per_device_train_batch_size参数隐式定义的训练步骤数。
因此,除非训练数据集非常大,否则这个参数在上下文中可能不会起作用。
如果max_steps的值大于完成所有epoch所需步骤数的总和,训练将在完成所有epoch后停止,而不是在达到max_steps指定的步骤数时停止。
"""
trainer = SFTTrainer(model=original_model,args=training_arguments,#train_dataset=train_data,eval_dataset=eval_data,peft_config=peft_config,# 模型配置文件dataset_text_field="text",tokenizer=tokenizer,max_seq_length=1024,packing=False,dataset_kwargs={"add_special_tokens": False,"append_concat_token": False,}
)"""
#可选
trainer = transformers.Trainer(model=peft_model,train_dataset=train_data,eval_dataset=eval_data,args=training_arguments,data_collator=transformers.DataCollatorForLanguageModeling(tokenizer, mlm=False),
)
"""trainer.train()
#模型保存
trainer.save_model()
#保存token
tokenizer.save_pretrained(output_dir)

运行结果:

在这里插入图片描述
这里看到loss 没有很好的出现下降的情况

其他方案调整

调整promt 工程

告诉大模型 任务是文本的摘要
在这里插入图片描述

尝试调整

调整学习率1e-4
在这里插入图片描述
只是延缓了过拟合的情况发生。

增加训练集
在这里插入图片描述
后期过拟合的只有更快了。
以上是文本的全部内容,有好的方法希望一起讨论。感谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/699884.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

​民兵档案管理系统-退伍军人档案管理全流程追踪

民兵档案管理系统-退伍军人档案管理全流程追踪 民兵档案管理系统&#xff08;智档案DW-S403&#xff09;是依托互3D技术、云计算、大数据、RFID技术、数据库技术、AI、视频分析技术对RFID智能仓库进行统一管理、分析的信息化、智能化、规范化的系统。 RFID档案管理系统是以先进…

display:flex align-items:center无效的不一样的解决思路

写H5的时候&#xff0c;希望两个元素在div中垂直居中&#xff0c;但是设置align-items:center无效&#xff0c;最终排查原因是引入三方css影响了align-items:center。 具体分析如下&#xff0c;想让搜索图标和input在div里水平居中&#xff1a; 布局如下&#xff1a; <div…

Qt学习笔记1.3.4 QtCore-Qt资源系统

文章目录 资源收集文件(.qrc)外部二进制资源内编译(compiled-in)资源压缩使用应用程序中的资源使用库中的资源 Qt资源系统是一种 独立于平台的机制&#xff0c;用于在应用程序的可执行文件中存储二进制文件。如果您的应用程序总是需要一组特定的文件(图标、翻译文件等)&#x…

SuperMap GIS基础产品FAQ集锦(202404)

一、SuperMap GIS基础产品云GIS-FAQ集锦 问题1&#xff1a;【iServer】【11.1.1】 请问 iServer 是否支持多线程执行 Web 打印功能&#xff1f; 【解决办法】 iServer 是服务端&#xff0c;本身对于前端请求都是在 iServer 异步线程中处理的&#xff0c;可以同时发多个请求打…

【Vue】Vue指令与生命周期以及组件化编码

目录 常用内置指令v-text与v-htmlv-text : 更新元素的 textContentv-html : 更新元素的 innerHTML注意&#xff1a;v-html有安全性问题&#xff01;&#xff01;&#xff01;&#xff01; v-once与v-prev-oncev-pre ref与v-cloakrefv-cloak 自定义指令案例定义语法配置对象中常…

某攻防演练心得之随笔记

最近太忙了&#xff0c;忙于各种奇奇怪怪的事情&#xff0c;有攻防&#xff0c;有应急&#xff0c;有渗透&#xff0c;还成为了一段时间内的“word高级工程师”......有师傅说我现在更新的越来越慢了&#xff0c;是呀&#xff0c;其实我也不知道怎么了&#xff0c;每天各种新闻…

干部画像:在组织人事管理中的核心价值

在现代化的组织人事管理架构中&#xff0c;干部画像发挥着至关重要的角色。它不仅仅是对干部个人特质、能力素质、工作成效的综合展现&#xff0c;更是组织决策、人才培养与选拔的核心参照。以下&#xff0c;我们将深入解析干部画像在组织人事管理中的核心价值。 一、精准选拔…

FedDML:Federated Mutual Learning

这篇把DML运用到FL上 论文地址:arvix code: 作者git 贡献 我们针对三种异质性(DOM)提出了一种新颖的联邦学习范式,称为联邦相互学习(FML)。 首先,FML 处理数据和目标通过使每个客户能够训练个性化模型来实现异质性。 从OH的意义上来说,DH对服务器有害,但对客户端有…

一文解析嵌入式多核异构方案,东胜物联RK3588多核异构核心板系列一览

嵌入式人工智能快速发展&#xff0c;对于高性能计算需求越来越大。为了解决性能与功耗的平衡、通过并行化加速计算等&#xff0c;越来越多地嵌入式处理器使用同构多核、异构多核和协处理器的设计。 同时面对日益复杂的外部环境&#xff0c;国产嵌入式智能系统更离不开兼顾强实…

经典文献阅读之--U-BEV(基于高度感知的鸟瞰图分割和神经地图的重定位)

0. 简介 高效的重定位对于GPS信号不佳或基于传感器的定位失败的智能车辆至关重要。最近&#xff0c;Bird’s-Eye-View (BEV) 分割的进展使得能够准确地估计局部场景的外观&#xff0c;从而有利于车辆的重定位。然而&#xff0c;BEV方法的一个缺点是利用几何约束需要大量的计算…

AI大事记(持续更新)

文章目录 前言 一、人工智能AI 1.基本概念 2.相关领域 2.1基础设施 2.2大模型 2.3大模型应用 二、大事记 2024年 2024-05-14 GPT-4o发布 2024-02-15 Sora发布 2023年 2023-03-14 GPT-4.0发布 2022年 2022-11-30 ChatGPT发布 总结 前言 2022年11月30日openai的…

百面算法工程 | 特征工程相关理论

本文给大家带来的百面算法工程师是深度学习特征工程的面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习的面试问题&#xff0c;并提供参考的回答及其理论基…