Hugging face Transformers(2)—— Pipeline

news2025/2/25 11:20:37
  • Hugging Face 是一家在 NLP 和 AI 领域具有重要影响力的科技公司,他们的开源工具和社区建设为NLP研究和开发提供了强大的支持。它们拥有当前最活跃、最受关注、影响力最大的 NLP 社区,最新最强的 NLP 模型大多在这里发布和开源。该社区也提供了丰富的教程、文档和示例代码,帮助用户快速上手并深入理解各类 Transformer 模型和 NLP 技术
  • Transformers 库是 Hugging Face 最著名的贡献之一,它最初是 Transformer 模型的 pytorch 复现库,随着不断建设,至今已经成为 NLP 领域最重要,影响最大的基础设施之一。该库提供了大量预训练的模型,涵盖了多种语言和任务,成为当今大模型工程实现的主流标准,换句话说,如果你正在开发一个大模型,那么按 Transformer 库的代码格式进行工程实现、将 check point 打包成 hugging face 格式开源到社区,对于推广你的工作有很大的助力作用。本系列文章将介绍 Transformers库 的基本使用方法
  • 前文:Hugging face Transformers(1)—— 基础知识

文章目录

  • 1. 什么是 Pipeline
  • 2. Pipeline 支持的任务类型
  • 3. 创建和使用 Pipeline
    • 3.1 基本操作
    • 3.2 Auto 类型
  • 4. 使用 GPU 进行推理
  • 5. Pipeline 背后的实现

1. 什么是 Pipeline

  • Pipeline 是 Transformers 库的一个高层次封装类,它可以将数据预处理、模型调用、结果后处理三部分组装成流水线,为用户忽略复杂的中间过程,仅保留输入输出接口

  • 利用 Pipeline,用户可以方便地加载各种模型检查点,直接输入文本来获取最终的结果,而无需关注中间细节
    在这里插入图片描述
    上图显示了 Pipeline 的处理过程

    1. 输入预处理:原始输入字符串被 Tokenizer 组件处理为目标模型支持格式的 token 序列(一个由词表索引组成的列表)
    2. 模型预测:Token 序列被输入目标模型,通过前向过程得到模型输出,基于目标任务不同,输出形式会有所区别

      图示为情感二分类任务,故输出的 logits 只有两个维度

    3. 结果后处理:基于目标任务类型,对模型输出进行后处理,生成结果

      对于图示的情感分类任务,后处理是过 softmax 后概率采样或贪心选取结果

2. Pipeline 支持的任务类型

  • 前文 Hugging face Transformers(1)—— 基础知识 提到了目前主要的九类 NLP 任务,除了这些经典任务外,Transformers 库还支持关于图像、音频等其他模态的任务。可以用如下代码检查所有任务类型

    from transformers.pipelines import SUPPORTED_TASKS
    
    tasks = []
    for k, v in SUPPORTED_TASKS.items():
        tasks.append(f"{v['type']:15} {k}")
    for t in sorted(tasks):
        print(t)
    
    audio           audio-classification
    image           depth-estimation
    image           image-classification
    image           image-feature-extraction
    image           image-to-image
    multimodal      automatic-speech-recognition
    multimodal      document-question-answering
    multimodal      feature-extraction
    multimodal      image-segmentation
    multimodal      image-to-text
    multimodal      mask-generation
    multimodal      object-detection
    multimodal      visual-question-answering
    multimodal      zero-shot-audio-classification
    multimodal      zero-shot-image-classification
    multimodal      zero-shot-object-detection
    text            conversational
    text            fill-mask
    text            question-answering
    text            summarization
    text            table-question-answering
    text            text-classification
    text            text-generation
    text            text-to-audio
    text            text2text-generation
    text            token-classification
    text            translation
    text            zero-shot-classification
    video           video-classification
    
  • 官方提供的任务表格如下
    在这里插入图片描述

3. 创建和使用 Pipeline

3.1 基本操作

  • 创建 Pipeline 对象,在传入参数中指定任务类型、模型和 tokenizer 等
    1. 任务类型如第 2 节表格所示
    2. 模型地址可以在模型列表找到
    3. 如果不指定模型,将下载目标任务的默认模型和配套 tokenizer
      from transformers import *
      
      # 1. 根据任务类型直接创建 Pipeline,这时会使用默认的某个英文模型
      pipe = pipeline("text-classification")	# 文本分类任务
      pipe('very good!')	# [{'label': 'POSITIVE', 'score': 0.9998525381088257}]
      
      # 2. 同时指定任务类型和模型
      # model 可以在 https://huggingface.co/models 找到
      pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
      pipe("我觉得不太行")	# [{'label': 'negative (stars 1, 2 and 3)', 'score': 0.9743660688400269}]
      
  • 以上调用发起时,pipeline 对象会如下创建(下文第 5 节会进一步讨论等效实现)
    1. 会自动下载 model snapshot、配置文件、词表等必须内容,默认保存地址为 C:\Users\username.cache\huggingface\hub(已下载过则从此加载)
    2. 根据 Transformers 库内置源码创建,并使用下载文件初始化 model 对象和 Tokenizer 对象
    3. 根据任务类型连接后处理方法
  • 可以先创建 model 对象,再将其作为参数创建 Pipeline,这种情况下必须同时指定传入 model 对象和 tokenizer 对象
    from transformers import *
    
    # 3. 先加载模型,再创建Pipeline(必须同时指定 model 和 tokenizer)
    model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
    tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
    pipe = pipeline("text-classification", model=model, tokenizer=tokenizer)
    pipe("我觉得不太行") 	# [{'label': 'negative (stars 1, 2 and 3)', 'score': 0.9743660688400269}]
    
  • 使用 Pipeline 时,可以传入原始字符串或字符串列表,当原始数据量特别多时,最好传入测试数据生成器
    # 使用默认的情感分类模型
    pipe = pipeline("text-classification")
    
    # 直接传入原始字符串
    pipe('very good!')  
    '''
    [{'label': 'POSITIVE', 'score': 0.9998525381088257}]
    '''
    
    # 传入原始字符串列表
    pipe(['very good!', 'very bad!'])
    '''
    Disabling tokenizer parallelism, we're using DataLoader multithreading already
    [{'label': 'POSITIVE', 'score': 0.9998525381088257},
     {'label': 'NEGATIVE', 'score': 0.9997695088386536}]
    '''
    
    # 传入原始字符串生成器
    def list_to_generator(lst):  
        for item in lst:  
            yield item  
    sentence_generator = list_to_generator(['very good!', 'very bad!'])  
    
    for res in pipe(sentence_generator):
        print(res)
    '''
    {'label': 'POSITIVE', 'score': 0.9998525381088257}
    {'label': 'NEGATIVE', 'score': 0.9997695088386536}
    '''
    

3.2 Auto 类型

  • 在以上情感分类示例的幕后,Pipeline 使用了 AutoModelForSequenceClassificationAutoTokenizer 构造上面的 pipe 对象。AutoClass 是一种快捷方式,它可以从名称或路径中自动检索预训练模型的体系结构,例如上面出现过的

    model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
    tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
    

    可见,只需要用模型路径调用 AutoClass 的 .from_pretrained() 方法,大多数情况下都可以自动检索相关的预训练 model 的 weights/config 或 tokenizer 的 vocab table

  • 注意到模型的自动类 AutoModelForSequenceClassification 包含 ForSequenceClassification 后缀,这是因为第 2 节所述的各类任务重,很多是可以用相同的 model 骨干完成的。比如对于 “句子情感分类” 和 “句子自回归生成” 两个任务,前者可以看作是基于前驱序列特征做二分类任务(正面情感/负面情感),后者可以看作是基于前驱序列特征做多分类任务(从词表中选择一个token索引),两个任务中 “前驱序列特征” 都是可以用 GPT 模型提取的,也就是说相同的 model,接入不同的 post processing 模块,就可以用于不同的任务。因此,在 Transformers 库的设计上,一个相同的模型骨干可以对应多个不同的任务,它们使用后缀进行区分,详见源码

4. 使用 GPU 进行推理

  • 定义的 pipeline 默认在 CPU 执行,速度慢

    # 默认的执行设置是 CPU
    pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
    print(pipe.model.device)	# cpu
    
    # 在 CPU 运行会很慢
    import torch
    import time
    import numpy as np
    times = []
    for i in range(100):
        start = time.time()
        pipe("我觉得不太行")
        torch.cuda.synchronize()# 阻塞CPU线程,直到所有在当前设备上排队的CUDA核心完成执行为止
        end = time.time()
        times.append(end-start)
    print(np.mean(times))		# 0.07967857599258422
    
  • 通过 device 参数,在定义 pipeline 时指定到 GPU 设备运行,可以有效提高推理速度

    # 通过 device 参数指定执行设备
    pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese", device=0)
    
    # 查看模型的运行设备
    print(pipe.model.device)		# cuda:0
    
    # 在 GPU 运行会更快
    import torch
    import time
    import numpy as np
    times = []
    for i in range(100):
        start = time.time()
        pipe("我觉得不太行")
        torch.cuda.synchronize()  	# 阻塞CPU线程,直到所有在当前设备上排队的CUDA核心完成执行为止
        end = time.time()
        times.append(end-start)
    print(np.mean(times))			# 0.022842261791229248
    

5. Pipeline 背后的实现

  • 下面我们分别实现以上情感分类 pipeline 内部的组件,并手动执行数据流,看清其执行过程
    # 1. 初始化 tokenizer
    tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
    
    # 2. 初始化 model
    model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
    
    # 3. 输入预处理(Tokenize)
    input_text = "我觉得不太行"
    inputs = tokenizer(input_text, return_tensors='pt')
    print(inputs)  # {'input_ids': tensor([[ 101, 2769, 6230, 2533,  679, 1922, 6121,  102]]), 'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1]])}
    
    # 4. 模型预测
    res = model(**inputs)
    print(res)     # SequenceClassifierOutput(loss=None, logits=tensor([[ 1.7459, -1.8919]], grad_fn=<AddmmBackward0>), hidden_states=None, attentions=None)
    
    # 5. 结果后处理
    logits = res.logits
    logits = torch.softmax(logits, dim=-1)
    print(logits)  # tensor([[0.9744, 0.0256]], grad_fn=<SoftmaxBackward0>) 正面情感/负面情感
    pred = torch.argmax(logits).item()        # 0
    result = model.config.id2label.get(pred)  
    print(result)  # negative (stars 1, 2 and 3)
    

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

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

相关文章

gptoolbox matlab工具箱cmake 调试笔记

一、问题描述 起因&#xff1a;在matlab中运行Offset surface of triangle mesh in matlab的时候报错&#xff1a; 不支持将脚本 signed_distance 作为函数执行: E:\MATLAB_File\gptoolbox\mex\signed_distance.m> 出错 offset_bunny (第 22 行) D signed_distance(BC,V,F…

Vim编辑器与Shell命令脚本

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 目录 一、Vim文本编辑器 二、编写Shell脚本 三、流程控制语句 四、计划任务服务程序 致谢 一、Vim文本编辑器 “在Linux系统中一切都是文件&am…

Java技术栈总结:kafka篇

一、# 基础知识 1、安装 部署一台ZooKeeper服务器&#xff1b;安装jdk&#xff1b;下载kafka安装包&#xff1b;上传安装包到kafka服务器上&#xff1a;/usr/local/kafka;解压缩压缩包&#xff1b;进入到config目录&#xff0c;修改server.properties配置信息&#xff1a; #…

绝区叁--如何在移动设备上本地运行LLM

随着大型语言模型 (LLM)&#xff08;例如Llama 2和Llama 3&#xff09;不断突破人工智能的界限&#xff0c;它们正在改变我们与周围技术的互动方式。这些模型早已集成到我们的手机中&#xff0c;但到目前为止&#xff0c;它们理解和处理请求的能力还非常有限。然而&#xff0c;…

2024年7月6日 (周六) 叶子游戏新闻

自动电脑内部录音器AutoAudioRecorder: 是一款免费的自动音频录制软件&#xff0c;可直接将电脑内部所有的声音录制成 mp3/wav 文件&#xff0c;包括音乐、游戏直播、网络会议、聊天通话等音频源。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《不羁联盟》制作人&…

数据库测试|Elasticsearch和ClickHouse的对决

前言 数据库作为产品架构的重要组成部分&#xff0c;一直是技术人员做产品选型的考虑因素之一。 ClkLog会经常遇到小伙伴问支持兼容哪几种数据库&#xff1f;为什么是选择ClickHouse而不是这个或那个。 由于目前市场上主流的数据库有许多&#xff0c;这次我们选择其中一个比较典…

【密码学】密码学体系

密码学体系是信息安全领域的基石&#xff0c;它主要分为两大类&#xff1a;对称密码体制和非对称密码体制。 一、对称密码体制&#xff08;Symmetric Cryptography&#xff09; 在对称密码体制中&#xff0c;加密和解密使用相同的密钥。这意味着发送方和接收方都必须事先拥有这…

医院产科信息化管理系统源码,智慧产科管理系统,涵盖了从孕妇到医院初次建档、历次产检、住院分娩、统计上报到产后42天全部医院服务的信息化管理。

医院产科信息化管理系统源码&#xff0c;智慧产科管理系统&#xff0c;产科专科电子病历系统 技术架构&#xff1a;前后端分离Java&#xff0c;Vue&#xff0c;ElementUIMySQL8.0.36 医院产科信息化管理系统&#xff0c;通过构建专科病例系统实现临床保健一体化&#xff0c;涵…

线程池理解及7个参数

定义理解 线程池其实是一种池化的技术实现&#xff0c;池化技术的核心思想就是实现资源的复用&#xff0c;避免资源的重复创建和销毁带来的性能开销。线程池可以管理一堆线程&#xff0c;让线程执行完任务之后不进行销毁&#xff0c;而是继续去处理其它线程已经提交的任务。 …

【pytorch18】Logistic Regression

回忆线性回归 for continuous:y xwbfor probability output:yσ(xwb) σ:sigmoid or logistic 线性回归是简单的线性模型&#xff0c;输入是x&#xff0c;网络参数是w和b&#xff0c;输出是连续的y的值 如何把它转化为分类问题?加了sigmoid函数&#xff0c;输出的值不再是…

springboot服务启动读取不到application.yml中的nacos.config信息

我的版本&#xff1a; 可以添加bootstrap.yml文件&#xff0c;在里面添加nacos.config的配置信息 也可以添加VM参数 -Dspring.cloud.nacos.discovery.server-addr -Dspring.cloud.nacos.config.server-addr -Dspring.cloud.nacos.config.namespace -Dspring.cloud.nacos.discov…

Java实现登录验证 -- JWT令牌实现

目录 1.实现登录验证的引出原因 2.JWT令牌2.1 使用JWT令牌时2.2 令牌的组成 3. JWT令牌&#xff08;token&#xff09;生成和校验3.1 引入JWT令牌的依赖3.2 使用Jar包中提供的API来实现JWT令牌的生成和校验3.3 使用JWT令牌验证登录3.4 令牌的优缺点 1.实现登录验证的引出 传统…

LeetCode刷题之搜索二维矩阵

2024 7/5 一如既往的晴天&#xff0c;分享几张拍的照片嘿嘿&#xff0c;好几天没做题了&#xff0c;在徘徊、踌躇、踱步。蝉鸣的有些聒噪了&#xff0c;栀子花花苞也都掉落啦&#xff0c;今天给他剪了枝&#xff0c;接回一楼来了。ok&#xff0c;做题啦&#xff01; 图1、宿舍…

EDA 2023 年世界国家suicide rate排名

文章目录 前言:关于数据集列 导入模块导入数据数据预处理探索性数据分析按性别划分的自杀率 [箱线图]相关矩阵热图自杀率最高的 15 个国家变化百分比最高的 15 个国家/地区2023 年世界地图上自杀率的国家 结尾: 前言: 随着社会的不断发展和变迁&#xff0c;人们对于各种社会问…

154. 寻找旋转排序数组中的最小值 II(困难)

154. 寻找旋转排序数组中的最小值 II 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转&#xff1a;154. 寻找旋转排序数组中的最小值 II 2.详细题解 该题是153. 寻找旋转排序数组中的最小值的进阶题&#xff0c;在153. 寻找旋转排序数组中的最小值…

2024 年第十四届亚太数学建模竞赛(中文赛项)浅析

需要完整B题资料&#xff0c;请关注&#xff1a;“小何数模”&#xff01; 本次亚太(中文赛)数学建模的赛题已正式出炉&#xff0c;无论是赛题难度还是认可度&#xff0c;该比赛都是仅次于数模国赛的独一档&#xff0c;可以用于国赛前的练手训练。考虑到大家解题实属不易&…

品牌推广的核心价值:作用解析与意义探讨!

在激烈的市场竞争环境之下&#xff0c;品牌推广已经成为企业不可缺少的一部分。不仅关乎企业的知名度&#xff0c;对市场份额更是起到了决定性的作用。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店&#xff0c;这篇文章&#xff0c;我将和大家分享品…

web学习笔记(八十)

目录 1.小程序实现微信一键登录 2. 小程序的授权流程 3.小程序配置vant库 4.小程序配置分包 5.小程序配置独立分包 6.小程序分包预下载 1.小程序实现微信一键登录 要先实现小程序一键登录首先我们需要给按钮设置一个绑定事件&#xff0c;然后在绑定事件内部通过wx.login…

ETAS工具导入Com Arxml修改步骤

文章目录 前言Confgen之前的更改Confgen之后的修改CANCanIfComComMEcuM修改CanNmCanSMDCMCanTp生成RTE过程报错修改DEXT-诊断文件修改Extract问题总结前言 通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml…

FastAPI+vue3+Primeflex教学20240706,渲染阶乘案例

子绝父相 相对定位是相对于自己原本的位置定位。 绝对定位&#xff0c;如果父元素设置了相对定位&#xff0c;则相对于父元素进行绝对定位&#xff0c;否则相对于最近的设置了相对定位的元素进行绝对定位&#xff0c;或者相对于根元素进行绝对定位。 定位有四个方向&#xff0…