pipeline(): самый быстрый способ применить модель

Знакомимся с главным инструментом для быстрого старта — функцией pipeline().

pipeline() — высокоуровневая функция библиотеки transformers, которая объединяет токенизацию, прогон через модель и постобработку в один вызов.

Зачем нужен pipeline

Чтобы применить модель вручную, нужно: загрузить токенизатор, превратить текст в числа, прогнать их через модель, получить логиты и преобразовать их в человекочитаемый ответ. pipeline() делает всё это за вас. Достаточно указать задачу, и библиотека сама подберёт подходящую модель по умолчанию.

from transformers import pipeline

classifier = pipeline("sentiment-analysis")
result = classifier("Сервис был ужасным, никогда не вернусь")
print(result)
# [{'label': 'NEGATIVE', 'score': 0.998}]

Три шага внутри

Любой pipeline выполняет три этапа:

текст --> [токенизатор] --> числа (input_ids)
числа --> [модель]      --> логиты
логиты --> [постобработка] --> метка + уверенность

Эта схема одинакова почти для всех задач, меняются только модель и способ постобработки. Понимая её, вы перестаёте воспринимать pipeline как «магию».

Выбор конкретной модели

По умолчанию pipeline берёт стандартную модель для задачи, но обычно вы указываете нужную явно через параметр model:

classifier = pipeline(
    "sentiment-analysis",
    model="blanchefort/rubert-base-cased-sentiment"
)

Здесь выбрана русскоязычная модель — стандартная модель по умолчанию обучена на английском и плохо работает с русским текстом.

Как работает под капотом

При первом вызове pipeline("sentiment-analysis") библиотека: 1) определяет класс задачи, 2) скачивает модель по умолчанию и её токенизатор с Hub, 3) загружает веса в память, 4) создаёт объект, который при каждом вызове прогоняет текст через все три этапа. Объект можно вызывать многократно — модель загружается один раз. Для пакетной обработки можно передать список строк, и pipeline обработает их эффективнее, чем по одной.

Частые ошибки

  • Создавать pipeline внутри цикла. Тогда модель грузится заново каждый раз. Создайте его один раз вне цикла.
  • Применять англоязычную модель к русскому тексту. Указывайте подходящую модель явно.
  • Ожидать, что score — это вероятность правильности. Это уверенность модели, она может быть высокой и при ошибке.

Итог

  • pipeline() — самый быстрый способ применить модель: один вызов вместо десятков строк.
  • Внутри всегда три этапа: токенизация, прогон через модель, постобработка.
  • Модель указывайте явно через model=... для нужного языка.
  • Создавайте pipeline один раз, а не в цикле.
Проверьте себя
1. Какие три этапа выполняет любой pipeline?
AСкачивание, установка, запуск
BТокенизация, прогон через модель, постобработка
CЧтение, запись, удаление
DОбучение, валидация, тест
2. Почему не стоит создавать pipeline внутри цикла?
AЭто запрещено синтаксисом Python
BМодель будет загружаться заново на каждой итерации
CPipeline нельзя вызывать дважды
DЭто приведёт к утечке памяти токенизатора
3. Что означает поле score в результате классификации?
AГарантию правильности ответа
BУверенность модели в предсказании
CНомер модели
DВремя выполнения