Выпуск aimlflow вызвал любопытство пользователей, инструмента, который облегчает интеграцию мощного пользовательского интерфейса Aim для отслеживания экспериментов с журналами MLflow.

Возникает вопрос, зачем нам нужен aimlflow или зачем нам нужно просматривать отслеживаемые журналы MLflow на Aim. Ответ заключается в том, что Aim предоставляет высокоэффективный пользовательский интерфейс, открывающий потенциал для получения ценной информации.

В этом сообщении блога мы рассмотрим нулевую задачу межъязыкового переноса в НЛП, а затем отслеживаем метаданные, используя как Aim, так и MLflow. Наконец, мы попытаемся получить важные наблюдения из наших экспериментов, используя их соответствующие пользовательские интерфейсы.

Настройка задачи

Задача, которую мы будем решать в этом направлении, — межъязыковая передача с нулевым выстрелом. Межъязыковой перенос с нулевым выстрелом относится к методу машинного обучения, при котором модель обучается на одном языке, но способна хорошо работать на другом языке без какой-либо дополнительной тонкой настройки. Это означает, что модель имеет возможность обобщать свое понимание задачи на разных языках без необходимости в дополнительных обучающих данных.

В частности, мы будем обучать модель задачи вывода на естественном языке (NLI) на наборе данных английского языка, а затем классифицировать метку данного образца, написанного на другом языке, без дополнительного обучения. Этот подход полезен в ситуациях, когда размеченных данных мало на одних языках и много на других.

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

В нашем эксперименте мы рассмотрим две техники:

  • Тонкая настройка всей предварительно обученной многоязычной языковой модели. Настройка весов сети для решения поставленной задачи классификации, возобновление обучения с последнего состояния предварительно обученной модели.
  • Извлечение признаков, которое относится к прикреплению заголовка классификации поверх предварительно обученной языковой модели и обучению только этой части сети.

В обоих методах мы проведем обучение, используя подмножество en набора данных XNLI. После этого мы проведем оценку нашего оценочного набора, состоящего из шести языковых подмножеств из набора данных XNLI, включая английский (en), немецкий (de), французский (fr), испанский (es), китайский (zh) и арабский. (ar).

Наборы данных

Мы будем использовать набор данных XNLI (многоязычный NLI), который представляет собой подборку из нескольких тысяч примеров из набора данных MNLI (многоязычный NLI), переведенных на 14 различных языков, включая некоторые из них с ограниченными ресурсами.

Шаблон задачи NLI выглядит следующим образом. Имея пару предложений, premise и hypothesis должны определить, является ли hypothesis истинным (заключение), ложным (противоречие) или неопределенным (нейтральным) с учетом premise.

Давайте посмотрим на несколько примеров, чтобы понять это. Скажем, данная гипотеза Issues in Data Synthesis., а предпосылка Problems in data synthesis.. Теперь есть 3 варианта, влечет ли эта гипотеза посылку, противоречит или является нейтральной. В этой паре предложений очевидно, что ответом является следствие, потому что слова «проблемы» и «проблемы» являются синонимами, а термин «синтез данных» остается прежним.

Другой пример нейтральной пары предложений на этот раз следующий: гипотеза She was so happy she couldn't stop smiling., а посылка She smiled back.. Первое предложение не подразумевает второе, но и не противоречит ему. Таким образом, они нейтральны.

Пример противоречия. Гипотеза “The analysis proves that there is no link between PM and bronchitis.” и предпосылка This analysis pooled estimates from these two studies to develop a C-R function linking PM to chronic bronchitis.. В гипотезе утверждается, что анализ показывает отсутствие связи между двумя биологическими терминами. Между тем, посылка утверждает обратное, что анализ объединил два исследования, чтобы показать, что между двумя терминами существует связь.

Дополнительные примеры см. на странице наборов данных HuggingFace от Streamlit: https://huggingface.co/datasets/viewer/.

Модели

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

Мы загрузим каждую модель с ее весами последнего состояния и продолжим обучение всей сети (тонкая настройка) или только головы классификации (извлечение признаков) из этого состояния. Все упомянутые модели обучаются с целью моделирования маскированного языка (MLM).

Настройка среды обучения

Прежде чем начать, важно иметь в виду, что конечная структура нашего каталога будет выглядеть следующим образом:

aim-and-mlflow-usecase
├── logs
│   ├── aim_callback
│   │   └── .aim
│   ├── aimlflow
│   │   └── .aim
│   ├── checkpoints
│   └── mlruns
└── main.py

Давайте начнем с создания основного каталога, мы назвали его aim-and-mlflow-usecase, вы можете просто назвать все, что хотите. После чего нам нужно скачать main.py из следующего источника: https://github.com/aimhubio/aimlflow/tree/main/examples/cross-lingual-transfer. Объяснение кода и пример использования можно найти в файле README.md каталога. Мы будем использовать этот скрипт для проведения наших экспериментов.

Каталог logs, как следует из названия, хранит журналы. В папке checkpoints будут сохранены все состояния модели. mlruns — это репозиторий для экспериментов MLflow. aim_callback будет хранить репозиторий прогонов Aim, отслеживаемых с помощью встроенного обратного вызова Aim для Hugging Face Transformers, а aimlflow будет хранить прогоны, преобразованные из MLflow с помощью инструмента aimlflow.

Важно иметь в виду, что из-за ограниченных вычислительных ресурсов мы решили использовать только 15 000 выборок обучающего набора данных и будем обучать всего 3 эпохи с размером пакета 8. Следовательно, полученные результаты может быть не оптимальным. Тем не менее цель этого варианта использования — не достижение наилучших возможных результатов, а скорее демонстрация преимуществ использования как Aim, так и MLflow.

Чтобы начать процесс обучения, мы будем использовать следующую команду. Но сначала давайте перейдем в каталог, где находится наш скрипт (в нашем случае aim-and-mlflow-usecase).

python main.py feature-extraction \
    --model-names bert-base-multilingual-cased bert-base-multilingual-uncased xlm-roberta-base distilbert-base-multilingual-cased \
    --eval-datasets-names en de fr es ar zh \
    --output-dir {PATH_TO}/logs

Где {PATH_TO} — абсолютный путь к каталогу aim-and-mlflow-usecase. В этой конкретной команде мы используем метод извлечения признаков для 4 предварительно обученных моделей и проверяем 6 языков набора данных XNLI. Параллельно или после завершения первого процесса мы можем запустить ту же команду на этот раз, используя технику тонкой настройки:

python main.py fine-tune \
    --model-names bert-base-multilingual-cased bert-base-multilingual-uncased xlm-roberta-base distilbert-base-multilingual-cased \
    --eval-datasets-names en de fr es ar zh \
    --output-dir {PATH_TO}/logs

Иди перекуси, тренировки занимают некоторое время 🍫 ☺️.

Использование прицельного потока

Между тем, может возникнуть вопрос, почему мы отслеживаем результаты эксперимента с помощью MLflow и Aim. Мы могли бы просто отслеживать метрики через MLflow и использовать aimlflow для простого преобразования и просмотра наших экспериментов в реальном времени на Aim. Давайте сначала покажем, как это можно сделать, а затем займемся вопросом.

Установите aimlflow на свой компьютер через pip, если он еще не установлен:

$ pip install aimlflow
$ aimlflow sync --mlflow-tracking-uri=logs/mlruns --aim-repo=logs/aimlflow/.aim

Эта команда начнет преобразование всех гиперпараметров, метрик и артефактов эксперимента из MLflow в Aim и будет постоянно обновлять базу данных новыми запусками каждые 10 секунд.

Подробнее о том, как можно настроить aimlflow для локальных и удаленных экспериментов MLflow, можно найти в этих двух сообщениях блога соответственно:

Это один из возможных подходов, но для улучшения пользовательского интерфейса мы предлагаем использовать встроенный в Aim обратный вызов aim.hugging_face.AimCallback, специально разработанный для transformers.Trainer. Он отслеживает широкий спектр информации, включая сведения об окружении, пакеты и их версии, загрузку процессора и графического процессора и многое другое.

Раскрытие возможностей анализа данных

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

$ mlflow ui
$ aim up

Обратите внимание, что для получения наилучших результатов в этой демонстрации мы будем использовать репозиторий aim_callback/.aim, так как он имеет более глубокую интеграцию с Trainer.

Пользовательские интерфейсы MLflow и Aim будут доступны по умолчанию на портах 5000 и 43800 соответственно. Вы можете получить доступ к домашним страницам каждого инструмента, посетив http://127.0.0.1:5000 для MLflow и http://127.0.0.1:43800 для Aim.

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

Выбрав все эксперименты, перейдите на страницу сравнения, нажав кнопку Compare.

В разделе Run details представлены метаданные запуска, включая время начала и окончания, а также продолжительность запуска. В разделе Parameters отображаются гиперпараметры, используемые для запуска, такие как оптимизатор и архитектура. В разделе Metrics показаны последние значения для каждой метрики.

Иметь доступ ко всей этой информации — это здорово, но что, если мы хотим изучить эволюцию метрик с течением времени, чтобы получить представление о наших процессах обучения и оценки? К сожалению, MLflow не предлагает эту функциональность. Тем не менее, Aim предоставляет его в наших интересах.

Чтобы организовать параметры в значимые группы для нашего эксперимента, просто перейдите на страницу Aim Metrics Explorer и выполните несколько простых шагов:

Получение информации

Давайте рассмотрим диаграммы более внимательно и выясним ценные выводы из наших экспериментов.

Беглый просмотр графиков позволяет сделать следующие выводы:

  • Метод тонкой настройки явно превосходит извлечение признаков с точки зрения точности и потерь, о чем свидетельствует сравнение максимальных и минимальных результатов на диаграммах 1 и 3, а также диаграммах 2 и 4 соответственно.
  • Графики для извлечения признаков показывают значительные колебания в зависимости от языка, тогда как результаты тонкой настройки сильно различаются в зависимости от изменений в модели. Чтобы определить степень вариации, мы можем консолидировать метрики, удалив группировку по языку (цвет) или модели (штрих) соответственно. В этом случае мы сохраним группировку по названию модели, чтобы изучить вариант каждой модели для данной техники.

  • Несмотря на то, что мы обучили только одну модель с большим размером пакета (16 вместо 8 по умолчанию), все же полезно изучить тенденцию. Для этого мы удалим группировку по названию модели и сгруппируем только по train_batch_size. Как мы видим, уже после 2500 шагов наблюдается тенденция к уменьшению потерь и увеличению точности более быстрыми темпами. Таким образом, стоит рассмотреть возможность обучения с большими размерами пакетов.

  • Диаграммы безошибочно показывают, что модель bert-base-multilingual-cased достигла наилучших результатов точности, при этом наивысший балл наблюдался для подмножества en, поскольку модель была обучена на этом подмножестве. Затем последовали es, fr, de, zh и ar. Неудивительно, что оценки для наборов данных zh и ar были ниже, учитывая, что они принадлежат к разным лингвистическим семействам и обладают уникальным синтаксисом.

  • Давайте рассмотрим время обучения и эффективность. Установив ось X для выравнивания относительного времени, а не шагов по умолчанию, мы наблюдаем, что окончательная точка отслеживания метода тонкой настройки заняла почти на 25% больше времени по сравнению с методом извлечения признаков.

  • Можно продолжить анализ после обучения с большими размерами пакетов и большим количеством вариаций скорости обучения, моделей и т. д. Затем Parameter Explorer поможет представить сложные многоуровневые данные в визуально привлекательном многомерном формате. Чтобы продемонстрировать, как работает Parameter Explorer, давайте выберем следующие параметры: train_batch_size, learning_rate, _name_or_path, loss и точность sub_datasets. Следующий график будет наблюдаться после нажатия кнопки Search. Отсюда мы можем видеть, что прогон, который привел к наивысшей точности для всех подмножеств, имеет окончательное значение потерь, равное 0,6, использует модель bert-base-multilingual-cased с 5·10⁻⁵ learning_rate, а batch_size равно 8.

Принимая во внимание вышеупомянутые идеи, мы можем перейти к будущим экспериментам. Стоит отметить, что хотя точная настройка результатов улучшила показатели точности, она требует немного большего времени обучения. Ожидается, что увеличение размера партии и обучение более длинным шагам/эпохам еще больше улучшит результаты. Кроме того, точная настройка других гиперпараметров, таких как скорость обучения, снижение веса и отсев, сделает эксперименты более разнообразными и может привести к еще лучшим результатам.

Заключение

В этом сообщении в блоге показано, как решить задачу НЛП, а именно нулевую межъязыковую передачу при отслеживании метрик выполнения и гиперпараметров с помощью MLflow, а затем использовать мощный пользовательский интерфейс Aim для получения ценной информации из экспериментов.

Мы также продемонстрировали, как использовать aimlfow, вызвавший интерес у пользователей, в качестве инструмента, который органично интегрирует пользовательский интерфейс Aim для отслеживания экспериментов с журналами MLflow.