Вывод модели с помощью преобразователей распознавания лиц для NLP
Внимание
- Поддержка этой документации прекращена, она может больше не обновляться. Продукты, службы или технологии, упомянутые в этом контенте, больше не поддерживаются.
- Databricks рекомендует использовать
ai_query
для пакетного вывода. См. раздел Выполнение вывода пакета LLM с помощью ai_query.
В этой статье показано, как использовать преобразователи распознавания лиц для обработки естественного языка (NLP) модели.
Преобразователи распознавания лиц предоставляют класс конвейеров для использования предварительно обученной модели для вывода. 🤗 Конвейеры преобразователей поддерживают широкий спектр задач NLP, которые можно легко использовать в Azure Databricks.
Требования
- MLflow 2.3
- Любой кластер с установленной библиотекой распознавания лиц
transformers
Hugging можно использовать для пакетного вывода. Библиотекаtransformers
предустановлена в Databricks Runtime 10.4 LTS ML и выше. Многие популярные модели NLP лучше всего работают на оборудовании GPU, поэтому вы можете get лучшую производительность с помощью недавнего оборудования GPU, если вы не используете модель специально оптимизированную для использования на ЦП.
Использование определяемых пользователем pandas UDFs для распределения вычислений модели в кластере Spark
При эксперименте с предварительно обученными моделями можно использовать пользовательские функции Pandas для упаковки модели и выполнения вычислений на рабочих ЦП или GPU. Пользовательские функции Pandas распределяют модель для каждой рабочей роли.
Вы также можете создать конвейер преобразователей распознавания лиц для машинного перевода и использовать UDF Pandas для запуска конвейера в рабочих элементах кластера Spark:
import pandas as pd
from transformers import pipeline
import torch
from pyspark.sql.functions import pandas_udf
device = 0 if torch.cuda.is_available() else -1
translation_pipeline = pipeline(task="translation_en_to_fr", model="t5-base", device=device)
@pandas_udf('string')
def translation_udf(texts: pd.Series) -> pd.Series:
translations = [result['translation_text'] for result in translation_pipeline(texts.to_list(), batch_size=1)]
return pd.Series(translations)
device
Если они доступны в кластере, эти графические процессоры используются таким образом.
Конвейеры Hugging Face для перевода возвращают list объектов Python dict
, каждый из которых содержит один ключ translation_text
и значение, содержащее переведенный текст. Этот UDF извлекает перевод из результатов, чтобы вернуть ряд Pandas только с переведенным текстом. Если конвейер создан для использования графических процессоров, задав параметр device=0
, Spark автоматически переназначает графические процессоры на рабочих узлах, если в кластере есть экземпляры с несколькими GPU.
Чтобы использовать UDF для перевода текста column, можно вызвать UDF в инструкции select
:
texts = ["Hugging Face is a French company based in New York City.", "Databricks is based in San Francisco."]
df = spark.createDataFrame(pd.DataFrame(texts, columns=["texts"]))
display(df.select(df.texts, translation_udf(df.texts).alias('translation')))
Возврат сложных типов результатов
Используя пользовательские функции Pandas, вы также можете возвращать более структурированные выходные данные. Например, в распознавании именованных сущностей потоки обработки возвращают list объектов dict
, содержащих сущность, её диапазон, тип, а также связанную оценку. Аналогично примеру перевода, возвращаемый тип заметки @pandas_udf
является более сложным в случае распознавания именованных сущностей.
Вы можете get чувство возвращаемых типов, используемых с помощью проверки результатов конвейера, например путем запуска конвейера на драйвере.
В этом примере используйте следующий код:
from transformers import pipeline
import torch
device = 0 if torch.cuda.is_available() else -1
ner_pipeline = pipeline(task="ner", model="Davlan/bert-base-multilingual-cased-ner-hrl", aggregation_strategy="simple", device=device)
ner_pipeline(texts)
Чтобы получить заметки, выполните следующие действия.
[[{'entity_group': 'ORG',
'score': 0.99933606,
'word': 'Hugging Face',
'start': 0,
'end': 12},
{'entity_group': 'LOC',
'score': 0.99967843,
'word': 'New York City',
'start': 42,
'end': 55}],
[{'entity_group': 'ORG',
'score': 0.9996372,
'word': 'Databricks',
'start': 0,
'end': 10},
{'entity_group': 'LOC',
'score': 0.999588,
'word': 'San Francisco',
'start': 23,
'end': 36}]]
Чтобы представить этот тип в качестве возвращаемого типа, можно использовать array
struct
поля, в котором перечислены dict
записи в качестве полей struct
:
import pandas as pd
from pyspark.sql.functions import pandas_udf
@pandas_udf('array<struct<word string, entity_group string, score float, start integer, end integer>>')
def ner_udf(texts: pd.Series) -> pd.Series:
return pd.Series(ner_pipeline(texts.to_list(), batch_size=1))
display(df.select(df.texts, ner_udf(df.texts).alias('entities')))
Настройка производительности
Существует несколько ключевых аспектов настройки производительности UDF. Первое — эффективно использовать каждый GPU, который можно настроить, изменив размер пакетов, отправленных на GPU конвейером Преобразователей. Во-вторых, убедитесь, что кадр данных хорошо секционирован для использования всего кластера.
Наконец, вы можете кэшировать модель Hugging Face, чтобы сэкономить время загрузки модели или затраты на входящий трафик.
Выбор размера пакета
Хотя UDFS, описанные выше, должны работать вне поля с batch_size
1, это может не использовать ресурсы, доступные для работников эффективно. Чтобы повысить производительность, настройте размер пакета на модель и оборудование в кластере. Databricks рекомендует попробовать различные размеры пакетов для конвейера в кластере, чтобы найти оптимальную производительность. Дополнительные сведения о пакетной обработке конвейера и других параметрах производительности см. в документации по объятиям лиц.
Попробуйте найти размер пакета, который достаточно велик, чтобы он приводил к полному использованию GPU, но не приводит к CUDA out of memory
ошибкам.
CUDA out of memory
При получении ошибок во время настройки необходимо отсоединить и повторно подключить записную книжку, чтобы освободить память, используемую моделью и данными в GPU.
Отслеживайте производительность GPU, просматривая метрики динамического GPU.
Настройка параллелизма с планированием на уровне этапа
По умолчанию Spark планирует одну задачу на gpu на каждом компьютере. Чтобы увеличить параллелизм, можно использовать планирование на уровне этапа, чтобы сообщить Spark сколько задач выполняться на GPU. Например, если вы хотите, чтобы Spark выполняла две задачи на GPU, можно указать это следующим образом:
from pyspark.resource import TaskResourceRequests, ResourceProfileBuilder
task_requests = TaskResourceRequests().resource("gpu", 0.5)
builder = ResourceProfileBuilder()
resource_profile = builder.require(task_requests).build
rdd = df.withColumn('predictions', loaded_model(struct(*map(col, df.columns)))).rdd.withResources(resource_profile)
Повторное выделение данных для использования всего доступного оборудования
Во-вторых, для повышения производительности используется оборудование в кластере. Как правило, небольшое количество gpu в рабочих группах (для кластеров GPU) или количество ядер в кластере (для кластеров ЦП) хорошо работает. Входной кадр данных уже может иметь достаточно секций, чтобы воспользоваться параллелизмом кластера. Чтобы узнать, сколько секций содержит кадр данных, используйте df.rdd.getNumPartitions()
. С помощью repartitioned_df = df.repartition(desired_partition_count)
кадра данных можно перераспределировать.
Кэширование модели в DBFS или точках подключения
Если вы часто загружаете модель из разных или перезапускаемых кластеров, вы также можете кэшировать модель hugging Face в корневом томе DBFS или на точке подключения. Это может снизить затраты на входящий трафик и сократить время загрузки модели в новом или перезапущенном кластере. Для этого set переменную среды TRANSFORMERS_CACHE
в коде перед загрузкой конвейера.
Например:
import os
os.environ['TRANSFORMERS_CACHE'] = '/dbfs/hugging_face_transformers_cache/'
Кроме того, вы можете добиться аналогичных результатов, заполив модель в MLflow с помощью вкуса transformers
MLflow.
Записная книжка: вывод преобразователей лиц и ведение журнала MLflow
Чтобы get быстро начать работу с примером кода, эта записная книжка является комплексным примером для суммирования текста с помощью инференса конвейеров Hugging Face Transformers и ведения журнала в MLflow.
Обнимая конвейеры преобразователей лиц, вывод записной книжки
Дополнительные ресурсы
Вы можете точно настроить модель распознавания лиц с помощью следующих руководств:
- Подготовка данных для точной настройки моделей распознавания лиц
- Точное определение моделей распознавания лиц для одного GPU
Узнайте больше о том, что обнимать преобразователи лиц?