Huggingface使用

news2024/12/23 14:48:56

文章目录

  • 前置安装
  • Huggingface介绍
    • NLP模块分类
    • transformer流程
    • 模块使用详细讲解
      • tokennizer
      • model
      • datasets
      • Trainer
  • Huggingface使用
    • 网页直接体验
    • API调用
    • 本地调用(pipline)
    • 本地调用(非pipline)

前置安装

  1. anaconda安装

  2. 使用conda创建一个新环境并安装pytorch

    打开链接 https://pytorch.org/get-started/locally/, 选择对应的系统即可
    在这里插入图片描述

  3. 安装transformersdatasets

pip install transformers
pip install datasets

这两个是huggingface最核心的模块

  1. 安装torch
pip install torch

Huggingface介绍

本次只介绍 NLP(Natural Language Processing)相关的模型,其他的,如 文本生成语音,文本生成图片相关的模型不做过多介绍,使用起来基本都大差不差的。也可以直接阅读Huggingface提供的官方文档:https://huggingface.co/learn/nlp-course/zh-CN/chapter0/1?fw=pt

NLP模块分类

NLP 一共有以下几大模型类别,每个类别下模型做的事情也不一样,有的是用来翻译的,有的是分类,而有的是文本生成,具体有那些可通过这个链接查看:https://huggingface.co/models

  • text-classification 文本分类,给一段文本进行打标分类
  • feature-extraction 特征提取:把一段文字用一个向量来表示
  • fill-mask 填词:把一段文字的某些部分mask住,然后让模型填空
  • ner 命名实体识别:识别文字中出现的人名地名的命名实体
  • question-answering 问答:给定一段文本以及针对它的一个问题,从文本中抽取答案
  • summarization 摘要:根据一段长文本中生成简短的摘要
  • text-generation文本生成:给定一段文本,让模型补充后面的内容
  • translation 翻译:把一种语言的文字翻译成另一种语言
    在这里插入图片描述

transformer流程

一般transformer模型有三个部分组成:1.tokennizer,2.Model,3.Post processing

  1. 分词器将我们输入的信息转成 Input IDs
  2. 将Input IDs输入到模型中,模型返回预测值
  3. 将预测值输入到后置处理器中,返回我们可以看懂的信息

模块使用详细讲解

tokennizer

官网文档地址

分词器的职责

  • 将输入拆分为单词、子单词或符号(如标点符号),称为标记(token)
  • 将每个标记(token)映射到一个整数
  • 添加可能对模型有用的其他输入

代码使用

from transformers import AutoTokenizer
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

raw_inputs = [
    "I love you",
    "I love you so much",
]
inputs = tokenizer(raw_inputs, max_length=8, padding=True, truncation=True, return_tensors="pt")
print(inputs)
'''
输出{'input_ids': tensor([[ 101, 1045, 2293, 2017,  102,    0,    0],
        [ 101, 1045, 2293, 2017, 2061, 2172,  102]]), 
        'attention_mask': tensor([[1, 1, 1, 1, 1, 0, 0],  [1, 1, 1, 1, 1, 1, 1]])}
'''

# 将ids反解码
output = tokenizer.decode([ 101, 1045, 2293, 2017,  102])
print(output )
## 输出:[CLS] i love you [SEP]

输出结果说明

  • input_ids: 也就是输入到模型里的数据,每次数字都对应我们输入的一个词,这里可以看到 我们输入了 3个词,但输出了8个数字,这是因为 最两个0是用来补齐到最大长度的,而 除此之外的 首尾 数字 是个标识符, 101 标识这是做文本分类,102 表示这行句子结束了
  • attention_mask: 是有效运算字符标识,1表示ids里这个位置的字符是有效的,0表示这个位置是补齐的

tokenizer参数说明

  • max_length : 表示每一个的ids数组的最大长度
  • padding: 表示是否需要补齐位数
  • truncation: 表示超过最大长度后是否需要阶段
  • return_tensors:表示返回的tensor为pytorch,也可以写 tf 表示 tensorflow

model

通过该地址可查看Huggingface的所有模型:https://huggingface.co/models

模型职责
模型Head将隐藏状态的高维向量作为输入,并将其投影到不同的维度。它们通常由一个或几个线性层组成。下图是模型的基本逻辑
在这里插入图片描述
在此图中,模型由其嵌入层和后续层表示。嵌入层将标记化输入中的每个输入ID转换为表示关联标记(token)的向量。后续层使用注意机制操纵这些向量,以生成句子的最终表示。

代码使用

## 最简单的使用
from transformers import AutoModel
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModel.from_pretrained(checkpoint)

如果我们需要一个带有序列分类头的模型(能够将句子分类为肯定或否定)。我们实际上不会直接使用AutoModel类,而是使用AutoModelForSequenceClassification

from transformers import AutoModelForSequenceClassification
from transformers import AutoTokenizer
import torch

checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"
# 文本输入
raw_inputs = [
    "I love you",
    "I love you so much",
]
# 加载分词器
tokenizer = AutoTokenizer.from_pretrained(checkpoint)
# 执行分词器
inputs = tokenizer(raw_inputs, max_length=8, padding=True, truncation=True, return_tensors="pt")
# 加载模型
model = AutoModelForSequenceClassification.from_pretrained(checkpoint)
# 为了获得每个位置对应的标签,我们可以检查模型配置的id2label属性(下一节将对此进行详细介绍):
print(model.config.id2label)
# 输出 {0: 'NEGATIVE', 1: 'POSITIVE'} 表示越靠近0是负面的,越靠近1是正向的
# 调用模型输出
outputs = model(**inputs)
## 将模型输出的预测值logits给到torch,返回我们可以看懂的数据
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)
# 输出 tensor([[1.3436e-04, 9.9987e-01],[1.3085e-04, 9.9987e-01]], grad_fn=<SoftmaxBackward0>)
# 第一句话,NEGATIVE=0.0001, POSITIVE=0.99 所以第一句话大概率是正向的

Transformers中有许多不同的体系结构,每种体系结构都是围绕处理特定任务而设计的。以下是一个非详尽的列表:

  • *Model (retrieve the hidden states)
  • *ForCausalLM
  • *ForMaskedLM
  • *ForMultipleChoice
  • *ForQuestionAnswering
  • *ForSequenceClassification
  • *ForTokenClassification
  • 其他

datasets

通过该地址可查看Huggingface的所有数据集:https://huggingface.co/datasets

在这里插入图片描述
加载数据集

from datasets import load_dataset

dataset = load_dataset("glue", "mrpc")
print(dataset)
'''
输出
DatasetDict({
	//训练的数据集
    train: Dataset({
        features: ['sentence1', 'sentence2', 'label', 'idx'],
        num_rows: 3668
    })
    // 校验数据集
    validation: Dataset({
        features: ['sentence1', 'sentence2', 'label', 'idx'],
        num_rows: 408
    })
    // 测试数据集
    test: Dataset({
        features: ['sentence1', 'sentence2', 'label', 'idx'],
        num_rows: 1725
    })
})
'''

加载本地或远端数据集

from datasets import load_dataset

## 加载本地数据集
local_data_files = {"train": "SQuAD_it-train.json", "test": "SQuAD_it-test.json"}
squad_it_dataset = load_dataset("json", data_files=local_data_files , field="data")

## 加载外部远端上数据集
url = "https://github.com/crux82/squad-it/raw/master/"
data_files = {
    "train": url + "SQuAD_it-train.json.gz",
    "test": url + "SQuAD_it-test.json.gz",
}
squad_it_dataset = load_dataset("json", data_files=data_files, field="data")

数据集操作

官方文档:https://huggingface.co/learn/nlp-course/zh-CN/chapter3/2?fw=pt

from datasets import load_dataset

drug_sample= load_dataset("glue", "mrpc")
print(drug_sample)

# 抽样1000个数据,并打印前3个
print(drug_sample["train"].shuffle(seed=42).select(range(1000))[:3])

def tokenizer_datset(data):
	return tokenizer(data["sentence1"], data["sentence2"], truncation=True)
# 对集合里每个数据进行分词处理
drug_sample = drug_sample.map(tokenizer_datset, batched=True)
print(drug_sample)
'''
输出, 可以看到分词器产生的列(input_ids,attention_mask)已经加到数据集里了
Dataset({
    features: ['sentence1', 'sentence2', 'label', 'idx', 'input_ids', 'attention_mask'],
    num_rows: 1000
})
'''
# 移除不需要的列
drug_sample = drug_sample.remove_columns(["sentence1", "sentence2", "idx"])
# 对列进行改名, label => labels
drug_sample = drug_sample.rename_column("label", "labels")

Trainer

官网文档:https://huggingface.co/learn/nlp-course/zh-CN/chapter3/3?fw=pt

代码使用

from datasets import load_dataset
from transformers import AutoTokenizer, DataCollatorWithPadding,TrainingArguments, AutoModelForSequenceClassification, Trainer

# 获取数据集
raw_datasets = load_dataset("glue", "mrpc")

# 加载分词器
checkpoint = "bert-base-uncased"
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

# 对集合里的数据进行分词
def tokenize_function(example):
    return tokenizer(example["sentence1"], example["sentence2"], truncation=True)
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)

# 数据打包器
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

# 加载模型
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)

# 获取train参数
training_args = TrainingArguments("test-trainer")
trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
)

# 开始训练
trainer.train()

为了查看模型在每个训练周期结束的好坏,我们可以使用compute_metrics()函数定义一个新的 Trainer

# 测算模型的准确率
import evaluate

def compute_metrics(eval_preds):
    metric = evaluate.load("glue", "mrpc")
    logits, labels = eval_preds
    predictions = np.argmax(logits, axis=-1)
    return metric.compute(predictions=predictions, references=labels)

# evaluation_strategy,设置评估环节为epoch,这样每个训练周期结束就会测算下目前模型的准确率
training_args = TrainingArguments("test-trainer", evaluation_strategy="epoch")

trainer = Trainer(
    model,
    training_args,
    train_dataset=tokenized_datasets["train"],
    eval_dataset=tokenized_datasets["validation"],
    data_collator=data_collator,
    tokenizer=tokenizer,
    compute_metrics=compute_metrics,
)

自定义Trainer

from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler
from tqdm.auto import tqdm
import torch
from torch.utils.data import DataLoader

# 模型
checkpoint = "bert-base-uncased"

# 定义数据集
raw_datasets = load_dataset("glue", "mrpc")

# 定义分词器
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

# 数据集预处理
def tokenize_function(example):
    return tokenizer(example["sentence1"], example["sentence2"], truncation=True)
tokenized_datasets = raw_datasets.map(tokenize_function, batched=True)
tokenized_datasets = tokenized_datasets.remove_columns(["sentence1", "sentence2", "idx"])
tokenized_datasets = tokenized_datasets.rename_column("label", "labels")
tokenized_datasets.set_format("torch")

data_collator = DataCollatorWithPadding(tokenizer=tokenizer)

# 训练数据集加载器
train_dataloader = DataLoader(
    tokenized_datasets["train"], shuffle=True, batch_size=8, collate_fn=data_collator
)
# 评估数据集加载器
eval_dataloader = DataLoader(
    tokenized_datasets["validation"], batch_size=8, collate_fn=data_collator
)

# 加载模型
model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)

# 优化器和学习率调度器,学习率调度器只是从最大值 (3e-5) 到 0 的线性衰减
optimizer = AdamW(model.parameters(), lr=3e-5)

# 如果支持GPT则使用GPU进行训练
device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu")
model.to(device)

# 训练周期为3个
num_epochs = 3
num_training_steps = num_epochs * len(train_dataloader)
lr_scheduler = get_scheduler(
    "linear",
    optimizer=optimizer,
    num_warmup_steps=0,
    num_training_steps=num_training_steps,
)

# 加个进度条
progress_bar = tqdm(range(num_training_steps))

model.train()
for epoch in range(num_epochs):
    for batch in train_dataloader:
        batch = {k: v.to(device) for k, v in batch.items()}
        outputs = model(**batch)
        loss = outputs.loss
        loss.backward()

        optimizer.step()
        lr_scheduler.step()
        optimizer.zero_grad()
        progress_bar.update(1)

分布式训练

使用Accelerator 进行分布式训练

 from accelerate import Accelerator
 from transformers import AdamW, AutoModelForSequenceClassification, get_scheduler

model = AutoModelForSequenceClassification.from_pretrained(checkpoint, num_labels=2)
optimizer = AdamW(model.parameters(), lr=3e-5)

accelerator = Accelerator()

train_dataloader, eval_dataloader, model, optimizer = accelerator.prepare(
    train_dataloader, eval_dataloader, model, optimizer
)

  num_epochs = 3
  num_training_steps = num_epochs * len(train_dataloader)
  lr_scheduler = get_scheduler(
      "linear",
      optimizer=optimizer,
      num_warmup_steps=0,
      num_training_steps=num_training_steps
  )

  progress_bar = tqdm(range(num_training_steps))

  model.train()
  for epoch in range(num_epochs):
      for batch in train_dataloader:
          outputs = model(**batch)
          loss = outputs.loss
          accelerator.backward(loss)
          
          optimizer.step()
          lr_scheduler.step()
          optimizer.zero_grad()
          progress_bar.update(1)

Huggingface使用

网页直接体验

可以在某个模型下直接体验该模型的效果
在这里插入图片描述

API调用

这个调用每天有量级限制

  1. 获取token
  2. 通过API访问
import os, requests, json
API_TOKEN = os.environ.get("HUGGINGFACE_API_KEY")
model = "google/flan-t5-xxl"
API_URL = f"https://api-inference.huggingface.co/models/{model}"
headers = {"Authorization": f"Bearer {API_TOKEN}", "Content-Type": "application/json"}

def query(payload, api_url=API_URL, headers=headers):    
	data = json.dumps(payload)    
	response = requests.request("POST", api_url, headers=headers, data=data)    
	return json.loads(response.content.decode("utf-8"))

question = "Please answer the following question. What is the capital of France?"
data = query({"inputs" : question})
print(data)

本地调用(pipline)

本地调用需要将model下载到本地,好处是可以自己训练,微调参数
不过有的模型比较大,下载起来会比较慢
pipline 背后的流程: tokenizer => model => post-processing

from transformers import pipeline
# 进行文本分类,模型为:finiteautomata/bertweet-base-sentiment-analysis
classifier = pipeline("text-classification", model="finiteautomata/bertweet-base-sentiment-analysis")
res = classifier(["I'd love to learn the HuggingFace course", "fuck you"])
print(res) 

本地调用(非pipline)

如果不使用pipeline 也可以一步一步调用

from transformers import AutoTokenizer
from transformers import AutoModel
import torch

# 定义使用的模型
checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"

## 我们的输入
raw_inputs = [
    "I've been waiting for a HuggingFace course my whole life.",
    "I hate this so much!",
]
# tokenizer 定义分词词,一般分词器和model是一一对应的
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

# 用分词器进行分词
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")

# 加载模型
model = AutoModel.from_pretrained(checkpoint)
## 调用模型
outputs = model(**inputs)

print(outputs.last_hidden_state.shape)

# post-processing, 后置处理,将模型输出的信息转成我们可以看懂的数据
predictions = torch.nn.functional.softmax(outputs[0], dim=-1)
print(predictions)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Qt应用开发(基础篇)——LCD数值类 QLCDNumber

一、前言 QLCDNumber类继承于QFrame&#xff0c;QFrame继承于QWidget&#xff0c;是Qt的一个基础小部件。 QLCDNumber用来显示一个带有类似lcd数字的数字&#xff0c;适用于信号灯、跑步机、体温计、时钟、电表、水表、血压计等仪器类产品的数值显示。 QLCDNumber可以显示十进制…

关于将预留单中增强字段带入物料凭证和会计凭证中

1、业务需求 预留中自定义文本字段“大项修”。根据预留创建物料凭证时&#xff0c;将该字段带入到物料凭证中&#xff0c;类似标准字段“项目文本”。并在物料凭证自动产生会计凭证后&#xff0c;将该字段带入到会计凭证行项目中。 其中需要解决以上三张凭证对该字段的界面显…

c/c++函数可变参数的实现

c语言&#xff0c;利用<stdarg.h> 里面的 typedef char* va_list; void va_start ( va_list ap, prev_param ); /* ANSI version */ type va_arg ( va_list ap, type ); void va_end ( va_list ap );#include <stdio.h> #include <stdarg.h> double Sum(int…

火爆全球的AI艺术二维码到底是怎么做的?

如今&#xff0c;二维码扫描已经成为一种与呼吸一样自然的本能动作。支付、购物、点餐、订票、浏览网页&#xff0c;几乎所有事情都可以通过扫描二维码来完成。你是否可以想象到下面是二维码&#xff1f;AI生成的艺术二维码使二维码瞬间变得高逼格。这些艺术二维码极具吸引力&a…

如何制定项目计划?甘特图告诉你

最近被领导指派负责一个新的项目&#xff0c;我想把项目做成功&#xff0c;给老板留下深刻的印象&#xff0c;同时也给自己的职业生涯添上浓墨重彩的一笔。 但是&#xff0c;项目管理流程很复杂&#xff0c;项目本身也不好做。在收集了与该项目有关的所有信息&#xff0c;并将…

亚马逊搜索关键词下单有哪些好处

在亚马逊上使用搜索关键词进行下单有许多好处&#xff0c;以下是其中一些主要的优点&#xff1a; 1、准确的产品匹配&#xff1a; 通过输入相关的搜索关键词&#xff0c;您可以更准确地找到您所需的产品&#xff0c;从而避免了浏览大量无关的商品页面。 2、节省时间&#xff…

亚马逊买家账号多久可以评论

根据亚马逊的政策&#xff0c;买家账号在购买商品后通常需要等待一段时间才能发布评论。 1、实物商品&#xff1a; 买家需要等待购买商品后的48小时&#xff0c;然后才能发布评论。 2、数字商品&#xff1a; 买家需要等待购买数字商品后的24小时&#xff0c;然后才能发布评论…

深度学习之用PyTorch实现逻辑回归

0.1 学习视频源于&#xff1a;b站&#xff1a;刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容&#xff0c;若有错误欢迎指正&#xff01; 代码&#xff08;类比线性回归&#xff09;&#xff1a; # 调用库 import torch import torch.nn.functional as F#…

[保研/考研机试] KY187 二进制数 北京邮电大学复试上机题 C++实现

描述 大家都知道&#xff0c;数据在计算机里中存储是以二进制的形式存储的。 有一天&#xff0c;小明学了C语言之后&#xff0c;他想知道一个类型为unsigned int 类型的数字&#xff0c;存储在计算机中的二进制串是什么样子的。 你能帮帮小明吗&#xff1f;并且&#xff0c;小…

使用MyEclipse如何部署Descriptor (XML)编辑器?

Descriptor (XML) Editor编辑器包含了高级的XML编辑功能&#xff0c;在本文中您将了解到这些编辑功能、Web XML编辑等&#xff0c;此功能包含在MyEclipse中可用。 MyEclipse v2023.1.2离线版下载 1. Web XML 编辑器 MyEclipse Web XML编辑器包括高级XML编辑功能&#xff0c;…

2022年世界各国GDP总量、人均GDP总量及排名

【勘误&#xff1a;表格第103哥伦比亚应为柬埔寨】

线程隔离问题之服务降级、熔断

一、雪崩问题 微服务中&#xff0c;服务间调用关系错综复杂&#xff0c;一个请求&#xff0c;可能需要调用多个微服务接口才能实现&#xff0c;会形成非常复杂的调用链路&#xff1a; 如图&#xff0c;一次业务请求&#xff0c;需要调 用A、P、H、I四个服务&#xff0c;这四个…

【LeetCode每日一题】——575.分糖果

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 哈希表 二【题目难度】 简单 三【题目编号】 575.分糖果 四【题目描述】 Alice 有 n 枚糖&…

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

【转】彻底搞明白 GB2312、GBK 、GB18030和UTF-8

日常工作的过程中&#xff0c;关于字符编码的问题经常让人头疼不已&#xff0c;这篇文章就来捋一捋关于 GB2312、GBK、GB18030 相关的知识 以及它们和 Unicode 的关系 简介 GB2312&#xff08;2个字节&#xff09; 1980 年&#xff0c;中国发布了第一个汉字编码标准&#xf…

明道云联合Kyligence结合示范性场景应用

案例背景 前言 国内大部分制造企业在经历疫情后&#xff0c;终于迎来了市场端的消费需求的恢复和增长&#xff0c;但如何在激烈的竞争中以更少投入&#xff0c;获得更高回报&#xff0c;在市场上获得一席生存之地&#xff0c;成为了悬在众多企业头上的达摩克利斯之剑。在市场…

手搓 LLM (不用rnn 不用attention 完全新思路)padding 实验

数据集地址 诗 实验过的几种策略 主体代码 import paddle import numpy as np from tqdm import tqdm import pandas as pd class EmMask(paddle.nn.Layer):def

力扣63.不同路径II(动态规划)

/*** author Limg* date 2022/08/09* 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。* 现在考虑网…

大厂容器云实践之路(三)

5-基于Kubernetes打造SAE容器云 目前SAE基于请求的架构 • 优点 - 进程内隔离&#xff0c;消耗资源最⼩ - ⽆感扩容&缩容&#xff0c;⽤户⽆成本 - Health&Redispatch&#xff0c;升级切换⽆成本 • 缺点 - ⽆法提供独⽴的namespace - ⽆法Build&Ship&Run ⽤…

数据质量:数据越好,模型就越好

如果数据不准确&#xff0c;模型就无法正常运行。虽然最终可能得到一个尚可应付的模型&#xff0c;但它的功能会不尽人意。可以说&#xff0c;数据质量是机器学习模型训练中的重中之重。无论为模型提供了多少数据&#xff0c;如果数据不适用&#xff0c;对改善机器模型的性能就…