Transformers documentation

Пайплайн

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.2).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Пайплайн

Pipeline — это простой, но мощный API для инференса, который легко использовать для различных задач машинного обучения с любой моделью из Hub Hugging Face.

Настройте Pipeline под вашу задачу с помощью специфических параметров, например, добавив метки времени в конвейер автоматического распознавания речи (ASR) для транскрибирования стенограмм совещаний. Pipeline поддерживает GPU, Apple Silicon и веса с половинной точностью для ускорения инференса и экономии памяти.

В библиотеке Transformers есть два класса пайплайнов: универсальный Pipeline и множество отдельных пайплайнов для конкретных задач, например TextGenerationPipeline. Загрузите эти отдельные пайплайны, указав идентификатор задачи в параметре task в Pipeline. Идентификатор задачи для каждого пайплайна можно найти в его документации API.

Каждая задача настроена на использование предобученной модели и препроцессора по умолчанию, но при необходимости вы можете использовать другую модель, переопределив параметр model.

Например, чтобы использовать TextGenerationPipeline с Gemma 2, установите task="text-generation" и model="google/gemma-2-2b".

from transformers import pipeline

pipeline = pipeline(task="text-generation", model="google/gemma-2-2b")
pipeline("the secret to baking a really good cake is ")
[{'generated_text': 'the secret to baking a really good cake is 1. the right ingredients 2. the'}]

Если у вас несколько входных данных, передавайте их в виде списка.

from transformers import pipeline
from accelerate import Accelerator

device = Accelerator().device

pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device=device)
pipeline(["the secret to baking a really good cake is ", "a baguette is "])
[[{'generated_text': 'the secret to baking a really good cake is 1. the right ingredients 2. the'}],
 [{'generated_text': 'a baguette is 100% bread.\n\na baguette is 100%'}]]

В этом руководстве вы познакомитесь с Pipeline, узнаете о его возможностях и увидите, как настроить различные параметры.

Задачи

Pipeline совместим с множеством задач машинного обучения в разных модальностях. Передайте в конвейер соответствующий вход, и он сам обработает остальное.

Ниже приведены примеры использования Pipeline для различных задач и модальностей.

автоматическое распознавание речи
классификация изображений
визуальный вопросно-ответный
from transformers import pipeline

pipeline = pipeline(task="automatic-speech-recognition", model="openai/whisper-large-v3")
pipeline("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.'}

Параметры

Минимально Pipeline требует только идентификатор задачи, модель и соответствующий вход. Однако для настройки пайплайна доступно множество параметров — от специфичных для задачи до оптимизации производительности.

В этом разделе представлены некоторые из более важных параметров.

Устройство

Pipeline совместим с различными типами оборудования, включая GPU, CPU, Apple Silicon и другие. Тип оборудования настраивается с помощью параметра device. По умолчанию, если device не задан, Pipeline автоматически размещает модель на первом доступном ускорителе (CUDA GPU, Apple Silicon MPS, XPU, …) и переключается на CPU только в том случае, если ускоритель недоступен. Передайте device="cpu", чтобы принудительно запустить модель на CPU.

GPU
Apple silicon

Чтобы запустить Pipeline на GPU, установите для device соответствующий идентификатор CUDA-устройства. Например, device=0 запускает работу на первом GPU.

from transformers import pipeline

pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device=0)
pipeline("the secret to baking a really good cake is ")

Вы также можете позволить Accelerate, библиотеке для распределённого обучения, автоматически выбирать способ загрузки и сохранения весов модели на соответствующем устройстве. Это особенно полезно, если у вас несколько устройств. Accelerate загружает и сохраняет веса модели сначала на самом быстром устройстве, а затем по мере необходимости перемещает их на другие устройства (CPU, жёсткий диск). Установите device_map="auto", чтобы Accelerate выбрал устройство.

Убедитесь, что Accelerate установлен.

!pip install -U accelerate
from transformers import pipeline

pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device_map="auto")
pipeline("the secret to baking a really good cake is ")

Пакетный вывод

Pipeline также может обрабатывать пакеты входных данных с помощью параметра batch_size. Пакетный вывод может повысить скорость, особенно на GPU, но это не гарантировано. На то, ускоряет ли пакетный вывод, могут влиять и другие факторы, такие как оборудование, данные и сама модель. По этой причине пакетный вывод отключён по умолчанию.

В примере ниже, когда имеется 4 входных данных, а batch_size установлено в 2, Pipeline передаёт модели по 2 входных данных за раз.

from transformers import pipeline
from accelerate import Accelerator

device = Accelerator().device

pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device=device, batch_size=2)
pipeline(["the secret to baking a really good cake is", "a baguette is", "paris is the", "hotdogs are"])
[[{'generated_text': 'the secret to baking a really good cake is to use a good cake mix.\n\ni’'}],
 [{'generated_text': 'a baguette is'}],
 [{'generated_text': 'paris is the most beautiful city in the world.\n\ni’ve been to paris 3'}],
 [{'generated_text': 'hotdogs are a staple of the american diet. they are a great source of protein and can'}]]

Ещё один хороший сценарий использования пакетного вывода — это потоковая обработка данных в Pipeline.

from transformers import pipeline
from accelerate import Accelerator
from transformers.pipelines.pt_utils import KeyDataset
import datasets

device = Accelerator().device

# KeyDataset is a utility that returns the item in the dict returned by the dataset
dataset = load_dataset("stanfordnlp/imdb", name="plain_text", split="unsupervised")
pipeline = pipeline(task="text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", device=device)
for out in pipeline(KeyDataset(dataset, "text"), batch_size=8, truncation="only_first"):
    print(out)

При определении того, может ли пакетный вывод улучшить производительность, имейте в виду следующие общие рекомендации.

  1. Единственный способ узнать наверняка — измерить производительность на вашей модели, данных и оборудовании.
  2. Не используйте пакетный вывод, если вы ограничены по задержке (например, продукт для живого вывода).
  3. Не используйте пакетный вывод, если вы работаете на CPU.
  4. Не используйте пакетный вывод, если вам неизвестна sequence_length ваших данных. Измеряйте производительность, постепенно увеличивайте sequence_length и добавляйте проверки на переполнение памяти (OOM), чтобы восстанавливаться после сбоев.
  5. Используйте пакетный вывод (batch inference), если ваша sequence_length регулярна, и постепенно увеличивайте размер пакета, пока не возникнет ошибка OOM. Чем больше видеокарта, тем полезнее пакетный вывод.
  6. Убедитесь, что вы можете обрабатывать ошибки OOM, если решите выполнять пакетный вывод.

Параметры, специфичные для задачи

Pipeline принимает любые параметры, поддерживаемые конкретным пайплайном задачи. Обратитесь к документации по каждому пайплайну задачи, чтобы узнать, какие параметры доступны. Если вы не нашли параметр, полезный для вашего сценария, не стесняйтесь открыть issue на GitHub с запросом!

Приведённые ниже примеры демонстрируют некоторые из доступных параметров, специфичных для задач.

автоматическое распознавание речи
генерация текста

Передайте параметр return_timestamps="word" в Pipeline, чтобы получить время произнесения каждого слова.

from transformers import pipeline

pipeline = pipeline(task="automatic-speech-recognition", model="openai/whisper-large-v3")
pipeline(audio="https://huggingface.co/datasets/Narsil/asr_dummy/resolve/main/mlk.flac", return_timestamps="word")
{'text': ' I have a dream that one day this nation will rise up and live out the true meaning of its creed.',
 'chunks': [{'text': ' I', 'timestamp': (0.0, 1.1)},
  {'text': ' have', 'timestamp': (1.1, 1.44)},
  {'text': ' a', 'timestamp': (1.44, 1.62)},
  {'text': ' dream', 'timestamp': (1.62, 1.92)},
  {'text': ' that', 'timestamp': (1.92, 3.7)},
  {'text': ' one', 'timestamp': (3.7, 3.88)},
  {'text': ' day', 'timestamp': (3.88, 4.24)},
  {'text': ' this', 'timestamp': (4.24, 5.82)},
  {'text': ' nation', 'timestamp': (5.82, 6.78)},
  {'text': ' will', 'timestamp': (6.78, 7.36)},
  {'text': ' rise', 'timestamp': (7.36, 7.88)},
  {'text': ' up', 'timestamp': (7.88, 8.46)},
  {'text': ' and', 'timestamp': (8.46, 9.2)},
  {'text': ' live', 'timestamp': (9.2, 10.34)},
  {'text': ' out', 'timestamp': (10.34, 10.58)},
  {'text': ' the', 'timestamp': (10.58, 10.8)},
  {'text': ' true', 'timestamp': (10.8, 11.04)},
  {'text': ' meaning', 'timestamp': (11.04, 11.4)},
  {'text': ' of', 'timestamp': (11.4, 11.64)},
  {'text': ' its', 'timestamp': (11.64, 11.8)},
  {'text': ' creed.', 'timestamp': (11.8, 12.3)}]}

Пакетная обработка фрагментов

В некоторых случаях необходимо обрабатывать данные по частям.

  • для некоторых типов данных один вход (например, очень длинный аудиофайл) может потребовать разбиения на несколько частей перед обработкой
  • для некоторых задач, таких как классификация без обучения или ответы на вопросы, для одного входного запроса может потребоваться несколько проходов, что может вызывать проблемы с параметром batch_size

Класс ChunkPipeline предназначен для обработки таких сценариев. Оба класса pipeline используются одинаково, однако, поскольку ChunkPipeline может автоматически обрабатывать батчинг, вам не нужно беспокоиться о количестве forward-проходов, которые вызывают ваши входные данные. Вместо этого вы можете оптимизировать batch_size независимо от входных данных.

Приведённый ниже пример показывает, чем он отличается от Pipeline.

# ChunkPipeline
all_model_outputs = []
for preprocessed in pipeline.preprocess(inputs):
    model_outputs = pipeline.model_forward(preprocessed)
    all_model_outputs.append(model_outputs)
outputs =pipeline.postprocess(all_model_outputs)

# Pipeline
preprocessed = pipeline.preprocess(inputs)
model_outputs = pipeline.forward(preprocessed)
outputs = pipeline.postprocess(model_outputs)

Большие наборы данных

Для инференса с большими наборами данных можно итерировать непосредственно по самому датасету. Это позволяет избежать немедленного выделения памяти для всего набора данных, а также избавляет от необходимости самостоятельно формировать батчи. Попробуйте Batch inference с параметром batch_size, чтобы проверить, улучшится ли производительность.

from transformers.pipelines.pt_utils import KeyDataset
from transformers import pipeline
from accelerate import Accelerator
from datasets import load_dataset

device = Accelerator().device

dataset = load_dataset("stanfordnlp/imdb", name="plain_text", split="unsupervised")
pipeline = pipeline(task="text-classification", model="distilbert/distilbert-base-uncased-finetuned-sst-2-english", device=device)
for out in pipeline(KeyDataset(dataset, "text"), batch_size=8, truncation="only_first"):
    print(out)

Среди других способов выполнения инференса на больших наборах данных с помощью Pipeline — использование итератора или генератора.

def data():
    for i in range(1000):
        yield f"My example {i}"

pipeline = pipeline(model="openai-community/gpt2", device=0)
generated_characters = 0
for out in pipeline(data()):
    generated_characters += len(out[0]["generated_text"])

Большие модели

Accelerate позволяет применить несколько оптимизаций для запуска больших моделей с помощью Pipeline. Убедитесь, что Accelerate установлен.

!pip install -U accelerate

Настройка device_map="auto" полезна для автоматического распределения модели по самым быстрым устройствам (GPU) с последующим переносом на более медленные устройства (CPU, жесткий диск), если они доступны.

Pipeline поддерживает веса с половинной точностью (torch.float16), что может значительно ускорить работу и сэкономить память. Потеря производительности незначительна для большинства моделей, особенно для крупных. Если ваше оборудование это позволяет, вы можете включить torch.bfloat16 вместо этого, чтобы получить больший диапазон значений.

Входные данные внутренне преобразуются в torch.float16, и это работает только для моделей с бэкендом PyTorch.

Наконец, Pipeline также принимает квантованные модели, чтобы ещё больше снизить потребление памяти. Убедитесь, что библиотека bitsandbytes установлена, а затем добавьте quantization_config в model_kwargs в конвейере.

import torch
from transformers import pipeline, BitsAndBytesConfig

pipeline = pipeline(model="google/gemma-7b", dtype=torch.bfloat16, device_map="auto", model_kwargs={"quantization_config": BitsAndBytesConfig(load_in_8bit=True)})
pipeline("the secret to baking a good cake is ")
[{'generated_text': 'the secret to baking a good cake is 1. the right ingredients 2. the right'}]
Update on GitHub