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


Выполнение пакетного инференса с использованием Spark DataFrame

В этой статье описывается, как выполнять пакетный вывод данных из кадра данных Spark с использованием зарегистрированной модели в Databricks. Рабочий процесс применяется к различным моделям машинного обучения и глубокого обучения, включая TensorFlow, PyTorch и scikit-learn. Она включает рекомендации по загрузке данных, выводу модели и настройке производительности.

Для вывода модели для приложений глубокого обучения Azure Databricks рекомендует использовать следующий рабочий процесс. Примеры ноутбуков, использующих TensorFlow и PyTorch, см. в разделе с примерами пакетного вывода.

Рабочий процесс вывода модели

Databricks рекомендует следующий рабочий процесс для выполнения пакетного прогнозирования с помощью Spark DataFrame.

Шаг 1. Настройка среды

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

requirements_path = os.path.join(local_path, "requirements.txt")
if not os.path.exists(requirements_path):
    dbutils.fs.put("file:" + requirements_path, "", True)

%pip install -r $requirements_path
%restart_python

Шаг 2. Загрузка данных в датафреймы Spark

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

Тип данных Метод
Таблица из каталога Unity (рекомендуется) table = spark.table(input_table_name)
Файлы изображений (JPG, PNG) files_df = spark.createDataFrame(map(lambda path: (path,), file_paths), ["path"])
TFRecords df = spark.read.format("tfrecords").load(image_path)
Другие форматы (Parquet, CSV, JSON, JDBC) Загрузка с помощью источников данных Spark.

Шаг 3. Загрузка модели из реестра моделей

В этом примере для вывода используется модель из реестра моделей Databricks.

predict_udf = mlflow.pyfunc.spark_udf(spark, model_uri)

Шаг 4. Выполнение инференса модели с помощью пользовательских функций pandas UDF.

Пользовательские функции Pandas используют Apache Arrow для эффективной передачи данных и библиотеку Pandas для обработки. Ниже приведены типичные шаги для вывода с помощью UDF pandas:

  1. Загрузите обученную модель: используйте MLflow для создания UDF Spark для вывода.
  2. Предварительная обработка входных данных: убедитесь, что входная схема соответствует требованиям модели.
  3. Запустите прогноз модели: используйте функцию UDF модели на DataFrame.
df_result = df_spark.withColumn("prediction", predict_udf(*df_spark.columns))
  1. (Рекомендуется) Сохраните прогнозы в каталоге Unity.

В следующем примере прогнозы сохраняются в каталоге Unity.

df_result.write.mode("overwrite").saveAsTable(output_table)

Настройка производительности для вывода модели

В этом разделе приведены некоторые советы по отладке и настройке производительности для вывода модели в Azure Databricks. Обзор см. в статье Выполнение пакетного вывода с помощью кадра данных Spark.

Обычно в выводе модели есть две основные части: конвейер ввода данных и вывод модели. Конвейер ввода данных сильно зависит от ввода-вывода данных, а инференция модели требует больших вычислительных ресурсов. Определение узких мест рабочего процесса просто. Ниже приведены некоторые подходы.

  • Уменьшите модель до тривиальной модели и измеряйте примеры в секунду. Если разница времени от начала до конца между полной моделью и тривиальной моделью минимальна, то конвейер ввода данных, скорее всего, является узким местом, в противном случае инференс модели является узким местом.
  • Если вывод модели выполняется с GPU, проверьте использование GPU метрики. Если загрузка GPU не постоянно высока, то конвейер ввода данных может быть узким местом.

Оптимизация конвейера ввода данных

Использование графических процессоров может эффективно оптимизировать скорость выполнения для вывода модели. Так как графические процессоры и другие акселераторы становятся быстрее, важно, чтобы конвейер ввода данных соответствовал спросу. Конвейер ввода данных считывает данные в фреймы данных Spark, преобразует их и загружает их в качестве входных данных для вывода модели. Если входные данные являются узким местом, ниже приведены некоторые советы по увеличению пропускной способности ввода-вывода:

  • Задайте максимальные записи для каждого пакета. Большее количество максимальных записей может снизить нагрузку на ввод-вывод для вызова функции UDF до тех пор, пока записи могут помещаться в память. Чтобы задать размер пакета, задайте следующую конфигурацию:

    spark.conf.set("spark.sql.execution.arrow.maxRecordsPerBatch", "5000")
    
  • Загрузите данные в пакетах и предзагрузите их при предварительной обработке входных данных в UDF pandas.

    Для TensorFlow Azure Databricks рекомендует использовать API tf.data. Вы можете параллельно проанализировать карту, задав num_parallel_calls в функции map и вызове prefetch и batch для предварительной выборки и пакетной обработки.

    dataset.map(parse_example, num_parallel_calls=num_process).prefetch(prefetch_size).batch(batch_size)
    

    Для PyTorch Azure Databricks рекомендует использовать класс DataLoader . Вы можете задать batch_size для пакетной обработки и num_workers для параллельной загрузки данных.

    torch.utils.data.DataLoader(images, batch_size=batch_size, num_workers=num_process)
    

Примеры пакетного вывода

Примеры в этом разделе соответствуют рекомендуемому рабочему процессу вывода при углубленном обучении. В этих примерах показано, как выполнить вывод модели с помощью предварительно обученной модели нейронной сети с глубокими остаточными сетями (ResNets).

Структурированное извлечение данных и пакетный инференс с помощью UDF Spark

В следующем примере записной книжки демонстрируется разработка, ведение журнала и оценка простого агента для структурированного извлечения данных для преобразования необработанных, неструктурированных данных в упорядоченные, используемые сведения с помощью методов автоматического извлечения. Этот подход демонстрирует, как реализовать пользовательские агенты для пакетного вывода с помощью класса PythonModel MLflow и использовать модель агента, зарегистрированную в журнале, как функцию Spark User-Defined (UDF). В этой записной книжке также показано, как использовать оценку агента Mosaic AI для оценки точности с использованием эталонных данных.

Структурированное извлечение данных и пакетный инференс с помощью UDF Spark

Получите ноутбук