Реализация конвейера CI / CD или непрерывная интеграция / непрерывное развертывание для науки о данных.

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

Прежде всего, давайте определимся с CI / CD. Как сказано в Wiki, CI / CD устраняет пробелы между разработкой, эксплуатацией и командами, обеспечивая автоматизацию при создании, тестировании и развертывании приложений. Современные практики DevOps включают непрерывную разработку, непрерывное тестирование, непрерывную интеграцию, непрерывное развертывание и непрерывный мониторинг программных приложений на протяжении всего жизненного цикла разработки. Практика CI / CD или конвейер CI / CD составляет основу современных операций DevOps .

Хорошо, давайте рассмотрим CI и CD отдельно.

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

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

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

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

Это решение состоит из трех шагов. Первый шаг - запустить поток данных ADF Data для получения данных из базы данных SQL, преобразовать и выбрать несколько форматов столбцов из таблицы и сохранить эти результаты в папке Stage в Azure Data Lake. Второй шаг - запустить записную книжку Azure Databriks из ADF с указанным параметром учетной записи хранения, чтобы подготовить набор данных истории и запустить модель поезда. На этом этапе мы можем использовать стоечные эксперименты MLflow для записи и сравнения параметров и результатов. И последний шаг - запустите записную книжку Azure Databriks из ADF также с указанным параметром учетной записи хранения, чтобы оценить нашу модель и сохранить результаты в Azure Data Lake.

Чтобы начать этот проект, мне нужно создать 3 группы ресурсов на портале Azure. Эти группы ресурсов будут отвечать за различные среды - Dev, Staging и Production. В этих средах я создал следующие службы - Azure SQL, фабрику данных Azure, учетную запись хранения Azure V2, блоки данных Azure и хранилище ключей Azure.

Во всем Azure SQL я загрузил две таблицы - данные истории и данные оценки. Описание этих данных вы можете найти по этой ссылке. В учетной записи хранения Azure я создал контейнер с тремя папками - RawData, PreprocData и Results. Следующим шагом является создание секретов в хранилищах ключей Azure. Мне нужен секрет для учетной записи хранения Azure, где я использовал ключ доступа и строку подключения для моей базы данных SQL Azure. Одна важная вещь: чтобы получить доступ из фабрики данных Azure к вашим секретам, вам необходимо выполнить некоторую конфигурацию в политике доступа в учетной записи хранения Azure -

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

Следующим шагом является настройка Azure Databricks. Чтобы ссылаться на секреты, хранящиеся в Azure Key Vault, я создал секретную область, поддерживаемую Azure Key Vault. Чтобы создать его, перейдите на https://<databricks-instance>#secrets/createScope. Этот URL-адрес чувствителен к регистру; область в createScope должна быть прописной и заполнить эту форму:

Следующий шаг в настройке Azure Databricks - подключить мои записные книжки к репозиторию Azure DevOps. Для этого просто откройте записную книжку, нажмите «Синхронизировать» и заполните форму информацией о репозитории Azure DevOps. Таким образом, вы можете фиксировать обновления в вашем Notebook в репозитории.

Базовая конфигурация служб Azure закончена, давайте приступим к созданию конвейера в фабрике данных Azure. Первым шагом является подключение ADF к репозиторию Azure DevOps. Я могу подключить его двумя способами - при создании сервиса и в конфигурации ADF. Мне нужно настроить это соединение только для среды Dev.

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

Чтобы создать связанную службу Azure Databricks, я заполнил следующую форму:

Чтобы создать связанный сервис Azure SQL DB, я заполнил следующую форму:

Чтобы создать службу, связанную с учетной записью хранения Azure, я заполнил следующую форму:

Чтобы создать связанную службу Azure Key Vault, я заполнил следующую форму:

Для управления именами связанных сервисов между различными средами, которые я создаю, я использую глобальные параметры в ADF, были созданы три параметра - dev, stg, prd.

Давайте создадим конвейер:

Первый шаг моего конвейера - поток данных:

В этом потоке данных я получаю данные из базы данных SQL Azure, конвертирую формат данных, выбираю какой-либо столбец из таблицы и загружаю результаты в Azure Data Lake в соответствующей папке. Этот процесс был создан для таблиц истории и оценок (новых данных).

Следующие шаги конвейера - это запуск data_preparation_model_train, а затем сценарий score_new_data. Для этого нам понадобятся:

  1. Выберите подходящую службу связи
  2. Выберите место назначения записной книжки
  3. Добавить параметры с именем хранилища

То же самое и со скриптом score_new_data.

Это все этапы моего конвейера ADF, следующие шаги проверяются, создаются запросы на вытягивание для присоединения к моей ветке с мастерами, а затем публикуются все обновления в основной ветке из ADF. Результаты, достижения:

Приступим к настройке CI / CD в Azure DevOps.

Первый шаг - создание нового конвейера выпуска (на портале Azure DevOps перейдите к конвейерам - ›Выпуски и щелкните Новый конвейер)

Выберите окно шаблона, в котором отображаются различные предварительно настроенные шаблоны. В случае фабрики данных можно создать Пустое задание и назвать его, например, - ADF-DevOps2020-CICD:

Создайте новый этап «Staging» (тестовый env):

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

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

Следующий шаг - создание переменных конвейера выпуска. Переменные будут содержать независимые от среды значения из-за наследования значений групп переменных. Следовательно, значение переменной будет скорректировано до стадии, на которой оно используется. Чтобы создать его, вернитесь в Конвейеры - ›Выпуски и откройте вкладку Переменные. Я создал следующие переменные:

Пора создать и настроить стадию разработки.

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

Пришло время настроить этап подготовки или тестирования. Пришло время создать несколько задач для этого этапа. Для своего первого конвейера я создал два задания: развертывание конвейера в фабрике данных Azure и копирование записных книжек Python в Azure Databricks.

Давайте более подробно рассмотрим развертывание шаблона Task ARM. Главное, что хотелось бы описать -

  • В поле группы ресурсов заполните переменную: $(resourceGroup).
  • Выберите расположение шаблона: «Связанный артефакт»
  • Выберите шаблон ARM и файлы параметров шаблона

  • Заменить параметры шаблона по умолчанию переменными, которые были созданы ранее

В результате мы получили следующую форму:

Моя следующая задача - Databricks Deploy Notebooks. Давайте разберемся с этим поподробнее. Нам необходимо заполнить:

  1. Папка, в которую я хотел бы скопировать свои записные книжки в Azure Databricks. идентификатор приложения, созданный мной ранее. (Как создать - ссылка.)
  2. Тот же идентификатор приложения
  3. ID подписки
  4. Идентификатор арендатора

В итоге на данном этапе у меня есть две задачи:

Мне также нужен этап Производство. Нажмите клонировать промежуточную среду в рабочую:

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

И последний шаг всей настройки - это сопоставление групп переменных с этапами. Этот шаг необходим для сопоставления значений переменных, зависящих от этапа, с определенными этапами. Например, переменная $ (Environment) имеет значение «prd», если конвейер выполняет задание на этапе производства, и устанавливает значение «stg» в случае, если задание запускается на этапе подготовки. Для этого откройте вкладку «Переменные» - ›Группы переменных и нажмите« Связать группу переменных ». Сопоставьте группу переменных «Производство» с этапом «Производство» и выберите также область «этап Производство» вместо «Выпуск», а затем повторите то же действие для «Подготовка».

Пора запустить и проверить этот простой конвейер.

В результате я нашел конвейер ADF и записные книжки Azure Databricks в соответствующих службах в группе ресурсов Stage и Production. Я также могу детально проанализировать все задачи на каждом этапе, например:

Чтобы сделать этот конвейер более полным, я также могу добавить на этап Test несколько задач с тестами. Эти тесты, например, могут запускать конвейер ADF и анализировать его результаты - таблица за копией в Azure Data Lake, журналы MLflow и результаты в таблице после оценки. После прохождения всех этих тестов мы можем утверждать этап Производство.

В этой истории я хотел бы подробно проиллюстрировать пошаговый способ создания и настройки конвейеров выпуска для включения практик CI / CD в средах фабрики данных Azure. В нем показаны ограничения, а также возможности, которые могут предоставить Azure DevOps, фабрика данных Azure, база данных Azure SQL, озеро данных Azure и Azure Databricks при совместном использовании.

Спасибо за прочтение.

Полезные ссылки: