Зачем, что и когда автоматизировать в машинном обучении

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

Почему автоматизация?

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

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

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

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

Улучшить качество

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

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

Сэкономить время

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

Что автоматизировать?

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

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

1. Код рефакторинга

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

Линтеры
Линтеры помогают обнаруживать в коде проблемы и неприятные запахи, например неправильные отступы или ссылки на неопределенные переменные. Таким образом вы легко заметите любые ошибки заранее. Примеры линтеров: pylint и Flake8. SonarQube также предлагает линтер под названием SonarLint.

Форматирование
В то время как линтеры только указывают на проблемы, но не изменяют код, средства форматирования форматируют код таким образом, чтобы он соответствовал определенным правилам. Это делает ваш код более читаемым для других, поэтому вам будет легче понять код и внести в него свой вклад. Кроме того, обзор кода может сосредоточиться на самой логике, а не на макете. Также можно форматировать текстовые файлы, такие как файлы YAML. Примеры популярных форматеров Python: Black и autopep8.

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

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

Скорее всего, вы будете использовать пакеты Python для решения своей проблемы. Хотя вы можете предположить, что они безопасны в использовании, могут быть некоторые пакеты, которые сами по себе небезопасны. Быстрый взгляд на страницу Github может дать хорошее представление; например, количество сопровождающих и частота обновлений. Кроме того, пакет Безопасность проверяет весь ваш импорт по разрешенному списку.

Линтеры, средства форматирования и пакеты, такие как Pytest и Safety, можно запускать вручную, но, конечно, идея автоматизации состоит в том, чтобы автоматизировать это. Используя git-хуки, вы можете запускать программы форматирования и пакеты перед фиксацией, или вы можете добавить их в конвейер, как описано ниже. Линтеры и форматтеры также можно установить прямо в вашу IDE. В результате ваш процесс непрерывной интеграции (CI) улучшается, когда вы автоматизируете эти задачи, поскольку вы обеспечиваете качество кода в основной ветви кода.

2. Развертывания

Теперь мы поднялись на основание пирамиды, давайте сосредоточимся на среднем слое.

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

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

  1. Определите контекст (например, имя вашего приложения или целевую среду)
  2. Упакуйте код, например, заархивировав его или создав артефакт.
  3. Отправьте код
  4. Создайте приложение в целевой среде, например, распакуйте его или создав контейнер в Kubernetes из исходного кода.

Конечно, выполнение этих задач может быть ручной работой. Однако есть смысл автоматизировать эти повторяющиеся задачи. Автоматизируя развертывание, вы можете непрерывно развертывать (CD) свои приложения. Вы можете автоматизировать развертывание с помощью сценариев с интерфейсом командной строки (CLI) в оболочке, такой как Bash или Powershell. Другой способ - использовать конвейеры.

Создание сценариев
С помощью интерфейса командной строки вы даете команды программам. Написав сценарий, который фиксирует эти команды, вы можете запустить серию задач за один раз. Приятно то, что вы также можете управлять версиями скрипта. Кроме того, журналы можно распечатать на экране или в файл журнала для отслеживания. Bash и Powershell можно использовать для создания каталогов, перемещения файлов, чтения и записи в текстовые файлы и т. Д. Для взаимодействия с программами необходимо использовать соответствующий программный интерфейс командной строки. Вы также можете написать функции Python таким образом, чтобы вы могли вызывать их с входными аргументами, используя argparse. В Makefile можно объединить несколько скриптов.

Ниже показан небольшой пример, демонстрирующий, как развернуть контейнер Docker в облаке AWS с помощью клиента Elastic Beanstalk и Bash. Чтобы получить тот же результат через консоль AWS, мне потребовалось бы 3 минуты нажатия и ввода.

Конвейеры
Конвейеры создаются на основе скриптов. Они добавляют к этим сценариям дополнительные функции, улучшающие процесс развертывания. Конечно, все эти функции имеют свою цену. Это зависит от фактического варианта использования, нужны ли вам конвейеры или достаточно сценариев. Примерами конвейерных инструментов являются Azure Pipelines, AWS CodeBuild и Buildkite. Ниже приводится неполный обзор этих функций:

  1. Они предоставляют графический интерфейс. Так легче увидеть, как выглядит поток; если сборка или развертывание прошли успешно; и каков был результат каждого шага обработки;
  2. Трубопроводы могут запускаться автоматически. Хотя это также можно реализовать с помощью сценариев, конвейеры часто запускаются, когда кто-то объединяется для разработки или основной ветки;
  3. Все сборки регистрируются, поэтому легко увидеть, кто что и когда инициировал;
  4. Имеется управление пользователями, поэтому вы можете, например, ограничить развертывание в производственной среде для некоторых пользователей;
  5. Предыдущие развертывания сохраняются, поэтому вы можете легко вернуться к предыдущему развертыванию, если что-то пойдет не так.

Часто источником кода является репозиторий Git. Определение конвейера также хранится там, или оно может храниться в центральном репозитории кода, если у вас есть несколько конвейеров. Таким образом, вы предотвратите расхождение определений конвейера с течением времени.

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

3. Процесс машинного обучения.

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

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

Эксперименты часто проводятся «в автономном режиме» с подмножеством производственных данных. Возможно, стоит вложить средства в автоматизацию нескольких этапов фазы экспериментов, например, используя AutoML, как описано ниже. С другой стороны, экспериментальные характеристики могут затруднить автоматизацию всего процесса.

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

Вместо этого можно создать микросервис или приложение, используемое для обучения модели, которое можно развернуть, как обсуждалось ранее. То же самое, конечно, относится к сервису, используемому для обслуживания моделей.

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

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

Auto ML
Благодаря контролируемому обучению можно автоматизировать процессы разработки функций и настройки гиперпараметров. С помощью грубой силы в сочетании с умными алгоритмами модель оптимизирована для показателей успеха. Для этого необходимо много пробежек, поэтому здесь может быть полезна специальная тренировочная среда. Примеры инструментов, которые помогут вам в этом: TPOT, Featuretools и auto-sklearn. Также облачные провайдеры предлагают здесь инструменты, такие как Amazon SageMaker Autopilot.

Автоматическая переподготовка
Когда данные статичны, эти процессы разовые. Однако, скорее всего, данные будут меняться со временем (это называется дрейфом данных), что означает, что производительность модели также может со временем ухудшаться. Требуется переобучение моделей, и это нужно автоматизировать. Это также называется непрерывным обучением (CT), имея в виду CI / CD. Часто при автоматическом переподготовке задействуется только настройка гиперпараметров, поскольку создание функций труднее автоматизировать и требует ручной работы. Переподготовку можно запускать вовремя, например, каждую ночь в воскресенье, или с помощью триггера на этапе мониторинга производительности.

Все основные облачные провайдеры предлагают структуры и инструменты для автоматизации, конвейеров и автоматической переподготовки:

  • Google делится своей точкой зрения на MLOps и конвейеры автоматизации в этом блоге.
  • В этом блоге AWS освещает передовой опыт в сфере финансовых услуг, но он также применим и к другим отраслям.
  • Azure обсуждает в этом блоге свой подход к переобучению моделей.

Когда автоматизировать?

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

Я обратился к этому списку критериев, чтобы проверить, следует ли вам автоматизировать задачи, над которыми вы работаете:

  1. Сложность задачи
    Если задача простая, вероятность ошибки при ее выполнении меньше, поэтому необходимость в автоматизации меньше. С другой стороны, когда задача сложная, для ее выполнения, вероятно, потребуется много времени и усилий.
  2. Частота выполнения задачи
    Если вы знаете, что задача запускается только один раз, имеет смысл пропустить этап автоматизации. Однако по моему собственному опыту разработчика, типичная задача редко бывает разовой.
  3. Время и усилия, которые потребуются для автоматизации задачи
    Это больше похоже на компромисс между затратами и выгодой. Каковы затраты на установку автоматизации по сравнению с преимуществами, такими как повышение качества и экономия времени в будущем?

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

Заключение

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

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

Хочу поблагодарить своих коллег Себастьяна Канделя, Joost de Theije и Юлию Суботнюю за их отзывы и вдохновение.