推理

备注

阅读本篇前,请确保已按照 安装指南 准备好昇腾环境及transformers!

在推理阶段,训练好的模型被用于对图像、语音或文本进行分类,也可以用于语言生成、翻译等。

本文的模型推理以transformers的pipeline为中心进行介绍,pipelines可以自动加载模型和能够进行任务推理的预处理类,使任何模型进行任何语言、计算机视觉、语音以及多模态任务的推理变得非常简单。

pipeline 抽象类

pipeline 抽象类是所有其他 pipeline 的封装,可以像其他任何 pipeline 一样实例化。

pipeline 参数由 task、tokenizer、model、optional 组成:

  • task 将确定返回哪一个 pipeline,比如 text-classification 将会返回 TextClassificationPipeline,image-to-image 将会返回 ImageToImagePipeline。

  • tokenizer分词器是用来将输入进行编码,str或者PreTrainedTokenizer,如果未提供将使用model参数,如果model也未提供或者非str,将使用config参数,如果config参数也未提供或者非str,将提供task的默认tokenizer。

  • model是模型,str或者PreTrainedModel,一般为有.bin模型文件的目录。

  • optional其他参数包括,config、feature_extractor、device、device_map等。

pipeline 使用

pipeline适用于音频、计算机视觉、自然语言处理和多模态任务,下面将介绍它在各场景的使用方式。

音频

音频识别

用于提取某些音频中包含的文本,如下创建pipeline,并输入音频文件:

1from transformers import pipeline
2
3transcriber = pipeline(task="automatic-speech-recognition")
4transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
5
6#以下为输出示例
7{'text': 'I HAVE A DREAM BUT ONE DAY THIS NATION WILL RISE UP LIVE UP THE TRUE MEANING OF ITS TREES'}

文本转音频

根据输入文本和可选的其他条件输入生成音频文件:

1from transformers import pipeline
2
3pipe = pipeline(model="suno/bark-small")
4output = pipe("Hey it's HuggingFace on the phone!")
5
6audio = output["audio"]
7sampling_rate = output["sampling_rate"]

计算机视觉

图像分类

图像分类可以识别图片特征,并给出分类标签和置信度得分:

1from transformers import pipeline
2
3classifier = pipeline(model="microsoft/beit-base-patch16-224-pt22k-ft22k")
4classifier("https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png")
5
6#以下为输出示例
7[{'score': 0.442, 'label': 'macaw'}, {'score': 0.088, 'label': 'popinjay'}, {'score': 0.075, 'label': 'parrot'}, {'score': 0.073, 'label': 'parodist, lampooner'}, {'score': 0.046, 'label': 'poll, poll_parrot'}]

图像转图像

它可以将图像根据信息生成新图像,以下示例通过图像超分辨率模型将低分辨率图像放大并增强其细节,使其看起来更清晰:

 1from PIL import Image
 2import requests
 3from transformers import pipeline
 4
 5upscaler = pipeline("image-to-image", model="caidas/swin2SR-classical-sr-x2-64")
 6img = Image.open(requests.get("http://images.cocodataset.org/val2017/000000039769.jpg", stream=True).raw)
 7img = img.resize((64, 64))
 8upscaled_img = upscaler(img) #超分辨率处理
 9print(img.size)
10print(upscaled_img.size)
11
12#以下为输出示例
13(64, 64)    # 输出原图像的尺寸
14(144, 144)  # 输出处理后图像的尺寸

自然语言处理

文本分类

根据标签对文本进行分类:

1from transformers import pipeline
2classifier = pipeline(model="meta-llama/Meta-Llama-3-8B-Instruct")
3classifier(
4    "I have a problem with my iphone that needs to be resolved asap!!",
5    candidate_labels=["urgent", "not urgent", "phone", "tablet", "computer"],
6)
7#以下为输出示例
8#{'sequence': 'I have a problem with my iphone that needs to be resolved asap!!', 'labels': ['urgent', 'phone', 'computer', 'not urgent', 'tablet'], 'scores': [0.504, 0.479, 0.013, 0.003, 0.002]}

文本生成

根据文本生成对话响应:

1from transformers import pipeline
2
3generator = pipeline(model="HuggingFaceH4/zephyr-7b-beta")
4# Zephyr-beta is a conversational model, so let's pass it a chat instead of a single string
5generator([{"role": "user", "content": "What is the capital of France? Answer in one word."}], do_sample=False, max_new_tokens=2)
6
7#以下为输出示例
8[{'generated_text': [{'role': 'user', 'content': 'What is the capital of France? Answer in one word.'}, {'role': 'assistant', 'content': 'Paris'}]}]

多模态

视觉问答

VQA使用图像和关于该图像的问题进行提问,图像可以是URL或图像的本地路径:

 1from transformers import pipeline
 2vqa = pipeline(model="meta-llama/Meta-Llama-3-8B-Instruct")
 3output = vqa(
 4    image="https://huggingface.co/spaces/impira/docquery/resolve/2359223c1837a7587402bda0f2643382a6eefeab/invoice.png",
 5    question="What is the invoice number?",
 6)
 7output[0]["score"] = round(output[0]["score"], 3)
 8
 9#以下为输出示例
10#[{'score': 0.425, 'answer': 'us-001', 'start': 16, 'end': 16}]

图像转文本

用于预测给定图像的主题:

1from transformers import pipeline
2
3captioner = pipeline(model="ydshieh/vit-gpt2-coco-en")
4captioner("https://huggingface.co/datasets/Narsil/image_dummy/raw/main/parrots.png")
5
6#以下为输出示例
7[{'generated_text': 'two birds are standing next to each other '}]