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_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.mfbz.cn/a/779078.html

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

相关文章

一维前缀和的实现

这是C算法基础-基础算法专栏的第十一篇文章&#xff0c;专栏详情请见此处。 引入 我们用朴素做法求一维数组的区间和时&#xff0c;一般是从前向后循环累加&#xff0c;它的时间复杂度为&#xff0c;当求区间和的次数过多&#xff0c;则会有超时的可能&#xff0c;那有没有时间…

web零碎知识2

不知道我的这个axios的包导进去没。 找一下关键词&#xff1a; http请求协议&#xff1a;就是进行交互式的格式 需要定义好 这个式一发一收短连接 而且没有记忆 这个分为三个部分 第一个式请求行&#xff0c;第二个就是请求头 第三个就是请求体 以get方式进行请求的失手请求…

SpringBoot新手快速入门系列教程四:创建第一个SringBoot的API

首先我们用IDEA新建一个项目&#xff0c;请将这些关键位置按照我的设置设置一下 接下来我将要带着你一步一步创建一个Get请求和Post请求&#xff0c;通过客户端请求的参数&#xff0c;以json格式返回该参数{“message”:"Hello"} 1,先在IDE左上角把这里改为文件模式…

3101.力扣每日一题7/6 Java(接近100%解法)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要是基于对…

connect to github中personal access token生成token方法

一、问题 执行git push时弹出以下提示框 二、解决方法 去github官网生成Token&#xff0c;步骤如下 选择要授予此 令牌token 的 范围 或 权限 要使用 token 从命令行访问仓库&#xff0c;请选择 repo 。 要使用 token 从命令行删除仓库&#xff0c;请选择 delete_repo 其他根…

06-6.4.4 拓扑排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

搜索广告召回技术在美团的实践

内容整理自美团技术沙龙第81期《美团在广告算法领域的探索及实践》&#xff08;B站视频&#xff09;。本文首先介绍了美团搜索广告的三个阶段&#xff1a;多策略关键词挖掘、分层召回体系、生成式召回&#xff1b;然后重点介绍了生成式关键词召回、多模态生成式向量召回、生成式…

计算机网络之令牌总线

上文内容&#xff1a;什么是以太网 1.令牌总线工作原理 在总线的基础上&#xff0c;通过在网络结点之间有序地传递令牌来分配各结点对共享型总线的访问权利&#xff0c;形成闭合的逻辑环路。 完全采用半双工的操作方式&#xff0c;只有获得令牌的结点才能发送信息&#xff…

第1章 项目背景(学成在线),项目介绍,环境搭建

1.项目背景 1.1 在线教育市场环境 以下内容摘自https://report.iresearch.cn/content/2021/01/358854.shtml 在线教育行业是一个有着极强的广度和深度的行业&#xff0c;从校内到校外&#xff1b;从早幼教到职业培训&#xff1b;从教育工具到全信息化平台等等。 2020年的新…

NVIDIA RTX Remix开源 让AI驱动的经典游戏重制复兴

游戏开发商往往会让激动的粉丝们在游戏发布后等待数年&#xff0c;以获得他们喜爱的游戏的重制版。不过&#xff0c;这个问题可能很快就会成为过去。NVIDIA 宣布其 RTX Remix 工具包将开放源代码&#xff0c;这将为钟情于经典游戏的玩家带来惊喜。 RTX Remix 是 NVIDIA 的修改套…

Android面试题自定义View之Window、ViewRootImpl和View的三大流程

本文首发于公众号“AntDream”&#xff0c;欢迎微信搜索“AntDream”或扫描文章底部二维码关注&#xff0c;和我一起每天进步一点点 View的三大流程指的是measure(测量)、layout(布局)、draw(绘制)。 下面我们来分别看看这三大流程 View的measure(测量) MeasureSpec Measur…

React 省市查询组件完整代码

目录 一、地区文件 二、Antd配合使用 三、实现效果 一、地区文件 下载地址&#xff1a;全国省市区数据_JSON格式_SQL格式 export const chinaArea {0: {1: 北京,2: 天津,3: 河北省,4: 山西省,5: 内蒙古自治区,6: 辽宁省,7: 吉林省,8: 黑龙江省,9: 上海,10: 江苏省,11: 浙…

Linux之进程控制(下)

目录 进程替换的概念 进程替换的函数 execl​编辑 execlp execle execv execvp execve 上期&#xff0c;我们学习了进程创建&#xff0c;进程终止和进程等待&#xff0c;今天我们要学习的是进程控制中相对重要的板块------进程替换。 进程替换的概念 在进程创建时&…

微米级触觉感知的紧凑视触觉机器人皮肤

视触觉皮肤&#xff08;VTS&#xff09;分为涂层型、标记型和热致变色型。涂层的耐磨性和空间分辨率是涂层型VTS的核心问题。近期&#xff0c;北京邮电大学方斌教授联合中国地质大学&#xff08;北京&#xff09;杨义勇教授&#xff0c;在传感器领域Q1期刊IEEE Sensors Journal…

DHCP服务器

目录 网络传输原则&#xff1a; DHCP: DHCP作用&#xff1a; 优缺点&#xff1a; DHCP的原理&#xff1a; 用虚拟机模拟DHCP服务器​编辑​编辑 网络传输原则&#xff1a; 网络是双向的&#xff0c;网络是有方向的 解释&#xff1a;网络是双向的&#xff1a; …

轻松快速上手Thekey库,实现数据加密无忧

Thekey的概述&#xff1a; Thekey库是一个Python库,旨在简化数据加密、解密、签名和验证的过程。它提供了一套简洁易用的接口,用于处理各种加密任务,适合需要在应用程序中实现安全数据处理的开发人员. 安装Thekey库 pip install thekey使用Thekey库进行基本加密和解密操作的…

uniapp 在手机上导出excel

1.创建excelDev.js文件 export default {exportExcel(fileData, documentName excel) {plus.io.requestFileSystem(plus.io.PUBLIC_DOCUMENTS, function(fs) {let rootObj fs.rootlet fullPath rootObj.fullPathconsole.log("开始导出数据")// 创建文件夹rootObj…

Linux进程(1)(结构-操作系统-进程)

目录 1.体系结构 2.操作系统&#xff08;Operator System&#xff09; 1&#xff09;概念&#xff1a; 2&#xff09;结构 示意图&#xff08;不完整&#xff09; 3&#xff09;尝试理解操作系统 4&#xff09;系统调用和库函数概念 3.认识进程 1.启动 2.进程创建的代码…

11.x86游戏实战-汇编指令add sub inc dec

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;10.x86游戏实战-汇编指令lea 首先双击下图红框位置 然后在下图红框位置输入0 然…

Lock4j简单的支持不同方案的高性能分布式锁实现及源码解析

文章目录 1.Lock4j是什么?1.1简介1.2项目地址1.3 我之前手写的分布式锁和限流的实现 2.特性3.如何使用3.1引入相关依赖3.2 配置redis或zookeeper3.3 使用方式3.3.1 注解式自动式3.3.2 手动式 4.源码解析4.1项目目录4.2实现思路 5.总结 1.Lock4j是什么? 1.1简介 lock4j是苞米…