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

В современном связанном мире машинное обучение (МО), искусственный интеллект (ИИ) и DevOps формируют то, как мы учимся, работаем и общаемся. DevOps объединяет работу команд разработки и эксплуатации, в то время как машинное обучение, глубокое обучение (ГО) и ИИ обрабатывают данные для получения эффективных результатов в виде моделей, которые могут предсказывать будущие тенденции на основе текущих данных. Интеграция этих технологий может ускорить развертывание моделей машинного обучения в производстве в больших масштабах. Основываясь на этой концепции, я разработал небольшую систему, которая демонстрирует эффект автоматизации обучения моделей машинного обучения с использованием Git, Jenkins и Docker. В приведенном ниже объяснении я сосредоточился на автоматизации моделей ML и DL, а не на установке Git, Docker и Jenkins.

Автоматизация моделей ML/DL может выполняться в три основных этапа:

  1. Создайте модели ML и DL.
  2. Создайте образы контейнеров Docker для обучения соответствующих моделей ML и DL с помощью Dockerfile.
  3. Настройка заданий Jenkins для выполнения следующих действий:
  • Задание 1. Перетащите содержимое из репозитория GitHub в локальную хост-систему.
  • Задание 2. Запустите правильные контейнеры Docker для каждой модели.
  • Работа 3: Запустите файл .py моделей в соответствующих контейнерах и найдите точность. Если точность меньше определенного предела, необходимо изменить гиперпараметры модели и переобучить модель, чтобы обеспечить более высокую точность.
  • Задание 4. Отслеживайте контейнеры Docker и отправляйте сообщение об ошибке, если есть проблема с запущенными контейнерами.

Я разработал эту настройку с базовой системой, работающей на Windows, с ОС RHEL8, работающей на Oracle VirtualBox. И Jenkins, и Docker установлены на RHEL8, и автоматизация также была почти полностью выполнена на RHEL8.

Во-первых, мы создаем модели машинного обучения. Чтобы показать разнообразие, я создал две модели: одна ориентирована на реализацию нейронных сетей, а другая — на реализацию стандартной логистической регрессии. Код для моделей и соответствующие наборы данных, используемые для каждой модели, можно найти в моем GitHub Repository. Git играет здесь важную роль, поскольку формирует основу для интеграции вашего локального репозитория с удаленным репозиторием на GitHub. После создания моделей мы можем перейти к созданию контейнеров Docker, на которых мы можем обучать модели.

Далее мы создаем Dockerfiles для контейнеров Docker. Как правило, мы можем найти множество образов контейнеров в онлайн-репозитории на https://hub.docker.com/, но для наших целей нам нужна более адаптированная версия. Для каждого Dockerfile мы делаем следующее:

  1. Создайте рабочую область для каждого контейнера Docker в командной строке RHEL8 из корня. Например -
# mkdir dl_docker
# cd dl_docker
# gedit Dockerfile

На следующем изображении показано содержимое, которое мы заполняем в Dockerfile для моделей DL.

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

# docker build -t <image_name>:<version> <filepath>

3. Как только образ контейнера будет успешно создан, мы можем запускать контейнеры по мере необходимости. Мы следуем аналогичному процессу и для контейнера ML. Содержимое Dockerfile для моделей ML приведено ниже.

После создания образов контейнеров мы можем приступить к настройке заданий в Jenkins. Jenkins можно запустить с виртуальной машины RHEL8 с частным IP-адресом, который не открыт для внешней сети (Интернета). Чтобы получить доступ к Jenkins из других систем, мы можем использовать ngrok для временного раскрытия IP-адреса Jenkins в течение ограниченного периода времени. Обратите внимание, что Jenkins необходимо предоставить права root-пользователя, изменив существующий файл /etc/sudoers после его установки. Задания инициализируются в Jenkins, как показано ниже:

  1. Работа 1 включает в себя получение контента из репозитория GitHub и копирование его в систему RHEL8. Существует множество способов интеграции Git и Jenkins, но все они требуют установки подключаемого модуля Git. После установки подключаемого модуля Git одним из способов является настройка веб-перехватчиков с использованием URL-адреса Jenkins и URL-адреса репозитория GitHub. Мы настроили задание 1, как показано на следующих изображениях.

На четвертом изображении показан сценарий оболочки, который будет выполнен после успешной сборки задания. Сценарий запускается в сценарии bash хост-системы RHEL8.

2. В Job 2 запускаем контейнеры в зависимости от модели, которую нужно обучить. Один из способов распознать тип модели — просмотреть библиотеки, импортируемые в файле .py. На основе библиотек мы можем разделить файлы обучения модели ML и DL. Задание 2 выполняется только в случае успешного выполнения задания 1. В Jenkins задание 2 называется нижестоящим проектом задания 1, а задание 1 — вышестоящим проектом задания 2. Это простая реализация Pipelines в Jenkins.

Здесь приведены два сценария оболочки. Оба будут выполнены, когда задание будет построено.

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

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

4. Последнее задание предназначено просто для наблюдения за контейнерами после их запуска, поэтому его также можно считать последующим проектом задания 2.

После того, как все задания созданы, мы можем использовать Build Pipeline для визуализации связей между заданиями. Чтобы использовать Build Pipeline, нам нужно установить Build Pipeline Plugin, перейдя в Manage Jenkin -> Manage Plugins и установив Build Pipeline Plugin из списка доступных плагинов. После установки плагина мы можем создать новое представление в стиле Build Pipeline и выбрать начальное задание как задание 1. После создания представления мы увидим следующее.

Вышеуказанные задания выделены зеленым цветом, поскольку все они были успешно выполнены последовательно.

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

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

Это настройка, которая может помочь нам автоматизировать обучение моделей ML и DL с использованием различных инструментов DevOps, таких как Git, Docker и Jenkins. В этой настройке нам не только удалось автоматизировать обучение моделей ML и DL, но также изменить файлы обучения ML и DL для достижения желаемой точности путем изменения различных гиперпараметров. Это лишь малая часть того, как DevOps и машинное обучение вместе могут революционизировать цифровой мир, каким мы его знаем.