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

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

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

Далее я объясню, как я использую git python, mlFlow и облачного провайдера для решения этих проблем. Этот метод пытается реализовать концепции MLOps, такие как управление версиями модели, практичным и автоматизированным способом.

Зафиксируйте обработку данных в каждом эксперименте

При разработке моделей машинного обучения я часто был перегружен информацией, которую хотел записать. Поэтому я решил сохранить все! И у нас уже есть подходящий инструмент для совместной работы: git. Единственное, что вам нужно сделать, это автоматизировать управление версиями каждый раз, когда вы начинаете новый опыт.

Для этого я использую git python. Сначала вы должны создать объект репозитория для взаимодействия с вашим инструментом управления версиями.

repo = git.Repo(gitwd)

Затем вам просто нужно зафиксировать свои изменения при выполнении кода.

commit_code(repo, f"exp(preprocess): timestamp={ts}")

Я предлагаю выбрать сообщение коммита, содержащее уникальный идентификатор для отслеживания ваших данных. Здесь я выбрал простую метку времени (ts). Данные также сохраняются в хранилище или базе данных с использованием того же идентификатора, поэтому, когда вы захотите воспроизвести свой эксперимент, вы можете либо снова предварительно обработать свои данные, либо использовать предварительно обработанные данные, точно зная, какое преобразование вы выступили.

local_file_name = f"{ts}_{key}.csv"

Автоматизируйте фиксацию всего процесса обучения

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

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

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

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

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

Вот почему я предлагаю не избавляться от блокнотов, а использовать их на этапах исследования и/или отладки модели. Можно использовать jupytext, который преобразует вашу записную книжку в сценарий, чтобы его можно было легко версионировать.

Работайте совместно, используя таблицу лидеров и ответвления для каждой задачи

Вы можете использовать управление версиями mlflow с облачным провайдером, таким как Azure, чтобы отслеживать свои показатели в таблице лидеров, доступной для вашей команды. Если вы хотите получить код, соответствующий лучшей модели, вам просто нужно изучить эксперимент в пользовательском интерфейсе mlflow, получить идентификатор запуска и найти этот идентификатор в сообщениях фиксации. Используя этот инструмент, вы сможете делиться результатами с другими членами команды и более эффективно сотрудничать.

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

Заключение

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

Второй пример из тысячи, который может прийти на ум, — это когда вы имеете дело с моделями глубокого обучения со сложной структурой. Опять же, кучи настроек будет недостаточно, чтобы воспроизвести весь эксперимент. Это особенно верно при использовании цикла обучения, такого как для GAN, или при использовании специального модуля, такого как STN (сеть пространственного преобразователя).

Вот почему я разработал базовую версию оболочки, чтобы иметь возможность выполнять автоматическое и совместное управление версиями, как описано выше. Работа так же проста, как декоратор, добавленный к основным функциям предварительной обработки и обучения.

Вы можете найти код на моем github: https://github.com/JJublanc/mlops_versioning

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

Иллюстрации

Фото :

Иконки:

  • Код создан IconKarma с сайта flaticon.com
  • Папка, созданная freepik с flaticon.com
  • CSV, созданный iconixar с сайта flaticon.com