Краткий обзор MLOps
MLOps — это набор методов, направленных на надежное и эффективное развертывание и поддержку моделей машинного обучения в производственной среде. Слово представляет собой соединение «машинного обучения» и практики непрерывного развития DevOps в области программного обеспечения.
DevOps против MLOps
Системы машинного обучения отличаются от обычных программных решений следующими особенностями:
- CI — это уже не только тестирование и проверка кода и компонентов, но также тестирование и проверка данных, схем данных и моделей.
- CD больше не относится к одному программному пакету или сервису, а представляет собой систему (конвейер обучения машинного обучения), которая должна автоматически развертывать другой сервис (сервис прогнозирования моделей).
- CT — это новое свойство, уникальное для систем ML, которое связано с автоматическим переобучением и обслуживанием моделей.
Бенчмаркинг
Для начала мы создали два ноутбука, один с поддержкой процессора, а другой с поддержкой графического процессора; объединение всего конвейера науки о данных в один блокнот. Основываясь на соответствующем запуске ноутбука, мы нашли приведенную ниже статистику, сравнивающую производительность процессора и графического процессора.
Графический процессор стирает пол с ЦП в этом тесте времени выполнения конвейера. ЦП потребовалось более 5 часов для задачи, которую графический процессор выполнил чуть более чем за минуту, что в колоссальные в 267 раз быстрее. Это наилучший сценарий для ЦП, поскольку многопоточность использовалась как для обработки данных, так и для обучения. Работа Data Scientist в основном состоит из экспериментов с данными, функциями и параметрами. Такое ускорение разработки может стать решающим фактором в том, чтобы вывести ваш продукт на рынок раньше, чем ваш конкурент.
Машина: NC24rs_v3 (24 виртуальных процессора, 448 ГБ ОЗУ, 4 × NVIDIA Tesla V100)
Данные: https://www.kaggle.com/c/new-york-city-taxi-fare-prediction/data
Код: https://github.com/rppol/MLOps_GPU/tree/main/notebooks
Практическая реализация MLOps
Основываясь на приведенных выше блокнотах, мы теперь продемонстрируем, как мы можем реализовать жизненный цикл MLOps для нашего конвейера обработки данных.
Здесь мы будем использовать Rapids и Dask для обработки и обучения данных на основе графического процессора. Jenkins будет использоваться для конвейеров CI/CD, а MLflow — для отслеживания моделей.
В идеале должны быть отдельные серверы для разработки и производства, но здесь мы будем использовать один и тот же сервер для всего.
Необходимы базовые знания Linux и Python.
Настройка среды
Для этого вам понадобится машина с графическим процессором Nvidia, которая удовлетворяет этим предпосылкам. Я использовал виртуальную машину NC24rs_v3 с Ubuntu 20.04 в Azure.
- Установите виртуальную машину и подключитесь к ней по SSH
- Установить драйверы Nvidia
- Установить Докер
- Установить Nvidia Container Toolkit
- Установить и настроить Git
- Установить и запустить Дженкинс
- Установите и настройте Conda для Jenkins, выполнив следующие действия:
8. Создайте структуру каталогов
- Каталог сервера инференса Triton
- Каталог данных
В идеале в продакшн-системах API будет постоянно подпитывать данные, и для контроля версий следует использовать такие инструменты, как dvc. Здесь мы будем использовать статические данные конкурса Прогноз стоимости такси в Нью-Йорке. Учебный файл разделен в соотношении 9:1 как train.csv и test.csv соответственно. Используйте приведенный ниже скрипт, чтобы загрузить их с Google Диска (~ 5 ГБ).
10. Установка и настройка Triton Inference Server
Мы разрабатываем модель XGBoost. Triton имеет FIL Backend, созданный с помощью RAPIDS Forest Inference Library для быстрого вывода на основе графического процессора.
11. Откройте порты на ВМ
"Код"
Репозиторий GitHub: https://github.com/rppol/MLOps_GPU
Состав:
- ноутбуки: эти ноутбуки предназначены не для развертывания, а для тестирования производительности и экспериментов.
- nyc-taxi-fare-cpu.ipynb: Интуитивно понятный ноутбук только с процессором, созданный с пандами (обработка данных), модином (многопоточность), XGBoost (все основные тренировки).
- nyc-taxi-fare-gpu.ipynb: интуитивно понятный ноутбук только с графическим процессором, созданный с помощью dask_cudf (обработка данных), xgboost.dask (распределенное обучение на основе графического процессора).
2. src: эта папка содержит все исходные файлы. Мы разделили блокнот на модули, чтобы упростить его настройку для развертывания MLOps. Каждая основная функция разделена на скрипты Python с интуитивно понятными названиями. Каждый скрипт поддерживает независимое выполнение.
- read_params.py: изменение жестко заданных значений может быть очень раздражающим и подверженным ошибкам. Этот скрипт Python создает вспомогательные функции для чтения файла params.yaml, т. е. универсальный пункт назначения для изменения параметров.
- dask_client.py: создает клиент Dask, этот клиент выполняется через сценарии, так как создание нового требует времени. Максимальная выделенная память GPU должна быть указана в файле params.yaml.
- load_data.py: помогает загружать данные обучения и тестирования в память графического процессора. Использует dask_cudf для ускорения и распространения чтения. Параметр test должен быть установлен в true для чтения тестовых данных. Относительный путь к каталогу данных и имена файлов должны быть указаны в файле params.yaml.
- feature_engg.py: это скрипт очистки данных, манипулирования и добавления функций. Он удаляет выбросы и необоснованные данные и добавляет интересные функции, такие как расстояние до различных ориентиров.
- split_data.py: разделяет данные как сценарии обучения и проверки. Коэффициент разделения можно варьировать с помощью файла params.yaml.
- generate_Dmatrix.py: преобразует данные в формат, который может обрабатывать XGBoost.
- train.py: обучающий скрипт для локального использования и устранения неполадок. Это не используется в автоматизированном конвейере.
- train_with_tracking.py: сценарий обучения модели с отслеживанием MLflow. Сервер MLflow должен быть запущен перед выполнением этого скрипта. Он отслеживает все параметры и построенную модель. Он также тестирует модель на невидимых данных и отслеживает показатели. Посетите это для получения руководства по тонкой настройке моделей XGBoost.
- log_production_model.py: этот скрипт находит лучшую модель из всех версий, сравнивая rmse. Он загружает, конвертирует и сохраняет эту модель в папке производственной модели для дальнейшей обработки.
3. тест: проводит тестирование скриптов Python как для модели, так и для сервера.
- test_and_evaluate.py: генерирует прогнозы по невидимым данным и сравнивает с фактическими значениями. Генерирует такие показатели, как среднеквадратическая ошибка, средняя абсолютная ошибка, R-квадрат ошибки. Модель может быть передана в качестве аргумента или загружена из каталога production_model.
- triton_inference_test.py: проверяет, работает ли Triton Server с данными 1%. Использует grpc для работы в сети.
4. scripts: содержит сценарии оболочки, выполняемые Jenkins.
- train_test_log.sh: поезда, тесты и журналы новой модели.
- Productionize.sh: получает лучшую модель и копирует ее в репозиторий моделей.
- triton_test.sh: тестирует Triton после загрузки новой модели.
5. артефакты: сохраняет модели в формате MLflow.
6. Jenkinsfile: описывает конвейер CI/CD.
7. params.yaml: Единый пункт назначения для управления всем, хранения конфигурации, параметров, пути, ip, портов.
Построение конвейера CI/CD
- Форк https://github.com/rppol/MLOps_GPU
- Войдите в Jenkins ( your_public_ip_here:8080 )
Имя пользователя: админ
Пароль можно узнать с помощью следующей команды:
3. Добавьте свои учетные данные GitHub
4. Нажмите Новый элемент
5. Выберите «Конвейер», введите действительное имя и нажмите «ОК».
6. Выберите «Не разрешать параллельные сборки», так как одна сборка потребляет все ресурсы графического процессора.
7. Прокрутите вниз до Pipeline и выберите следующие параметры:
- Введите URL вашего репозитория
- Прикрепите свои учетные данные GitHub, созданные на шаге 2.
- Выбрать основную ветку
8. Нажмите «Применить и сохранить».
Этот конвейер можно настроить на периодическую сборку или запуск сборок после таких действий, как git push и наличие новых данных. Для простоты мы запустим его вручную.
Запуск конвейера CI/CD и развертывание
- Убедитесь, что Jenkins, MLflow Server и Triton запущены
2. Доступ к серверам можно получить здесь:
- Дженкинс: your_ip_here:8080
- JupyterLab: your_ip_here:9999/лаборатория?
- MLflow: your_ip_here:8003
- Сервер логических выводов Triton: your_ip_here:8001
- Метрики Triton: your_ip_here:8002
3. Выполнение конвейера
- Перейдите по адресу: your_ip_here:8080/job/your_pipeline_name/
- Нажмите Build Now, чтобы начать выполнение.
- Наведите указатель мыши на каждый этап, чтобы проверить журналы.
4. Отслеживание MLflow
- Каждая сборка конвейера создает новую модель, а MLflow предоставляет интуитивно понятный пользовательский интерфейс для мониторинга всего.
- Выберите два или более прогона и нажмите «Сравнить», чтобы сравнить их.
Настройка гиперпараметров
- Перейдите по адресу: your_ip_here:9999/lab?
- Отредактируйте значения в params.yaml как душе угодно.
- Посетите это, чтобы настроить гиперпараметры как профессионал
Заключение
Благодаря приведенной выше демонстрации стало очевидно, что конвейер MLOps можно полностью ускорить на графических процессорах. Виртуальная машина с GPU стоит в 1,8 раза больше, чем виртуальная машина с процессором, но с ускорением примерно 267 × она окупается.
Специалисты по обработке и анализу данных могут тратить больше времени на оптимизацию и настройку моделей, чем на развертывание и ожидание, пока ЦП обрабатывает числа один за другим.
LinkedIn: https://www.linkedin.com/in/rutikpol/
Рекомендации
- Данные: https://www.kaggle.com/c/new-york-city-taxi-fare-prediction/data
- Код: https://towardsdatascience.com/nyc-taxi-fare-prediction-605159aa9c24
- Общая интуиция: https://cloud.google.com/architecture/mlops-continuous-delivery-and-automation-pipelines-in-machine-learning
- Аналогичный видеоурок: https://youtube.com/playlist?list=PLZoTAELRMXVOk1pRcOCaG5xtXxgMalpIe