Hugging Face入门 (Pipeline)

Pipeline是使用模型进行推理的一种非常方便和简单的方式。Pipeline将库中大部分复杂的代码进行了封装,提供了一个专门用于多个任务的简单API,包括命名实体识别、掩码语言建模、情感分析、特征提取和问答等任务。

Transformers库为Pipeline提供了一个方便的接口函数pipeline()来支持这些特性。可以在huggingface文档上了解更多关于Pipeline的详细信息。

接下来,我们将学习如何使用pipeline()函数。

安装transformers和sentencepiece库

使用以下命令来安装transformerssentencepiece

1
!pip install git+https://github.com/huggingface/transformers sentencepiece --quiet

文本摘要的示例

每种任务类型都有相应的Pipeline类,但是使用通用的pipeline()函数更加简单,该函数可以自动加载默认模型,或者指定模型,并提供了对您的任务进行推理的预处理。
例如,对于文本摘要任务,我们可以使用以下代码:

1
2
3
4
5
6
7
8
from transformers import pipeline

# pipeline() 函数需要设置2个参数,第一个是任务类型,第二个是模型名称。
# 没有设置第一个参数的原因,pipeline能自动识别模型是做summarization任务,并加载该类型到模型中
generator = pipeline(model="knkarthick/MEETING_SUMMARY")
print(generator.__class__)

<class 'transformers.pipelines.text2text_generation.SummarizationPipeline'>

通过将文本加载到摘要生成器(generator),我们可以轻松地生成一段文本的摘要。

1
2
3
4
5
6
text = """
London, the capital of England and the United Kingdom, is a 21st-century city with history stretching back to Roman times. At its centre stand the imposing Houses of Parliament, the iconic ‘Big Ben’ clock tower and Westminster Abbey, site of British monarch coronations. Across the Thames River, the London Eye observation wheel provides panoramic views of the South Bank cultural complex, and the entire city.
"""
generator(text)

[{'summary_text': 'The London Eye offers panoramic views of the South Bank and the entire city.'}]

图像识别的示例

Transformers还支持图像识别任务,可以使用pipelines提供的功能非常简单地对图像进行识别。
以下是一个简单的示例:

1
2
3
4
5
6
from transformers import pipeline

classifier = pipeline(model="google/vit-base-patch16-224")
print(classifier.__class__)

<class 'transformers.pipelines.image_classification.ImageClassificationPipeline'>

通过将图片url加载到图片分类器(classifier),我们可以轻松地完成图片识别。

1
2
3
4
5
6
7
8
image_url = "https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png"
classifier(image_url)

[{'score': 0.9905232787132263, 'label': 'macaw'},
{'score': 0.005603468045592308, 'label': 'African grey, African gray, Psittacus erithacus'},
{'score': 0.0010569051373749971, 'label': 'toucan'},
{'score': 0.0006811480852775276, 'label': 'sulphur-crested cockatoo, Kakatoe galerita, Cacatua galerita'},
{'score': 0.0006714325281791389, 'label': 'lorikeet'}]

在上面的示例中,使用pipeline对图像进行识别,并打印了每个标签及其对应的分数。

Pipeline函数的参数

除了任务类型(task)和模型名称(model)参数之外,pipeline()函数还支持一系列通用的模型参数和特定的任务参数。

以下是一些重要的通用模型参数的介绍:

  • device:此参数用于指定模型推理所在的设备。
    在huggingface transformers的pipeline函数中,device参数也可以设置为一个整数,比如0,是为了将模型加载到特定编号的 GPU 进行推理。
    device 参数可以设置的值:
    • "cpu":将模型加载到CPU上进行推理。
    • "cuda":将模型加载到第一块GPU上进行推理,等同于"cuda:0"
    • "cuda:X":将模型加载到编号为X的GPU上进行推理,其中X是GPU的编号。
    • "mps": 将模型加载到Mac OS上的Apple M1或M2芯片上利用Metal Performance Shaders (MPS) 进行推理。
    • "tpu": 将模型加载到Tensor Processing Unit (TPU) 上进行推理,如Google Colab中的TPU。
    • "auto": 自动选择一个可用的设备,会按优先级首先选择TPU,然后是GPU,最后是CPU。
  • batch_size: 默认情况下,pipeline不会做批量推理(batch inference)。但是,pipeline函数提供了batch_size参数支持批量推理。可以将batch_size设置为一个正整数来指定批量推理的大小。例如,batch_size=4将会将输入分为大小为4的批次进行推理。
    batch_size 参数会影响到:
    • "推理速度":增加batch_size通常可以提高GPU利用效率,加速推理速度。但若过大也会导致OOM。
    • "内存占用":较大的batch_size会占用更多GPU显存。
    • "推理效果":某些模型对batch_size比较敏感,大小不同会影响准确率。
    • "支持长度":一些模型对最大输入长度有限制,batch_size过大可能超出模型支持长度。
    • "输出":输出会是一个批量结果列表,如果只需要单条结果,需要索引获取。
  • truncation: 控制输入文本的截断方式。
    truncation 参数可以设置的值:
    • "do_not_truncate": 不截断输入文本。
    • "longest_first": 从最长的句子开始截断。
    • "only_first": 只截断第一个句子。
    • "only_second": 只截断第二个句子。
    • "longest_second": 从最长的第二个句子开始截断。
  • padding: 控制输入文本的填充方式。
    padding 参数可以设置的值:
    • "do_not_pad": 不填充输入文本。
    • "longest": 使用最长的句子进行填充。
    • "max_length": 使用指定的max_length参数进行填充。

模型特有的参数

除了上述模型通用的参数之外,不同的任务类型还有一些特定的参数。
例如,在文本分类任务中,TextClassificationPipeline类具有一个特定的参数return_all_scores,用于控制是否返回所有预测分数或只返回预测命中类别的分数。

以下是一个使用TextClassificationPipeline类的示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from transformers import pipeline
classifier = pipeline(model="ProsusAI/finbert")
print(classifier.__class__)

<class 'transformers.pipelines.text_classification.TextClassificationPipeline'>

sentence = """
Hundreds of new North Sea oil and gas licences to boost British energy independence and grow the economy
"""
classifier(sentence, return_all_scores=True)

[[{'label': 'positive', 'score': 0.886681854724884},
{'label': 'negative', 'score': 0.009547530673444271},
{'label': 'neutral', 'score': 0.10377060621976852}]]

在上面的示例中,return_all_scores参数设置为True,因此返回了所有预测分数。如果将其设置为False,则只会返回预测命中类别的分数。
TextClassificationPipeline详细参数设置,可以参考文档TextClassificationPipeline

总结

Transformers的pipelines提供了一种简单而强大的方式来使用预训练模型进行自然语言处理和图像识别任务。通过使用通用的pipeline()函数,我们可以轻松地加载默认模型或指定模型,并进行推理。

对于文本任务,例如文本分类、命名实体识别和文本摘要等,我们可以使用相应的pipeline来处理文本。例如,对于文本摘要任务,我们可以使用pipeline("summarization")来生成文本摘要。

对于图像识别任务,我们可以使用pipeline("image-classification")来进行图像识别。通过加载图像并使用pipeline进行识别,我们可以轻松地获取图像的标签和相应的分数。

pipeline()函数还支持一些通用模型参数和特定任务参数。例如,我们可以使用device参数来指定模型推理所在的设备,以及使用return_all_scores参数来决定是否返回所有预测分数。

Transformers的pipelines提供了一种简单而高效的方式来使用预训练模型进行自然语言处理和图像识别任务。无论是处理文本还是图像,使用pipelines可以让我们更轻松地进行推理,并获得高质量的结果。