AI大模型探索之路-训练篇8:大语言模型Transformer库-预训练流程编码体验

系列篇章💥

AI大模型探索之路-训练篇1:大语言模型微调基础认知
AI大模型探索之路-训练篇2:大语言模型预训练基础认知
AI大模型探索之路-训练篇3:大语言模型全景解读
AI大模型探索之路-训练篇4:大语言模型训练数据集概览
AI大模型探索之路-训练篇5:大语言模型预训练数据准备-词元化
AI大模型探索之路-训练篇6:大语言模型预训练数据准备-预处理
AI大模型探索之路-训练篇7:大语言模型Transformer库之HuggingFace介绍


目录

  • 系列篇章💥
  • 前言
  • 案例场景
  • 准备工作
    • 1)学术加速
    • 2)安装LFS
    • 3)下载数据集(原始语料库)
    • 4)下载模型到本地
  • 步骤1:导入相关依赖
  • 步骤2:获取数据集
  • 步骤3:构建数据集
  • 步骤4:划分数据集
  • 步骤5:创建DataLoader
  • 步骤6:创建模型及其优化器
  • 步骤7:训练与验证
  • 步骤8:模型预测
  • 总结


前言

在深入探索Transformer库及其高级组件之前,我们先手工编写一个预训练流程代码。这一过程不仅有助于理解预训练的步骤和复杂性,而且能让您体会到后续引入高级组件所带来的开发便利性。通过实践,我们将构建一个情感分类模型,该模型能够接收文本评价并预测其是正面还是负面的情感倾向。

案例场景

想象一下,我们有一个原始数据集,其中包含了酒店顾客的评价文本。我们的目标是训练一个模型,当输入类似“昨天我在酒店睡觉发现被子有一股霉味。”的评价时,模型能够预测出“差评”。
在这里插入图片描述

准备工作

本次仍是采用云服务器autodl调试运行

1)学术加速

source /etc/network_turbo

在这里插入图片描述

2)安装LFS

从 Hugging Face Hub 下载模型需要先安装Git LFS
安装git-lfs是为了确保从Hugging Face拉取模型时能够高效且完整地下载所有相关文件,尤其是那些大型的模型文件。
Ubuntu系统操作命令:
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
在这里插入图片描述

sudo apt-get install git-lfs
在这里插入图片描述

Centos命令参考:

curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.rpm.sh | sudo bash
sudo yum install git-lfs

执行:git lfs install
在这里插入图片描述

3)下载数据集(原始语料库)

创建一个pretrains目录,将数据集下载到这个目录,下载到本地后可以提高执行效率
git clone https://huggingface.co/datasets/dirtycomputer/ChnSentiCorp_htl_all
在这里插入图片描述

注意!重要!!:下载后请记得和Huggingface上的文件对比,尤其是大文件,确保下载完整

4)下载模型到本地

git clone https://huggingface.co/hfl/rbt3
下载到本地后,从本地加载执行效率更高
在这里插入图片描述
注意!重要!!:下载后请记得和Huggingface上的文件对比,尤其是大文件,确保下载完整

步骤1:导入相关依赖

首先,我们需要设置Python环境,并导入必要的库

from transformers import AutoTokenizer, AutoModelForSequenceClassification

步骤2:获取数据集

获取数据集是预训练中关键一步。我们使用前面从Huggingface下载的包含酒店评价的文本数据集。
1)加载本地的数据集,查看读取内容

import pandas as pd
data = pd.read_csv("/root/pretrains/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv")
data.dropna()
data

执行输出如下:
在这里插入图片描述

步骤3:构建数据集

创建一个自定义的数据集类,它将负责读取原始数据,可以执行必要的预处理步骤(例如清洗、分词、向量化),并将数据划分为训练集和验证集。

from torch.utils.data import Dataset

import pandas as pd

class MyDataset(Dataset):
    def __init__(self) -> None:
        super().__init__()
        self.data = pd.read_csv("/root/pretrains/ChnSentiCorp_htl_all/ChnSentiCorp_htl_all.csv")
        self.data = self.data.dropna()
    def __getitem__(self,index):
        return self.data.iloc[index]["review"], self.data.iloc[index]["label"]
    def __len__(self):
        return len(self.data) 

dataset = MyDataset()
for i in range(5):
    print(dataset[i])
('距离川沙公路较近,但是公交指示不对,如果是"蔡陆线"的话,会非常麻烦.建议用别的路线.房间较为简单.', 1)
('商务大床房,房间很大,床有2M宽,整体感觉经济实惠不错!', 1)
('早餐太差,无论去多少人,那边也不加食品的。酒店应该重视一下这个问题了。房间本身很好。', 1)
('宾馆在小街道上,不大好找,但还好北京热心同胞很多~宾馆设施跟介绍的差不多,房间很小,确实挺小,但加上低价位因素,还是无超所值的;环境不错,就在小胡同内,安静整洁,暖气好足-_-||。。。呵还有一大优势就是从宾馆出发,步行不到十分钟就可以到梅兰芳故居等等,京味小胡同,北海距离好近呢。总之,不错。推荐给节约消费的自助游朋友~比较划算,附近特色小吃很多~', 1)
('CBD中心,周围没什么店铺,说5星有点勉强.不知道为什么卫生间没有电吹风', 1)

步骤4:划分数据集

对数据集进行划分,语料库中90%作为预训练数据,10%作为验证数据;这确保了模型在未见过的数据上进行验证和测试。

from torch.utils.data import  random_split

trainset, validset = random_split(dataset,lengths=[0.9,0.1])
len(trainset),len(validset)

输出:(6989, 776)

步骤5:创建DataLoader

1)加载数据集
利用分词器进行数据加载(即将文本数据转化为机器能识别的数字序列矩阵)
为了高效地加载数据,采用批量的方式加载预训练数据和校验数据,加载时最大长度为128,多了会进行截取,少了会自动补0

import torch
from torch.utils.data import DataLoader

tokenizer = AutoTokenizer.from_pretrained("/root/pretrains/rbt3")

def collate_func(batch):
    texts,labels=[],[]
    for item in batch:
        texts.append(item[0])
        labels.append(item[1])
        ## return_tensors="pt" 返回的是pytorch tensor类型。
        ## 吃葡萄不吐葡萄皮
        ## 不吃葡萄到吐葡萄皮
    inputs = tokenizer(texts,max_length=128,padding="max_length",truncation=True, return_tensors="pt")
    inputs["labels"] = torch.tensor(labels)
    return inputs
## dataloader中设置shuffle值为True,表示每次加载的数据都是随机的,将输入数据的顺序打乱。shuffle值为False,
## 表示输入数据顺序固定。

trainloader = DataLoader(trainset,batch_size=32,shuffle=True,collate_fn=collate_func)
validloader = DataLoader(validset,batch_size=64,shuffle=False,collate_fn=collate_func)

next(enumerate(validloader))[1]

输出如下:(下面tensor就是转化后的序列矩阵)
在这里插入图片描述

步骤6:创建模型及其优化器

根据本地下载的模型地址,创建模型对象
基于Transformer架构,定义一个情感分类模型。选择合适的优化器(如AdamW或RMSprop)以调整模型权重,从而最小化损失函数。

from torch.optim import Adam

from transformers import AutoModelForSequenceClassification

model = AutoModelForSequenceClassification.from_pretrained("/root/pretrains/rbt3")

if torch.cuda.is_available():
    model = model.cuda()
"""
当我们训练一个机器学习模型时,我们需要选择一个优化算法来帮助我们找到模型参数的最佳值。这个优化算法就是优化器(optimizer)。

在这行代码中,我们选择了一种叫做Adam的优化算法作为我们的优化器。Adam算法是一种常用的优化算法,
它根据每个参数的梯度(即参数的变化率)和学习率(lr)来更新参数的值。

"model.parameters()"表示我们要优化的是模型的参数。模型的参数是模型中需要学习的权重和偏置等变量。

"lr=2e-5"表示学习率的值被设置为2e-5(即0.00002)。学习率是控制模型在每次迭代中更新参数的步长。较大的学习率可能导致模型无法收敛,
而较小的学习率可能需要更长的训练时间
"""
optimizer = Adam(model.parameters(), lr=2e-5)

步骤7:训练与验证

定义一个训练和评估的函数
设定训练循环,包括前向传播、计算损失、反向传播和权重更新。同时,定期在验证集上检查模型性能,以监控过拟合情况并及时停止训练。
def evaluate():
    ## 将模型设置为评估模式
    model.eval()
    acc_num=0
    #将训练模型转化为推理模型,模型将使用转换后的推理模式进行评估
    with torch.inference_mode():
        for batch in validloader:
            ## 检查是否有可用的GPU,如果有,则将数据批次转移到GPU上进行加速
            if torch.cuda.is_available():
                batch = {k: v.cuda() for k,v in batch.items()}
            ##对数据批次进行前向传播,得到模型的输出
            output = model(**batch)
            ## 对模型输出进行预测,通过torch.argmax选择概率最高的类别。
            pred = torch.argmax(output.logits,dim=-1)
            ## 计算正确预测的数量,将预测值与标签进行比较,并使用.float()将比较结果转换为浮点数,使用.sum()进行求和操作
            acc_num += (pred.long() == batch["labels"].long()).float().sum()
    ## 返回正确预测数量与验证集样本数量的比值,这表示模型在验证集上的准确率
    return acc_num / len(validset)

def train(epoch=3,log_sep=100):
    global_step = 0
    for ep in range(epoch):
        ## 开启训练模式
        model.train()
        for batch in trainloader:
            if torch.cuda.is_available():
                batch = {k: v.cuda() for k, v in batch.items()}
            ## 梯度归0
            optimizer.zero_grad()
            ## 对数据批次进行前向传播,得到模型的输出
            output=model(**batch)
            ## 计算损失函数梯度并进行反向传播
            output.loss.backward()
            ## 优化器更新
            optimizer.step()
            if(global_step % log_sep == 0):
                print(f"ep:{ep},global_step:{global_step},loss:{output.loss.item()}")
            global_step += 1
        ## 准确率
        acc = evaluate()
        ## 第几轮
        print(f"ep:{ep},acc:{acc}")

# 训练
train()

输出3轮训练结果,准确率在88%-89%左右
在这里插入图片描述

步骤8:模型预测

完成训练后,利用训练好的模型对新输入的评价进行情感分类。展示模型如何接收新文本,并输出预测结果。

#sen = "我昨晚在酒店里睡得非常好"
sen ="昨天我在酒店睡觉发现被子有一股霉味"

id2label = {0:"差评",1:"好评"}
## 将模型设置为评估模式
model.eval

 #将训练模型转化为推理模型,模型将使用转换后的推理模式进行评估
with torch.inference_mode():
    ## 分词&&向量化
    inputs = tokenizer(sen,return_tensors = "pt")
    ## GPU加速
    inputs = {k:v.cuda() for k,v in inputs.items()}
    ## 进行预测
    logits=model(**inputs).logits
    ## 在logits的最后一个维度上找到最大值,并返回其所在的索引。这相当于选择模型认为最有可能的类别
    pred = torch.argmax(logits, dim = -1)
    
    print(f"输入:{sen} \n模型的预测结果:{id2label.get(pred.item())}")

1)第1次预测:(sen =“昨天我在酒店睡觉发现被子有一股霉味”)
输入:昨天我在酒店睡觉发现被子有一股霉味
模型的预测结果:差评
2)第2次预测:(sen =“我昨晚在酒店里睡得非常好”)
输入:我昨晚在酒店里睡得非常好
模型的预测结果:好评

总结

通过上述步骤,我们手工完成了基于Transformer库的情感分类模型预训练流程。虽然这个过程涉及了大量细节和代码编写,但它为我们提供了宝贵的洞见,让我们了解了从原始数据处理到模型训练和验证的整个流程。在后续篇章中,我们将引入更多的Transformer组件,这些高级工具将显著简化我们的开发流程,使我们能够更快捷、更高效地进行模型开发和实验

在这里插入图片描述

🎯🔖更多专栏系列文章:AIGC-AI大模型探索之路

如果文章内容对您有所触动,别忘了点赞、⭐关注,收藏!加入我,让我们携手同行AI的探索之旅,一起开启智能时代的大门!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

stable diffusion controlnet前处理中的图像resize

在SD controlnet应用中,一般都要先安装controlnet_aux,并在项目代码中import相关前处理模块,如下所示。 在对control image进行前处理(比如找边缘,人体特征点)之前,往往会图像进行resize&#x…

【论文阅读——基于拍卖的水平联邦学习后付款激励机制设计与声誉和贡献度测量】

1.原文名称 Auction-Based Ex-Post-Payment Incentive Mechanism Design for Horizontal Federated Learning with Reputation and Contribution Measurement 2.本文的贡献 我们提出了一种贡献度测量方法。我们建立了一个声誉系统。声誉易于下降,难以提高。结合声…

Redis源码学习记录:列表 (ziplist)

ziplist redis 源码版本&#xff1a;6.0.9。ziplist 的代码均在 ziplist.c / ziplist.h 文件中。 定义 ziplist总体布局如下&#xff1a; <zlbytes> <zltail> <zllen> <entry> <entry> ... <entry> <zlend> zlbytes&#xff1a;uin…

stm32单片机开发一、中断之外部中断实验

stm32单片机的外部中断和定时器中断、ADC中断等都由stm32的内核中的NVIC模块控制&#xff0c;stm32的中断有很多中&#xff0c;比如供电不足中断&#xff0c;当供电不足时&#xff0c;会产生的一种中断&#xff0c;这么多中断如果都接在CPU上&#xff0c;或者说CPU去处理&#…

普乐蛙元宇宙VR体验馆设备集体亮相VR文旅景区展

普乐蛙全国巡展又双叒叕开始了! 这次来到的是“好客山东”↓↓ 山东2024休闲旅游产业展 4月25日至27日&#xff0c;2024休闲旅游产业展在临沂国际博览中心举办。本次展会以“潮购文旅好品&#xff0c;乐享时尚生活”为主题&#xff0c;汇聚全国文旅产业上下游500多家企业、上万…

基于FCN网络实现的多类别图像分割任务

1、前言 FCN 作为图像分割的开山之作&#xff0c;将分割任务作为逐个像素点的分类任务 之前完成了基于unet、resnetunet、deeplab等等网络的分割任务&#xff0c;具体的可以参考本专栏&#xff1a; 图像分割_听风吹等浪起的博客-CSDN博客 因为FCN网络的实现较为复杂&#xf…

【阿里笔试题汇总】[全网首发] 2024-04-29-阿里国际春招笔试题-三语言题解(CPP/Python/Java)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新阿里国际近期的春秋招笔试题汇总&#xff5e; &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x…

访学/博后/联培博士关注|不同国家的英语口音辨识度训练

在访问学者、博士后及联合培养的申请过程中&#xff0c;接收方多数都要求英文面试。如果导师的母语为非英语国家&#xff0c;将会带有口音&#xff0c;这样更增加了英语面试难度。如何提升不同国家的英语口音辨识度&#xff0c;使自己的英语表达更加流利&#xff0c;知识人网小…

01数学建模 -线性规划

1.1线性规划–介绍 翻译翻译什么叫惊喜 1.2线性规划–原理 拉格朗日乘数法手算 最值化 f ( x , y ) , s . t . g ( x , y ) c , 引入参数 λ &#xff0c;有&#xff1a; F ( x , y , λ ) f ( x , y ) λ ( g ( x , y ) − c ) 再将其分别对 x , y , λ 求导&#xff0c…

第十五届蓝桥杯省赛第二场C/C++B组H题【质数变革】题解

解题思路 首先&#xff0c;我们考虑一下整个数组都是由质数构成的情况。 当我们要将质数 x x x 向后移 k k k 个时&#xff0c;如果我们可以知道质数 x x x 在质数数组的下标 j j j&#xff0c;那么就可以通过 p r i m e s [ j k ] primes[j k] primes[jk] 来获取向后…

远程桌面的端口配置与优化

在现代企业环境中&#xff0c;远程桌面连接已成为日常工作中不可或缺的一部分。然而&#xff0c;随着网络攻击的增加&#xff0c;确保远程桌面连接的安全性变得尤为重要。其中一个关键的安全因素是端口配置。 一、远程桌面默认端口 远程桌面协议&#xff08;RDP&#xff09;默…

vue2迁移到vue3,v-model的调整

项目从vue2迁移到vue3&#xff0c;v-model不能再使用了&#xff0c;需要如何调整&#xff1f; 下面只提示变化最小的迁移&#xff0c;不赘述vue2和vue3中的常规写法。 vue2迁移到vue3&#xff0c;往往不想去调整之前的代码&#xff0c;以下就使用改动较小的方案进行调整。 I…

无人机反制:雷达探测+信号干扰器技术详解

固定翼无人机、旋翼无人机等&#xff0c;可折叠式无机、DIY无人机等。黑飞&#xff0c;监管困难给航空业带来了诸多隐患&#xff1b;给恐怖袭击及间谍侦察带来新的方式、引发了各国地区政府的忧虑&#xff0c;在中国存在的问题更加严峻。 反无人飞行器防御系统(AUDS)&#xff0…

positivessl通配符证书签发13个月仅400元

PositiveSSL是Sectigo旗下的数字证书品牌&#xff0c;旗下的数字证书产品不仅具有签发速度快、性价比高以及兼容性高等特点&#xff0c;还可以为网站提供传输信息加密服务&#xff0c;保护客户隐私安全&#xff0c;提升客户对网站的信任度。今天就随SSL盾小编了解PositiveSSL旗…

【好书推荐8】《智能供应链:预测算法理论与实战》

【好书推荐8】《智能供应链&#xff1a;预测算法理论与实战》 写在最前面编辑推荐内容简介作者简介目录精彩书摘前言/序言我为什么要写这本书这本书能带给你什么 致谢 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴…

C#基础|对象初始化器与构造方法对比总结

哈喽&#xff0c;你好啊&#xff0c;我是雷工&#xff01; 01 对象初始化器的作用 为了更加灵活的初始化对象的“属性”&#xff0c;是对构造化方法的补充。 02 构造方法总结 2.1、存在的必要性&#xff1a;一个类中&#xff0c;至少要有一个构造方法&#xff08;有无参数均…

公网ip申请ssl仅260

现在很多网站都已经绑定域名&#xff0c;因此使用的都是域名SSL证书保护网站传输信息安全&#xff0c;而没有绑定域名只有公网IP地址的网站想要保护传输信息安全就要申请IP SSL证书。IP SSL证书也是由正规CA认证机构颁发的数字证书&#xff0c;用来保护用户的隐私以及数据安全&…

本地运行测试 YOLOv8(20240423)

一、环境搭建请参考&#xff1a;Win10 搭建 YOLOv8 运行环境&#xff08;20240423&#xff09;-CSDN博客 二、安装 PyCham 1.1、下载安装 官网地址&#xff1a;Download PyCharm: The Python IDE for data science and web development by JetBrains 阿里云盘&#xff08;社区…

免费的单片机物联网MQTT平台选择

目的是多设备接入中控&#xff0c;平台只做转发。 选择巴法云&#xff1a;巴法科技&巴法云-巴法设备云-巴法物联网云平台 clientId是私钥uid&#xff1a; 多设备 clientId 填同一个 uid 都是可以的。平台应该是加了后缀区分。 支持自定义topic&#xff0c;操作简单&#x…

Stable Diffusion使用ControlNet:IP-Adapter实现图片风格迁移

IP-Adapter 全称是 Text Compatible Image Prompt Adapter for Text-to-Image Diffusion Models&#xff08;文本到图像扩散模型的文本兼容图像提示适配器&#xff09;&#xff0c;是腾讯研究院出品的一个新的ControlNet模型&#xff0c;旨在使预训练的文本到图像扩散模型能够生…