Авторы: Адитья Правин, Мария Лара Куэрво

Целевая аудитория

Этот пост предназначен для специалистов по данным и специалистов по машинному обучению, имеющих предыдущие знания (любые) в области глубокого обучения и нейронных сетей. Мы не будем рассказывать о том, как работают нейронные сети, а также о различных алгоритмах и архитектурах глубокого обучения. Если вы хотите сначала ознакомиться с этими концепциями, мы рекомендуем Серию нейронных сетей Дэвида Фумо или, если у вас есть время, Введение видео на YouTube Гранта Сандерсона.

Что такое Людвиг?

Нет, это не ютубер. Ludwig, о котором мы говорим, — это набор инструментов глубокого обучения (DL) без кода с открытым исходным кодом, который позволяет быстро создавать и тестировать модели глубокого обучения. Это позволяет как новичкам, так и опытным практикам создавать и использовать модели глубокого обучения в производстве. Разработанный научным сотрудником Стэнфордского университета Пьеро Молино, Ludwig использует TensorFlow под капотом и используется такими технологическими гигантами, как Uber и Apple. А поскольку он не содержит кода, вам не нужно знать TensorFlow, чтобы начать работу с Ludwig, так как для запуска требуется только один файл конфигурации.

В последних выпусках библиотека расширила свое обещание без кода, интегрировавшись с несколькими утилитами ML, такими как Ray (обучение крупномасштабной распределенной модели), Weights and Biases (отслеживание экспериментов ML), TabNet (современный DL для табличных данных) и многое другое, что делает Ludwig намного более мощным, создавая более универсальную экосистему построения моделей.

Почему Людвиг такой особенный?

Его коллекция кодировщиков и декодеров иллюстрирует фактор крутости Людвига — оказывается, что несколько востребованных и полезных вариантов использования ML можно абстрагировать в парадигму «кодировщик-декодер». В этом суть Людвига.

Объедините это с, ну, ммм… «объединителем», и вы получите довольно мощный набор инструментов для построения моделей глубокого обучения. Не верите нам? Вот несколько примеров:

  • Начнем с простого. Допустим, вы хотите создать классификатор I mage Classifier для своего инновационного стартапа в области электронной коммерции. Это так же просто, как соединить кодировщик изображения Людвига с декодером категории.
  • Хотите создать Модель субтитров к изображениям, чтобы улучшить систему поиска изображений вашей компании? Что ж, просто подключите кодировщик stacked_cnn (изображение) к декодеру lstm (текст).
  • Чувствуете себя немного мультимодальным? Объедините кодировщики parallel_cnn (текст) и stacked_cnn (изображение) с декодером lstm (текст) — вы только что построили Систему визуальных ответов на вопросы!

Так много возможностей. Эта архитектура «Кодировщики-объединители-декодеры» (ECD) является основой Ludwig.

Сценарий: прототип рекомендательных моделей для потоковой передачи фильмов

Хорошо, теперь, когда мы раскрутили Ludwig, давайте посмотрим на него в действии в контексте потоковой передачи фильмов, в частности, прогнозирования рейтинга фильмов. Допустим, вы инженер по искусственному интеллекту в компании, занимающейся потоковым вещанием фильмов (возможно, конкуренте Netflix). Вам поручено протестировать различные модели глубокого обучения, которые предсказывают, какую оценку фильму поставит зритель. Ваше время драгоценно, и вы не хотите застревать в обработке данных и хотите быстро найти лучшие модели глубокого обучения. И поэтому вы обращаетесь к Людвигу.

В этом разделе мы увидим, как легко перейти от фазы «идея» к «фазе обучения модели» с помощью Ludwig.

Монтаж

Примечание. Людвиг требует, чтобы вы использовали Python 3.6+.

Во-первых, вы можете создать изолированную среду, чтобы избежать конфликта между зависимостями. Для этого вы можете запустить следующие команды:

# To create the environment
python -m venv venv
# To activate (on Windows)
venv\\Scripts\\activate.bat
# To activate (on Unix or MacOS)
source venv/bin/activate

Затем вы можете установить Ludwig, запустив:

# To install Ludwig's basic requirements.
pip install ludwig

Приведенная выше команда установит только основные требования Ludwig. Однако мы будем использовать возможности ECD Ludwig для предварительной обработки различных типов объектов по мере продвижения вперед. Для этого Ludwig разделил свои зависимости, чтобы установить только то, что нам нужно. Поэтому также запустите:

# For text dependencies
pip install ludwig[text]

Данные

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

Колонка overview содержит краткое описание сюжета фильма.

Конфигурационный файл

Как мы уже говорили, все, что вам нужно для запуска Ludwig, — это файл конфигурации. Конфигурационный файл представляет собой словарь, содержащий следующие ключи:

input_features: []
combiner: {}
output_features: []
training: {}
preprocessing: {}

Вы можете предоставить его либо в виде строки, либо в виде файла YAML. Наконец, требуются только параметры input_features и output_features; другие имеют разумные значения по умолчанию, которые более опытные пользователи могут настроить в соответствии со своими потребностями. Дополнительную информацию можно найти в документации.

Простая модель рекомендации фильмов

Есть две основные команды: train и experiment. Последний объединяет обучение и оценку в единую команду. Кроме того, вы можете выполнить перекрестную проверку, используя параметр --k_fold. Теперь давайте попробуем.

ludwig experiment 
	--experiment_name simple_with_defaults
	--dataset .\\data\\ratings_sample.csv
	--config "{input_features: [{name: user_id, type: category}, {name: movie_id, type: category}], output_features: [{name: rating, type: numerical}]}"

Приведенная выше команда experiment будет:

  • Разделите данные на наборы для обучения, проверки и тестирования (которые будут сохранены в ./data/).
  • Обучите модель на обучающих данных, применяя перекрестную проверку.
  • Подтвердить набор проверки (для ранней остановки) и
  • Предсказать с помощью тестового набора.

Кроме того, обратите внимание, что для каждой функции ввода/вывода необходимо указать name (в наборе данных) и данные type, чтобы Людвиг мог автоматически решить, какой кодировщик/декодер использовать. Наконец, по умолчанию он будет использовать 100 эпох для обучения и 5 эпох терпения без улучшения меры проверки перед остановкой обучения (параметр early_stop).

После завершения обучения он создаст папку ./results для хранения метаданных модели и весов для последующего вывода.

Визуализация результатов модели

Еще одна замечательная особенность Ludwig заключается в том, что он имеет встроенные стандартные визуализации для понимания производительности модели и сравнения ее прогнозов с другими экспериментами. Мы можем построить график эффективности обучения модели с течением времени (кривые обучения), используя команду:

ludwig visualize 
	--visualization learning_curves 
	--output_feature_name rating 
	--training_statistics results/simple_with_defaults_run/training_statistics.json

Обратите внимание, что файл training_statistics.json сохраняется в папке ./results после завершения обучения. Приведенная выше команда даст вам следующую визуализацию:

Доступны и другие визуализации, которые вы можете проверить в документации.

Получение прогнозов

Наконец, чтобы предсказать, вы можете просто использовать приведенную ниже команду, которая сохранит новый файл CSV в папке вашей модели (./results/experiment_run) с именем ratings_predictions.csv:

ludwig predict 
	--dataset .\\data\\ratings_sample.test.hdf5 
	--model_path .\\results\\simple_with_defaults_run\\model\\

Обратите внимание, что мы используем тестовый файл HDF5, написанный Людвигом во время обучения в ./data/.

Использование встроенных энкодеров Ludwig для более сложных моделей

Ранее мы видели, как быстро и легко можно обучить нейронную сеть с помощью TensorFlow, не обязательно зная, как использовать фреймворк и определяя архитектуру сети. Однако вы можете указать более подробную конфигурацию файла, чтобы использовать возможности ECD Ludwig.

Здесь вы можете загрузить файл YAML, который мы будем использовать для нашего второго эксперимента, который использует все доступные функции в наборе данных и указывает предварительно обученный кодировщик BERT для столбца overview. Поскольку в этом эксперименте мы будем более требовательны к вычислительным ресурсам, мы также ограничим количество эпох до 10 вместо 100 (в файле конфигурации). Мы назовем этот второй эксперимент bert_encoder.

ВАЖНО: запуск каждой эпохи занимает около 15 минут в зависимости от вашего компьютера.

ludwig experiment 
--experiment_name bert_encoder 
--dataset ./data/ratings_sample.csv 
--config_file config.yml

Обслуживание в производственной среде

Людвиг также предоставляет команду для загрузки предварительно обученной модели и ее обслуживания на HTTP-сервере. Команда автоматически создаст REST API с использованием библиотеки FastAPI с двумя конечными точками: /predict и /predict_bath.

# Install serving dependencies
pip install ludwig[serve]
# Run the API
ludwig serve \\
--host "localhost" --port 8080 \\
--model_path .\\results\\simple_with_defaults_run\\model\\

После выполнения приведенной выше команды вы должны увидеть что-то вроде:

INFO:     Started server process [34976]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on <http://localhost:8080> (Press CTRL+C to quit)

На изображении ниже вы можете увидеть ответ сервера после передачи двух обязательных параметров (user_id и movie_id):

Сильные стороны и ограничения

Плюсы

  • Вы можете сосредоточиться на построении модели; Людвиг управляет обработкой данных и настройкой обучения.
  • Легко тестировать различные идеи модели быстро
  • Несмотря на отсутствие кода, Ludwig легко настраивается в соответствии с вашим вариантом использования — как с точки зрения данных, так и с точки зрения конфигурации модели.

Минусы

  • Текущее состояние архитектуры ECD Людвига не поддерживает такие модели, как генеративно-состязательные сети (GAN) и обучение с подкреплением (RL). Они говорят, что поддержка GAN включена в их дорожную карту для будущего выпуска.
  • На данный момент он не поддерживает такие функции, как видео и графики (что было бы важно, поскольку популярность графовых нейронных сетей растет).

Заключение

Ludwig — это очень универсальный инструмент, который позволяет специалистам по данным и специалистам по машинному обучению обучать и тестировать различные нейронные сети с помощью TensorFlow с помощью всего нескольких команд. Архитектура Encoders-Combiners-Decoders предоставляет расширяемый инструментарий, подходящий для многих приложений, с разумными и предварительно настроенными гиперпараметрами. Кроме того, поскольку Людвиг сохраняет метаданные каждой модели, специалисты по данным могут легко отслеживать свои эксперименты и использовать встроенные визуализации для выбора архитектуры модели, которая лучше всего соответствует их потребностям. Наконец, предоставляя «обслуживающую» команду, Ludwig также оказывается подходящей альтернативой для производственных сред. Благодаря этим возможностям крупные технологические компании используют Ludwig для упрощения реализации алгоритмов глубокого обучения.