Hugging face Transformers(2)—— Pipeline

  • 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_TASKStasks = []
    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.mzph.cn/pingmian/41900.shtml

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

相关文章

【系统架构设计师】计算机组成与体系结构 ⑩ ( 磁盘管理 | 磁盘移臂调度算法 | 先来先服务算法 | 最短寻道时间优先 | 扫描算法 | 循环扫描算法 )

文章目录 一、磁盘移臂调度算法1、磁盘移臂调度算法简介2、先来先服务算法3、最短寻道时间优先4、扫描算法5、循环扫描算法 二、最短寻道时间优先算法示例 一、磁盘移臂调度算法 1、磁盘移臂调度算法简介 磁盘 数据块读取 的 性能 主要由 寻道时间旋转延时 决定 ; 旋转延时 …

ROS 2官方文档(基于humble版本)学习笔记(四)

ROS 2官方文档&#xff08;基于humble版本&#xff09;学习笔记&#xff08;四&#xff09; 2.客户端库使用colcon构建包&#xff08;package&#xff09;创建工作空间&#xff08;workspace&#xff09;构建工作空间执行测试&#xff08;tests&#xff09;导入环境&#xff08…

第十四届蓝桥杯省赛C++B组G题【子串简写】题解(AC)

题目大意 给定字符串 s s s&#xff0c;字符 a , b a, b a,b&#xff0c;问字符串 s s s 中有多少个 a a a 开头 b b b 结尾的子串。 解题思路 20pts 使用二重循环枚举左端点和右端点&#xff0c;判断是否为 a a a 开头 b b b 结尾的字符串&#xff0c;是则答案加一…

一阶滞后滤波法

一阶滞后滤波法 一阶滞后滤波法:取a=0到1,本次滤波结果=(1-a)乘以本次采样值+a乘以上次滤波结果。 优点: 对周期性干扰具有良好的抑制作用;适用于波动频率较高的场合。 缺点: 相位滞后,灵敏度低;滞后程度取决于a值大小;不能消除滤波频率高于采样频率1/2的干扰信号。 …

Stable Diffusion:最全详细图解

Stable Diffusion&#xff0c;作为一种革命性的图像生成模型&#xff0c;自发布以来便因其卓越的生成质量和高效的计算性能而受到广泛关注。不同于以往的生成模型&#xff0c;Stable Diffusion在生成图像的过程中&#xff0c;采用了独特的扩散过程&#xff0c;结合深度学习技术…

精通Perl正则表达式修饰符:提升文本处理能力的艺术

Perl语言以其强大的文本处理能力而闻名&#xff0c;其中正则表达式是其核心特性之一。正则表达式本身非常强大&#xff0c;但Perl提供的修饰符&#xff08;Modifiers&#xff09;进一步扩展了正则表达式的灵活性和表达能力。本文将深入探讨Perl中正则表达式修饰符的使用&#x…

2024亚太杯数学建模竞赛(B题)的全面解析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024亚太杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

【C++:类的基础认识和this指针】

C的类与C语言的struct结构体有啥区别&#xff1f; 默认的访问限定符不同 类的简要 关键字&#xff1a;class{}里面是类的主体&#xff0c;特别注意&#xff1a;{}后面的&#xff1b;不可以省略类中的变量叫做成员变量&#xff0c;类中的函数叫做成员函数类中访问有三种访问权限…

单/多线程--协程--异步爬虫

免责声明:本文仅做技术交流与学习... 目录 了解进程和线程 单个线程(主线程)在执行 多线程 线程池 协程(爬虫多用) 假异步:(同步) 真异步: 爬虫代码模版 异步-爬虫 同步效果--19秒 异步效果--7秒 了解进程和线程 ​ # --------------------> # ------> # …

Anaconda新建python版本

由于新版本的Anaconda自带的python是3.11的&#xff0c;国内镜像一些库&#xff0c;不好下载。特更新为常见的python3.9 1.新建环境&#xff0c;指定新python版本 #conda create --name 名称 python(版本) #示例 conda create --name liuenv python3.9 #指定环境的存储位置 c…

MinIO:开源对象存储解决方案的领先者

MinIO:开源对象存储解决方案的领先者 MinIO 是一款开源的对象存储系统&#xff0c;致力于提供高性能、可伸缩、安全的数据存储解决方案。 官方解释&#xff1a;MinIO 是一个基于Apache License v2。0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口&#xff0c;非常适…

WAIC:生成式 AI 时代的到来,高通创新未来!

目录 01 在终端侧算力上&#xff0c;动作最快的就是高通 02 模型优化&#xff0c;完成最后一块拼图 在WAIC上&#xff0c;高通展示的生成式AI创新让我们看到了未来的曙光。 生成式 AI 的爆发带来了意想不到的产业格局变化&#xff0c;其速度之快令人惊叹。 仅在一个月前&…

SchedulingConfigurer使用教程

SchedulingConfigurer使用教程&#xff1a;Java定时任务的高阶使用 在 Java 开发中&#xff0c;定时任务的管理和执行是一个常见需求。Spring 提供了多种方式来处理定时任务&#xff0c;其中 SchedulingConfigurer 是一个强大且灵活的接口&#xff0c;允许我们对定时任务进行更…

说一下浏览器中的强缓存和协商缓存的区别

写在前面 对于一道高频的面试题&#xff0c;可能很多小伙伴还不知道这两者的概念&#xff0c;不知道是用来做什么的&#xff0c;以及有什么好处&#xff0c;强缓存和协商缓存是 Web 缓存机制的重要组成部分&#xff0c;它们在优化 Web 应用性能方面发挥了重要作用&#xff0c;…

Vue + SpringBoot:el-upload组件单文件、多文件上传实战解析

文章目录 单文件上传后端前端 多文件上传后端前端 单文件上传 后端 PostMapping("/uploadDxfFile") public R uploadDxfFile(RequestParam(value "file", required true) MultipartFile multipartFile) throws Exception {// 文件校验工作if (multipar…

web Worker学习笔记 | 浏览器切换标签,定时器失效的解决办法

文章目录 web Workerweb Worker介绍 - 多线程解决方案浏览器多进程架构 web workers 的使用关闭worker引用其他js文件 浏览器切换标签&#xff0c;定时器失效的解决办法窗口可见性 API解决定时器失效的方案 web Worker web Worker介绍 - 多线程解决方案 Web Workers 是Html5提…

服务器数据恢复—DS5300存储raid5阵列数据恢复案例

服务器存储数据恢复环境&#xff1a; 某单位一台某品牌DS5300存储&#xff0c;1个机头4个扩展柜&#xff0c;50块硬盘组建2组RAID5磁盘阵列&#xff08;一组raid5阵列有27块成员盘&#xff0c;存放Oracle数据库文件&#xff1b;另外一组raid5阵列有23块成员盘&#xff09;。存储…

大带宽独立服务器的购买和配置流程是怎样的?

在当前互联网时代&#xff0c;大带宽独立服务器越来越受到企业和个人用户的青睐。其稳定性和高速的数据传输速率可以为用户提供更好的互联网体验。下面我们将详细介绍如何购买和配置大带宽独立服务器。 第一步&#xff1a;选择合适的服务器提供商 在选择服务器提供商时&#…

CF1982D Beauty of the mountains

【题意】 Nikita 喜欢爬山。当地的山可以看作一个由 ( n m ) (n \times m) (nm) 个格子组成的 n m n \times m nm 的矩形&#xff0c;每一个格子都有一个初始非负高度 a i , j a_{i,j} ai,j​。 格子有两种类型&#xff1a; 有雪无雪 Nikita 有一种超能力&#xff1a;…

数组相关内容

一、数组 就是一个集合&#xff0c;里面存放了相同类型的数据元素 特点&#xff1a; 1.数组中的每个数据元素都是相同的数据类型 2.数组是由连续内存位置组成的 二、一维数组 定义方式 1.数据类型 数组名[数组长度]&#xff1b; 2.数据类型 数组名[数组长度]{值1&#xff0…