通义千问 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.rhkb.cn/news/327237.html

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

相关文章

音源分离 | Hybrid Spectrogram and Waveform Source Separation

一、摘要 本文提出了基于Demucs架构的的时域频域的分离模型。提出的模型在2021年索尼组织的音乐分离挑战中获胜。该架构还包括其他改进&#xff0c;如压缩残差分支、局部注意力或奇异值正则化。 在MusDB HQ数据集上&#xff0c;所有源的信噪比&#xff08;SDR&#xff09;平均提…

Flutter 玩转动画 + 自定义View 实现积分或金币领取流程动画

一、效果图 二、主要涉及的知识点 AnimationController、Animation、FractionalTranslation 动画Api的运用CustomPainter 自定义View以及每个时机的把握 主要是写篇博客来记录一下这个功能的实现&#xff0c;具体代码就看源代码了&#xff0c;有疑问可以私信沟通 源代码下载…

免费泛域名/通配符SSL证书获取高质量教程

随着网络安全意识的提升&#xff0c;HTTPS加密已经成为网站标配&#xff0c;确保数据传输的安全性。对于拥有多个子域名的网站&#xff0c;使用泛域名或通配符SSL证书无疑是最高效、经济的解决方案。本文将详细介绍如何免费获取并部署高质量的泛域名/通配符SSL证书&#xff0c;…

Allegro如何输出各层PCB视图的PDF文件

如何输出各层PCB视图的PDF文件 1、说明 用Allegro设计好PCB后&#xff0c;有时需要出各层的PDF文档出来进行汇报和展示&#xff0c;这时就需要将各层的平面视图全部以PDF的形式加载出来&#xff0c;具体方法如下。 2、PDF文件的输出方法&#xff08;以四层板为例&#xff09; …

木里风景文化|基于SSM+vue的木里风景文化管理平台的设计与实现(源码+数据库+文档)

木里风景文化管理平台 目录 基于SSM&#xff0b;vue的木里风景文化管理平台的设计与实现 一、前言 二、系统设计 三、系统功能设计 1 系统功能模块 2 管理员功能模块 3 用户功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源…

OpenAI最新模型GPT4o十个牛逼的应用场景!

OpenAI真是要压着谷歌打么&#xff1f;哈哈&#xff01; 直接赶在谷歌之前开了一个新品发布会。 今天凌晨直播&#xff0c;早上一起来就发现已经可以体验新模型了。 从录播内容来看&#xff0c;并没有传言的GPT5&#xff0c;也没有所谓的搜索功能。 但是&#xff0c;这次更新…

数字化社会的引擎:揭示Facebook的影响力

在当今数字化社会中&#xff0c;社交媒体平台扮演着至关重要的角色&#xff0c;而Facebook作为其中的巨头之一&#xff0c;其影响力不可忽视。本文将深入探讨Facebook的影响力&#xff0c;从多个角度揭示其在数字化社会中的引擎作用。 1. 社交互动的核心平台 Facebook作为社交…

利用爬虫解决数据采集难题

文章目录 安装为什么选择 BeautifulSoup 和 requests&#xff1f;安装 BeautifulSoup 和 requests解决安装问题 示例总结 在现代信息时代&#xff0c;数据是企业决策和发展的关键。然而&#xff0c;许多有用的数据分散在网络上&#xff0c;且以各种格式和结构存在&#xff0c;因…

HCIP的学习(16)

BGP的状态机 ​ OSPF的状态机是在描述整个协议的完整工作过程&#xff0c;而BGP的状态机仅描述的是对等体关系建立过程中的状态变化。-----因为BGP将邻居建立过程以及BGP路由收发过程完全隔离。 ​ IGP协议在启动后&#xff0c;需要通过network命令激活接口&#xff0c;从而使…

JavaEE技术之MySql主从复制及mycat[了解,不讲]

文章目录 1. 主从复制1.1. 主从同步的原理1.2. 检查数据库远程访问权限1.3. 主从配置1.3.1. master配置1.3.2. slave配置1.3.3. 主库创建同步用户1.3.4. 从库配置主从关系1.3.5. 重置主从关系 1.4. 测试主从复制 2. Mycat2.1. Mycat简介2.2. MyCat读写分离原理2.3. 不废话&…

【快捷部署】022_ZooKeeper(3.5.8)

&#x1f4e3;【快捷部署系列】022期信息 编号选型版本操作系统部署形式部署模式复检时间022ZooKeeper3.5.8Ubuntu 20.04tar包单机2024-05-07 一、快捷部署 #!/bin/bash ################################################################################# # 作者&#xff…

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门

ICode国际青少年编程竞赛- Python-4级训练场-嵌套for循环入门 1、 for i in range(3):Dev.step(3)for j in range(3):Dev.turnLeft()Dev.step(-2)Dev.turnLeft()2、 for i in range(3):Dev.turnLeft()Dev.step(4)Dev.turnRight()Dev.step(2)for i in range(4):Dev.step(2)D…

如何获得一个Oracle 23ai数据库(RPM安装)

准确的说&#xff0c;是Oracle 23ai Free Developer版&#xff0c;因为企业版目前只在云上&#xff08;OCI和Azure&#xff09;和ECC上提供。 方法包括3种&#xff0c;本文介绍第2种&#xff1a; Virtual ApplianceRPM安装Docker RPM安装支持Linux 8和Linux 9。由于官方的Vi…

17-LINUX--线程与fork()

一.多线程程序fork() 多线程出现fork()后&#xff0c;只复制一条执行路径&#xff0c;是fork()所在的那条执行路径 主程序fork()示例代码&#xff1a; include<stdio.h> #include<stdlib.h> #include<string.h> #include<pthread.h> #include<un…

《企业科技与发展》是什么级别的期刊?是正规期刊吗?

问题解答 问&#xff1a;《企业科技与发展》期刊怎么样&#xff1f; ​答&#xff1a;企业科技与发展》&#xff08;月刊&#xff09;1985年创刊&#xff0c;由广西科学技术厅主管、广西科学技术情报研究所主办&#xff0c;国内外公开发行。主要栏目:科技对策与研究、企业科技…

unordered_map、unordered_set底层封装

文章目录 一、先实现哈希桶1.1哈希桶的实现方法1.2日常普遍的哈希桶存放的数据有两种&#xff1a;字符串和整形1.3哈希桶的实现代码详解1.3.1哈希桶的两种仿函数&#xff08;int和string&#xff09;1.3.2哈希桶的节点&#xff08;如果桶非常深&#xff0c;这里考虑挂红黑树&am…

下载文件名称乱码或变成了随机码

如图 后端是有正常返回附件名称的,浏览器开发工具中也正常显示了这个数据,但是下载下来的文件名称确实一堆随机码. 其实这个问题的原因是因为跨域 查看console: Refused to get unsafe header "content-disposition" 现象,后端传递到前端的fileName不能被识别,下载…

美业收银系统源码-App/iPad/PC管理系统常见问题讲解(1)

博弈美业管理系统源码 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 1、平板iPad的评论内容&#xff0c;是从哪里评论的呢&#xff1f; 顾客在接受服务后&#xff0c;可以到…

H5 鼠标点击粒子扩散效果

&#x1f9d0;别人的博客中有这样的效果&#xff0c;于是自己就尝试实现了一下。 效果如图 源码如下 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content&quo…

20240507 ubuntu20.04+ros noetic 跑通lioslam

任务&#xff1a;跑通lioslam 主要参考博客 IMU激光雷达融合使用LIO-SAM建图学习笔记——详细、长文、多图、全流程_ubuntu_AIDE回归线-GitCode 开源社区 (csdn.net) 1.不要用这一句 wget -O ~/Downloads/gtsam.zip https://github.com/borglab/gtsam/archive/4.0.0-alpha2…