用于推理的管道
的 pipeline() 使得从 Hub 中使用任何模型进行任何语言、计算机视觉、语音和多模态任务的推理变得简单。 即使您没有特定模态方面的经验,也不熟悉模型背后的底层代码,您仍然可以使用 pipeline() 进行推理! 本教程将教您如何
- 使用 pipeline() 进行推理。
- 使用特定分词器或模型。
- 使用 pipeline() 执行音频、视觉和多模态任务。
查看 pipeline() 文档以获取受支持任务和可用参数的完整列表。
管道使用
虽然每个任务都与一个相关的pipeline()相连,但使用包含所有任务特定管道的一般pipeline()抽象更简单。该pipeline()会自动加载一个默认模型和一个能够进行推理的预处理类,用于您的任务。以使用pipeline()进行自动语音识别 (ASR) 或语音转文本为例。
- 首先创建一个pipeline()并指定推理任务
>>> from transformers import pipeline
>>> transcriber = pipeline(task="automatic-speech-recognition")
- 将您的输入传递给pipeline()。在语音识别的情况下,这是一个音频输入文件
>>> transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
{'text': 'I HAVE A DREAM BUT ONE DAY THIS NATION WILL RISE UP LIVE UP THE TRUE MEANING OF ITS TREES'}
结果不是您想要的?查看 Hub 上一些下载量最多的自动语音识别模型,看看是否能获得更好的转录结果。
我们尝试一下 OpenAI 的Whisper large-v2 模型。Whisper 比 Wav2Vec2 晚两年发布,并且在近 10 倍的数据量上进行了训练。因此,它在大多数下游基准测试中都胜过了 Wav2Vec2。它还具有预测标点符号和大小写的额外优势,而 Wav2Vec2 则无法实现。
Wav2Vec2。
让我们在这里尝试一下,看看它的表现如何
>>> transcriber = pipeline(model="openai/whisper-large-v2")
>>> transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.'}
现在这个结果看起来更准确了!有关 Wav2Vec2 与 Whisper 的深入比较,请参阅音频转换器课程。我们强烈建议您查看 Hub 上不同语言的模型,专注于您领域的模型等等。您可以在 Hub 上直接从浏览器查看和比较模型结果,看看它是否比其他模型更适合或更好地处理特殊情况。如果您没有找到适合您用例的模型,您始终可以开始训练自己的模型!
如果您有多个输入,可以将输入作为列表传递
transcriber(
[
"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac",
"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/1.flac",
]
)
管道非常适合实验,因为从一个模型切换到另一个模型非常简单;但是,有一些方法可以优化它们,以用于比实验更大的工作负载。请参阅以下指南,它们深入探讨了如何遍历整个数据集或在 Web 服务器中使用管道:of the docs
参数
pipeline() 支持许多参数;有些是特定于任务的,而有些是所有管道的通用参数。通常,您可以在任何需要的位置指定参数
transcriber = pipeline(model="openai/whisper-large-v2", my_parameter=1)
out = transcriber(...) # This will use `my_parameter=1`.
out = transcriber(..., my_parameter=2) # This will override and use `my_parameter=2`.
out = transcriber(...) # This will go back to using `my_parameter=1`.
我们看看三个重要的参数
设备
如果您使用device=n
,管道会自动将模型放到指定的设备上。无论您使用的是 PyTorch 还是 Tensorflow,这都将有效。
transcriber = pipeline(model="openai/whisper-large-v2", device=0)
如果模型太大而无法放入单个 GPU,并且您使用的是 PyTorch,则可以设置torch_dtype='float16'
以启用 FP16 精度推理。通常,这不会导致明显的性能下降,但请确保在您的模型上对其进行评估!
或者,您可以设置device_map="auto"
以自动确定如何加载和存储模型权重。使用device_map
参数需要 🤗 Accelerate 包
pip install --upgrade accelerate
以下代码会自动跨设备加载和存储模型权重
transcriber = pipeline(model="openai/whisper-large-v2", device_map="auto")
请注意,如果传递了device_map="auto"
,则在实例化您的pipeline
时无需添加参数device=device
,因为您可能会遇到一些意外行为!
批次大小
默认情况下,管道不会进行批次推理,原因在这里详细解释。原因是批次处理并不一定更快,在某些情况下实际上可能会更慢。
但如果它适合您的用例,您可以使用
transcriber = pipeline(model="openai/whisper-large-v2", device=0, batch_size=2)
audio_filenames = [f"https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/{i}.flac" for i in range(1, 5)]
texts = transcriber(audio_filenames)
这将在 4 个提供的音频文件上运行管道,但它会将它们以 2 个为一组传递给模型(该模型位于 GPU 上,批次处理更有可能提供帮助),而无需您编写任何其他代码。输出应始终与您在没有批次处理的情况下收到的输出一致。它只是为了帮助您从管道中获得更快的速度。
管道还可以减轻批次处理的一些复杂性,因为对于某些管道,单个项目(例如长音频文件)需要分成多个部分才能由模型进行处理。管道为您执行此块批次处理。
任务特定参数
所有任务都提供任务特定参数,这些参数允许您获得额外的灵活性,并提供选项来帮助您完成工作。例如,transformers.AutomaticSpeechRecognitionPipeline.call() 方法有一个return_timestamps
参数,对于为视频添加字幕来说,这听起来很有希望
>>> transcriber = pipeline(model="openai/whisper-large-v2", return_timestamps=True)
>>> transcriber("https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac")
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.', 'chunks': [{'timestamp': (0.0, 11.88), 'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its'}, {'timestamp': (11.88, 12.38), 'text': ' creed.'}]}
如您所见,模型推断出了文本,还输出了何时发出了各种句子。
每个任务都有许多可用的参数,因此请查看每个任务的 API 参考,看看您可以调整哪些内容!例如,AutomaticSpeechRecognitionPipeline 有一个chunk_length_s
参数,这对于处理模型通常无法单独处理的超长音频文件(例如,为整部电影或时长一小时的视频添加字幕)很有帮助
>>> transcriber = pipeline(model="openai/whisper-large-v2", chunk_length_s=30)
>>> transcriber("https://huggingface.co/datasets/reach-vb/random-audios/resolve/main/ted_60.wav")
{'text': " So in college, I was a government major, which means I had to write a lot of papers. Now, when a normal student writes a paper, they might spread the work out a little like this. So, you know. You get started maybe a little slowly, but you get enough done in the first week that with some heavier days later on, everything gets done and things stay civil. And I would want to do that like that. That would be the plan. I would have it all ready to go, but then actually the paper would come along, and then I would kind of do this. And that would happen every single paper. But then came my 90-page senior thesis, a paper you're supposed to spend a year on. I knew for a paper like that, my normal workflow was not an option, it was way too big a project. So I planned things out and I decided I kind of had to go something like this. This is how the year would go. So I'd start off light and I'd bump it up"}
如果您找不到真正对您有帮助的参数,请随时提出请求!
在数据集上使用管道
管道也可以对大型数据集进行推理。我们推荐的最简单方法是使用迭代器
def data():
for i in range(1000):
yield f"My example {i}"
pipe = pipeline(model="openai-community/gpt2", device=0)
generated_characters = 0
for out in pipe(data()):
generated_characters += len(out[0]["generated_text"])
迭代器data()
会产生每个结果,管道会自动识别输入是可迭代的,并且会在继续在 GPU 上处理数据的同时开始获取数据(这在幕后使用了DataLoader)。这很重要,因为您不必为整个数据集分配内存,并且可以尽快为 GPU 提供数据。
由于批次处理可以加快速度,因此尝试在这里调整batch_size
参数可能会有所帮助。
遍历数据集的最简单方法是从 🤗 Datasets 中加载一个数据集
# KeyDataset is a util that will just output the item we're interested in.
from transformers.pipelines.pt_utils import KeyDataset
from datasets import load_dataset
pipe = pipeline(model="hf-internal-testing/tiny-random-wav2vec2", device=0)
dataset = load_dataset("hf-internal-testing/librispeech_asr_dummy", "clean", split="validation[:10]")
for out in pipe(KeyDataset(dataset, "audio")):
print(out)
在 Web 服务器中使用管道
视觉管道
使用 pipeline() 用于视觉任务实际上是相同的。
指定您的任务并将您的图像传递给分类器。图像可以是链接、本地路径或 base64 编码的图像。例如,下面显示的是什么品种的猫?
>>> from transformers import pipeline
>>> vision_classifier = pipeline(model="google/vit-base-patch16-224")
>>> preds = vision_classifier(
... images="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg"
... )
>>> preds = [{"score": round(pred["score"], 4), "label": pred["label"]} for pred in preds]
>>> preds
[{'score': 0.4335, 'label': 'lynx, catamount'}, {'score': 0.0348, 'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor'}, {'score': 0.0324, 'label': 'snow leopard, ounce, Panthera uncia'}, {'score': 0.0239, 'label': 'Egyptian cat'}, {'score': 0.0229, 'label': 'tiger cat'}]
文本管道
使用 pipeline() 用于 NLP 任务实际上是相同的。
>>> from transformers import pipeline
>>> # This model is a `zero-shot-classification` model.
>>> # It will classify text, except you are free to choose any label you might imagine
>>> classifier = pipeline(model="facebook/bart-large-mnli")
>>> classifier(
... "I have a problem with my iphone that needs to be resolved asap!!",
... candidate_labels=["urgent", "not urgent", "phone", "tablet", "computer"],
... )
{'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]}
多模态管道
该 pipeline() 支持多种模态。例如,视觉问答 (VQA) 任务结合了文本和图像。随意使用您喜欢的任何图像链接和您想问有关图像的问题。图像可以是 URL 或本地路径指向图像。
例如,如果您使用这个 发票图像
>>> from transformers import pipeline
>>> vqa = pipeline(model="impira/layoutlm-document-qa")
>>> output = vqa(
... image="https://huggingface.co/spaces/impira/docquery/resolve/2359223c1837a7587402bda0f2643382a6eefeab/invoice.png",
... question="What is the invoice number?",
... )
>>> output[0]["score"] = round(output[0]["score"], 3)
>>> output
[{'score': 0.425, 'answer': 'us-001', 'start': 16, 'end': 16}]
要运行上面的示例,除了 🤗 Transformers 之外,您还需要安装 pytesseract
sudo apt install -y tesseract-ocr pip install pytesseract
在大型模型上使用管道与 🤗 accelerate:
您可以使用 🤗 accelerate
轻松地在大型模型上运行 pipeline
!首先确保您已使用 pip install accelerate
安装了 accelerate
。
首先使用 device_map="auto"
加载您的模型!我们将在我们的示例中使用 facebook/opt-1.3b
。
# pip install accelerate
import torch
from transformers import pipeline
pipe = pipeline(model="facebook/opt-1.3b", torch_dtype=torch.bfloat16, device_map="auto")
output = pipe("This is a cool example!", do_sample=True, top_p=0.95)
如果您安装了 bitsandbytes
并添加了参数 load_in_8bit=True
,您也可以传递 8 位加载的模型
# pip install accelerate bitsandbytes
import torch
from transformers import pipeline
pipe = pipeline(model="facebook/opt-1.3b", device_map="auto", model_kwargs={"load_in_8bit": True})
output = pipe("This is a cool example!", do_sample=True, top_p=0.95)
请注意,您可以用任何支持大型模型加载的 Hugging Face 模型替换检查点,例如 BLOOM。
使用 Gradio 从管道创建 Web 演示
管道在 Gradio 中得到自动支持,Gradio 是一个库,可以轻松地在 Web 上创建美观且用户友好的机器学习应用程序。首先,确保您已安装 Gradio
pip install gradio
然后,您可以通过调用 Gradio 的 Interface.from_pipeline
函数来启动管道,在一行代码中围绕图像分类管道(或任何其他管道)创建 Web 演示。这将在您的浏览器中创建一个直观的拖放界面
from transformers import pipeline
import gradio as gr
pipe = pipeline("image-classification", model="google/vit-base-patch16-224")
gr.Interface.from_pipeline(pipe).launch()
默认情况下,Web 演示在本地服务器上运行。如果您想与他人分享它,您可以通过在 launch()
中设置 share=True
来生成一个临时的公共链接。您也可以将演示托管在 Hugging Face Spaces 上以获得永久链接。