Поделиться через


Вывод модели с помощью преобразователей распознавания лиц для NLP

В этой статье показано, как использовать преобразователи распознавания лиц для обработки естественного языка (NLP) модели.

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

Требования

  • MLflow 2.3
  • Любой кластер с установленной библиотекой распознавания лиц transformers Hugging можно использовать для пакетного вывода. Библиотека transformers предустановлена в Databricks Runtime 10.4 LTS ML и выше. Многие популярные модели NLP лучше всего работают на оборудовании GPU, поэтому вы можете получить лучшую производительность с помощью недавнего оборудования 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 Если они доступны в кластере, эти графические процессоры используются таким образом.

Конвейеры распознавания лиц для перевода возвращают список объектов Python dict с одним ключом translation_text и значением, содержащим переведенный текст. Этот UDF извлекает перевод из результатов, чтобы вернуть ряд Pandas только с переведенным текстом. Если конвейер создан для использования графических процессоров, задав параметр device=0, Spark автоматически переназначает графические процессоры на рабочих узлах, если в кластере есть экземпляры с несколькими GPU.

Чтобы использовать UDF для перевода текстового столбца, можно вызвать 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, вы также можете возвращать более структурированные выходные данные. Например, в распознавании именованных сущностей конвейеры возвращают список dict объектов, содержащих сущность, его диапазон, тип и связанную оценку. Аналогично примеру перевода, возвращаемый тип заметки @pandas_udf является более сложным в случае распознавания именованных сущностей.

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

В этом примере используйте следующий код:

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, просматривая метрики динамического кластера для кластера и выбрав метрику, например gpu0-util для использования процессора GPU или gpu0_mem_util использования памяти 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 или на точке подключения. Это может снизить затраты на входящий трафик и сократить время загрузки модели в новом или перезапущенном кластере. Для этого задайте TRANSFORMERS_CACHE переменную среды в коде перед загрузкой конвейера.

Например:

import os
os.environ['TRANSFORMERS_CACHE'] = '/dbfs/hugging_face_transformers_cache/'

Кроме того, вы можете добиться аналогичных результатов, заполив модель в MLflow с помощью вкуса MLflowtransformers.

Записная книжка: вывод преобразователей лиц и ведение журнала MLflow

Чтобы быстро приступить к работе с примером кода, эта записная книжка является комплексным примером для суммирования текста с помощью конвейеров hugging Face Transformers вывода и ведения журнала MLflow.

Обнимая конвейеры преобразователей лиц, вывод записной книжки

Получить записную книжку

Дополнительные ресурсы

Вы можете точно настроить модель распознавания лиц с помощью следующих руководств:

Узнайте больше о том, что обнимать преобразователи лиц?