Transformers documentation
Пайплайн
Пайплайн
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.'}from transformers import pipeline
pipeline = pipeline(task="image-classification", model="google/vit-base-patch16-224")
pipeline(images="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/pipeline-cat-chonk.jpeg")
[{'label': 'lynx, catamount', 'score': 0.43350091576576233},
{'label': 'cougar, puma, catamount, mountain lion, painter, panther, Felis concolor',
'score': 0.034796204417943954},
{'label': 'snow leopard, ounce, Panthera uncia',
'score': 0.03240183740854263},
{'label': 'Egyptian cat', 'score': 0.02394474856555462},
{'label': 'tiger cat', 'score': 0.02288915030658245}]from transformers import pipeline
pipeline = pipeline(task="visual-question-answering", model="Salesforce/blip-vqa-base")
pipeline(
image="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/transformers/tasks/idefics-few-shot.jpg",
question="What is in the image?",
)
[{'answer': 'statue of liberty'}]Параметры
Минимально Pipeline требует только идентификатор задачи, модель и соответствующий вход. Однако для настройки пайплайна доступно множество параметров — от специфичных для задачи до оптимизации производительности.
В этом разделе представлены некоторые из более важных параметров.
Устройство
Pipeline совместим с различными типами оборудования, включая GPU, CPU, Apple Silicon и другие. Тип оборудования настраивается с помощью параметра device. По умолчанию, если device не задан, Pipeline автоматически размещает модель на первом доступном ускорителе (CUDA GPU, Apple Silicon MPS, XPU, …) и переключается на CPU только в том случае, если ускоритель недоступен. Передайте device="cpu", чтобы принудительно запустить модель на CPU.
Чтобы запустить 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 на Apple silicon, установите device="mps".
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="google/gemma-2-2b", device="mps")
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)При определении того, может ли пакетный вывод улучшить производительность, имейте в виду следующие общие рекомендации.
- Единственный способ узнать наверняка — измерить производительность на вашей модели, данных и оборудовании.
- Не используйте пакетный вывод, если вы ограничены по задержке (например, продукт для живого вывода).
- Не используйте пакетный вывод, если вы работаете на CPU.
- Не используйте пакетный вывод, если вам неизвестна
sequence_lengthваших данных. Измеряйте производительность, постепенно увеличивайтеsequence_lengthи добавляйте проверки на переполнение памяти (OOM), чтобы восстанавливаться после сбоев. - Используйте пакетный вывод (batch inference), если ваша
sequence_lengthрегулярна, и постепенно увеличивайте размер пакета, пока не возникнет ошибка OOM. Чем больше видеокарта, тем полезнее пакетный вывод. - Убедитесь, что вы можете обрабатывать ошибки 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)}]}Передайте return_full_text=False в Pipeline, чтобы возвращать только сгенерированный текст, а не полный текст (промпт и сгенерированный текст).
call() также поддерживает дополнительные именованные аргументы из метода generate(). Чтобы вернуть более одной сгенерированной последовательности, установите num_return_sequences в значение, большее 1.
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="openai-community/gpt2")
pipeline("the secret to baking a good cake is", num_return_sequences=4, return_full_text=False)
[{'generated_text': ' how easy it is for me to do it with my hands. You must not go nuts, or the cake is going to fall out.'},
{'generated_text': ' to prepare the cake before baking. The key is to find the right type of icing to use and that icing makes an amazing frosting cake.\n\nFor a good icing cake, we give you the basics'},
{'generated_text': " to remember to soak it in enough water and don't worry about it sticking to the wall. In the meantime, you could remove the top of the cake and let it dry out with a paper towel.\n"},
{'generated_text': ' the best time to turn off the oven and let it stand 30 minutes. After 30 minutes, stir and bake a cake in a pan until fully moist.\n\nRemove the cake from the heat for about 12'}]Пакетная обработка фрагментов
В некоторых случаях необходимо обрабатывать данные по частям.
- для некоторых типов данных один вход (например, очень длинный аудиофайл) может потребовать разбиения на несколько частей перед обработкой
- для некоторых задач, таких как классификация без обучения или ответы на вопросы, для одного входного запроса может потребоваться несколько проходов, что может вызывать проблемы с параметром
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'}]