Пошаговое руководство по шаблону, использующему пакет SDK AML Python v2 для настройки сквозного проекта машинного обучения в Azure ML.

Azure ML — это служба, которая позволяет (и относительно легко) выполнять машинное обучение в облаке. У него множество функций, но в этой публикации блога основное внимание будет уделено тем, которые могут помочь вам масштабировать ваши усилия по машинному обучению и запускать ваши модели в производство. Если все, что вам нужно от Azure ML, — это место для запуска размещенных блокнотов Jupyter, то этот пост не для вас. С другой стороны, если у вас есть тачки безымянных блокнотов Jupyter, содержащих эксперименты по машинному обучению, и вы не знаете, как извлечь из них пользу, вам следует подумать о том, чтобы продолжить чтение. Мы рассмотрим некоторые функции Azure ML и способы настройки проекта Azure ML. В проекте используется недавно представленный Azure ML Python SDK v2, с которым значительно проще работать, чем с предыдущей версией.

В этом сообщении блога вы познакомитесь с репозиторием GitHub, содержащим эксперимент машинного обучения, который можно было бы настроить в Azure ML. Репозиторий можно найти здесь, и рекомендуется просматривать различные каталоги по мере их упоминания. Репозиторий следует рассматривать как своего рода шаблон, и изначально он предназначался для внутреннего использования в Eika Forsikring. Нашей целью было упростить начало новых экспериментов в Azure ML, предоставив проект, который поможет вам выполнить наиболее распространенные задачи. Шаблон покажет вам, как использовать наиболее полезные функции машинного обучения Azure, а также должна быть возможность использовать репозиторий в качестве отправной точки при создании собственных экспериментов.

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

  • снова и снова проходить через трудоемкий процесс настройки на основе графического интерфейса, и
  • несущие ненужные расходы.

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

В третьем разделе мы покажем вам, как развернуть ваши модели как для пакетной, так и для онлайн-оценки, а также как активировать их, выполнив вызов REST API.

Предоставление

Конфигурацию Terraform можно найти в каталоге provision/ репозитория. Здесь мы указываем необходимых поставщиков (providers.tf) и версию для использования для Terraform и поставщика Azure (versions.tf). Мы определяем ресурсы, такие как рабочая область машинного обучения и вычислительный кластер, в resources.tf. При создании ресурсов вы можете использовать переменные, определенные в variables.tf и установленные в terraform.tfvars.

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

Чтобы создать определенные ресурсы, вам необходимо установить Terraform и сделать так, чтобы у Terraform был доступ к вашей подписке Azure. Это довольно просто, инструкции о том, как это сделать, можно найти здесь:

После того, как вы установили Terraform и установили метод аутентификации в Azure, вы можете просто запустить terraform init, а затем terraform apply, чтобы создать ресурсы. Когда вы закончите, вы можете запустить terraform destroy, чтобы демонтировать инфраструктуру, тем самым избегая затрат, когда ресурсы не используются.

Это должно быть так! Теперь у вас есть собственная рабочая область машинного обучения Azure.

Обучение

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

Настраивать

Первое, что нам нужно сделать, это загрузить данные в хранилище в облаке. Код для этого можно найти в каталоге setup/. Сценарий create_data.py создает файл Parquet, а upload_data.py загружает его в контейнер хранилища, зарегистрированный как хранилище больших двоичных объектов по умолчанию для рабочей области.

Трубопровод

Azure ML позволяет создавать конвейеры обучения, организованные в виде группы обеспечения доступности баз данных. Каждый узел можно рассматривать как задание, которое получает входные данные от одного узла и выводит что-то другому узлу. Узлы определяются в файлах YAML и называются компонентами. Их можно найти в папке components/. Каждый компонент связан с каталогом, содержащим требуемый код, команду, которая должна выполняться при запуске компонента, среду, в которой должна выполняться команда, а также входы и выходы.

Код, указанный в определении компонентов, можно найти в соответствующих каталогах в pipeline/. Здесь будут все действительно интересные вещи, такие как предварительная обработка, подгонка модели и оценка модели. Среда, используемая в определении компонента, создается скриптом create_environment.py в pipeline/ и определяется файлом conda YAML (conda.yml) и ссылкой на образ Docker, в котором должна быть установлена ​​среда conda. Все зависимости для ваш код машинного обучения должен быть найден в этой среде. Обратите внимание: если вы хотите использовать отслеживание экспериментов в Azure ML, то mlflow и azureml-mlflow также должны быть включены в conda.yml.

Отношение между компонентами (т. е. DAG) определяется в run_pipeline.py в каталоге pipeline/. Это делается путем указания того, как входы и выходы должны передаваться между различными компонентами. Когда конвейер запущен, команды в определении компонентов будут выполняться в правильном порядке, а выходные данные компонентов будут переданы в качестве входных данных другому компоненту указанным способом. Входными данными для нашего конвейера обучения является набор данных, который мы ранее загрузили в хранилище BLOB-объектов. Мы регистрируем этот набор данных, запустив register_training_data.py, но на самом деле мы не используем абстракцию Data при определении конвейера. Обычно это делается, но в данный момент это не работает должным образом. Поэтому мы обращаемся к загруженным данным напрямую, используя путь, например azureml://datastores/workspaceblobstore/paths/<file_path>. Этот путь относится к файлу, расположенному по адресу <file_path> внутри контейнера хранилища, зарегистрированного как workspaceblobstore в вашей рабочей области.

Определение конвейера в run_pipeline.py состоит из шага, который разбивает набор данных на обучающие и тестовые данные, шага, который вычисляет перекрестную проверку точности для ряда случайно выбранных параметров, и шага, который обучает модель на всем наборе данных с наилучшей производительностью. выбор параметра перед его регистрацией. Шаг, на котором выполняется перекрестная проверка различных гиперпараметров, выбранных случайным образом, использует один узел из вычислительного кластера для каждой комбинации гиперпараметров. Таким образом, поиск гиперпараметров может выполняться параллельно, что может сэкономить нам много времени. Производительность каждого запуска отслеживается с помощью интеграции MLFlow, предоставляемой Azure ML, и выходные данные наиболее эффективного запуска передаются на следующий узел. В вызове sweep в run_pipeline.py мы указываем, что метрика с именем accuracy должна быть максимизирована. Поэтому мы должны убедиться, что точность регистрируется именно с этим именем. Все запуски Azure ML настроены таким образом, что любое ведение журнала с помощью MLFlow автоматически использует выделенный сервер отслеживания MLFlow для рабочих областей. На последнем этапе модель обучается на всем наборе данных и регистрируется. Регистрация выполняется с помощью MLFlow API, но модель будет отображаться на панели Модель на ml.azure.com. Регистрация модели позволяет развернуть ее через пакетную или онлайн-конечную точку.

Развертывание

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

Пакетное развертывание

Начнем с создания конечной точки пакета. Такая конечная точка может содержать несколько развертываний, и каждое развертывание использует определенную среду, модель и код оценки. Поэтому мы должны создать такое развертывание и зарегистрировать его в конечной точке. Пакетное развертывание поддерживает параллельное выполнение логических выводов на нескольких узлах, при этом каждый узел обрабатывает подмножество входных данных. В нашем шаблонном проекте мы делаем все на одном узле, но это не обязательно. Весь код, связанный с пакетным развертыванием, можно найти в deployment/batch/. Код, используемый для подсчета очков, находится в code/scoring.py. Функция run будет вызываться со списком файлов и должна либо возвращать предсказанные значения для каждого файла, либо обеспечивать запись вывода в нужное место. Подробности о том, как создавать эти функции, можно найти в Документации по AML. Обратите внимание, что для того, чтобы пакетное развертывание работало, мы должны включить пакет azureml-dataset-runtime[fuse] в его среду.

Когда развертывание создано, его можно вызвать через конечную точку REST, как показано на invoke_with_rest.py. Вызов через конечную точку REST позволяет нам указать выходное местоположение для скрипта оценки.

Онлайн-развертывание

Создание онлайн-развертывания очень похоже на то, что мы делали для пакетного развертывания. Сначала необходимо создать конечную точку, а затем зарегистрировать развертывание в конечной точке. Функция run в deployment/online/code/scoring.py вызывается с данными, полученными через конечную точку, и обычно возвращает прогнозы (что мы и делаем здесь). Более подробная инструкция по созданию скриптов скоринга для онлайн-деплойментов подробно описана в Документации по AML. Обратите внимание, что пакеты Python azureml-defaults и inference-schema[numpy-support] кажутся необходимыми для работы онлайн-развертывания (хотя это нигде явно не упоминается).

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

Заключительные замечания

Я надеюсь, что эта запись в блоге вместе с проектом шаблона дала некоторое представление о том, что такое Azure ML и какие у него есть функции. Когда вы создаете свой собственный проект, вам определенно придется внести некоторые изменения, но я надеюсь, что представленный здесь шаблон может послужить разумной отправной точкой. Документация для Python SDK и документация по AML очень полезна, когда вы вникаете в детали. Я нашел следующие ссылки особенно полезными при сборке этого шаблона: