当前位置:   article > 正文

1.2 基础组件之Pipeline_pipline

pipline

目录

1 什么是Pipeline

2 Pipeline支持的任务类型

3 Pipeline的创建:

4 关于Pipeline的执行设备:

5 确定Pipeline参数:

6 其他Pipeline示例(以目标检测为例):

7 Pipeline的背后实现(以文本分类为例):


1 什么是Pipeline

2 Pipeline支持的任务类型

可以通过“from transformers.pipelines import SUPPORTED_TASKS”进行查看。

3 Pipeline的创建:

注意,我们使用的是Jupiter(猪皮特),故以下代码皆为部分代码。

1)根据任务类型直接创建,不自己指定模型,使用该类任务默认模型:

  1. pipe = pipeline("text-classification")
  2. pipe(["very good!", "vary bad!"])

2)指定任务类型,接着继续指定具体模型:

模型链接:Huggingface官网 

  1. pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")
  2. pipe("我很开心哦!")

3)预先加载模型和分词器,接着再创建Pipeline

  1. # 这种方式,必须同时指定model和tokenizer
  2. model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
  3. tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
  4. pipe = pipeline("text-classification", model=model, tokenizer=tokenizer)
  5. pipe("我觉得不太行!")

4 关于Pipeline的执行设备:

1)查看当前pipeline执行设备:

pipe.model.device

2)粗略估计执行时间:

  1. import torch
  2. import time
  3. times = []
  4. for i in range(100):
  5. torch.cuda.synchronize()
  6. start = time.time()
  7. pipe("我觉得不太行!")
  8. torch.cuda.synchronize()
  9. end = time.time()
  10. times.append(end - start)
  11. print(sum(times) / 100)

3)使用GPU进行推理

  1. pipe = pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese", device=0)
  2. #后边的数字0表示选取第0块显卡,没有该参数则默认采用cpu训练

5 确定Pipeline参数:

有那么多模型,我们怎么知道该如何设置它的参数呢?

1)首先我们可以参考官网的教程;

2)其次就是我们可以跳到所用模型的定义去查阅samples;

  1. qa_pipe = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
  2. qa_pipe
  3. #生成<transformers.pipelines.question_answering.QuestionAnsweringPipeline at 0x2f42d953d30>
  4. #接着复制我们使用的模型到代码框QuestionAnsweringPipeline,进入其定义

3)也可以通过help的方式在控制台查看:

  1. from transformers.pipelines.question_answering import QuestionAnsweringPipeline
  2. help(QuestionAnsweringPipeline)

6 其他Pipeline示例(以目标检测为例):

  1. checkpoint = "google/owlvit-base-patch32"
  2. detector = pipeline(model=checkpoint, task="zero-shot-object-detection")
  3. #显示图片
  4. import requests
  5. from PIL import Image
  6. url = "https://unsplash.com/photos/oj0zeY2Ltk4/download?ixid=MnwxMjA3fDB8MXxzZWFyY2h8MTR8fHBpY25pY3xlbnwwfHx8fDE2Nzc0OTE1NDk&force=true&w=640"
  7. im = Image.open(requests.get(url, stream=True).raw)
  8. im
  9. #对图片内容进行零样本预测
  10. predictions = detector(
  11. im,
  12. candidate_labels=["hat", "sunglasses", "orange"],
  13. )
  14. predictions
  15. #绘制预测框
  16. from PIL import ImageDraw
  17. draw = ImageDraw.Draw(im)
  18. for prediction in predictions:
  19. box = prediction["box"]
  20. label = prediction["label"]
  21. score = prediction["score"]
  22. xmin, ymin, xmax, ymax = box.values()
  23. draw.rectangle((xmin, ymin, xmax, ymax), outline="red", width=1)
  24. draw.text((xmin, ymin), f"{label}: {round(score,2)}", fill="red")
  25. im

7 Pipeline的背后实现(以文本分类为例):

  1. # 准备数据(文本)
  2. input_text = "我觉得不太行!"
  3. # 初始化Tokennizer
  4. inputs = tokenizer(input_text, return_tensors="pt")
  5. inputs
  6. # 初始化model
  7. from transformers import *
  8. import torch
  9. tokenizer = AutoTokenizer.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
  10. model = AutoModelForSequenceClassification.from_pretrained("uer/roberta-base-finetuned-dianping-chinese")
  11. # 模型预测
  12. res = model(**inputs)
  13. res
  14. # 得到预测部分的内容,经过一个softmax层归一化为0-1,化为概率
  15. logits = res.logits
  16. logits = torch.softmax(logits, dim=-1)
  17. logits
  18. # 得到类别
  19. pred = torch.argmax(logits).item()
  20. pred
  21. # 映射回去,得到直观结果
  22. result = model.config.id2label.get(pred)
  23. result

1)原始数据:

“我觉得不太行!”

2)经过tokenizer 后:

{
    'input_ids': tensor([[ 101, 2769, 6230, 2533, 679, 1922, 6121, 8013, 102]]),
    'token_type_ids': tensor([[0, 0, 0, 0, 0, 0, 0, 0, 0]]),
    'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1]])
}

这是一个字典对象,其中包含三个键值对:

  • 'input_ids':输入文本被转换为对应的token ID序列。
  • 'token_type_ids':用于区分不同句子或片段的标识符,该示例中为单句文本,因此所有标识符都为0。
  • 'attention_mask':用于指示哪些位置的token需要被注意,该示例中所有位置都被注意到(值为1)。

3)经过模型训练后的结果 

SequenceClassifierOutput(
    loss=None,
    logits=tensor([[ 1.7376, -1.8681]], grad_fn=<AddmmBackward0>),
    hidden_states=None,
    attentions=None
)
 
  • loss:损失值,表示模型在训练过程中的损失。损失值为None,表示没有计算损失。
  • logits:模型的输出logits。它是一个张量(tensor),其中包含模型对每个类别的分数或概率。logits的值为tensor([[ 1.7376, -1.8681]])
  • hidden_states:隐藏状态。隐藏状态为None,表示没有返回隐藏状态。
  • attentions:注意力权重。注意力权重为None,表示没有返回注意力权重。

4)经过Softmax层

tensor([[0.9736, 0.0264]], grad_fn=<SoftmaxBackward0>)

得到归一化概率分布 

5)取最大概率的下标,得到类别

0 #其中0表示负类,1表示正类

6)映射回去,得到直观结果

'negative (stars 1, 2 and 3)'

将上述一整个东西封装好,就是一个Pipeline。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/967290
推荐阅读
相关标签
  

闽ICP备14008679号