Прозрачный REST API-прокси для внешнего доступа к Amazon SageMaker MLflow — ИИ для бизнеса

Прозрачный REST API-прокси для внешнего доступа к Amazon SageMaker MLflow

Прослушать статью

Команды по машинному обучению используют MLflow для эффективного управления жизненным циклом ML. Amazon SageMaker MLflow предоставляет расширенные возможности для отслеживания экспериментов ML и управления моделями. Однако у многих предприятий есть существующие инфраструктурные требования, которым нужны интеграции по HTTPS, а не прямое использование SDK.

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

В этой статье мы показываем, как построить защищённый прокси-сервис MLflow на базе Flask, который обеспечивает HTTPS-доступ к Amazon SageMaker MLflow без необходимости использовать MLflow SDK. Это решение предназначено для организаций, проходящих облачную трансформацию и стремящихся сохранить существующие рабочие процессы ML при переходе на облачные сервисы.

  • Внедрение прокси-сервиса MLflow для HTTPS-запросов к MLflow.
  • Настройка аутентификации AWS Identity and Access Management (IAM) для защищённого доступа.
  • Управление предварительным подписанием URL и преобразованием запросов.

После внедрения этого решения вы сможете:

  • Безопасно обращаться к SageMaker MLflow через стандартные HTTPS-эндпоинты.
  • Соблюдать требования безопасности вашей организации.
  • Интегрировать MLflow с существующими корпоративными системами.
  • Снизить сложность реализации и затраты на сопровождение.

Обзор решения

Лёгкая архитектура прокси MLflow на базе Flask обеспечивает защищённую интеграцию между корпоративными системами и Amazon SageMaker MLflow через три ключевых компонента.

Компонент 1: Application Load Balancer (ALB)

AWS Application Load Balancer выступает в роли верхнего маршрутизатора и обеспечивает следующее:

  • Распределение трафика для интерфейса MLflow UI и REST API-запросов.
  • Первичную обработку и маршрутизацию запросов.
  • Поддержку пользовательских доменных имён и SSL-терминации.

Примечание: в этой реализации используется ALB, но при необходимости можно использовать и другие решения маршрутизации, например Nginx.

Компонент 2: прокси-сервис Flask MLflow

В основе архитектуры лежит Python-приложение на Flask, которое выполняет следующие функции:

  • Перехватывает и обрабатывает входящие HTTPS-запросы.
  • Управляет аутентификацией AWS и подписью запросов.
  • Преобразует URL для безопасного доступа к конечным точкам MLflow.
  • Возвращает ответы клиентам по соответствующим маршрутам.

Компонент 3: Amazon SageMaker MLflow

Управляемый AWS сервис SageMaker MLflow предоставляет следующее:

  • Поддержку двух режимов развёртывания MLflow:
    • MLflow Tracking Server — управляемый сервер отслеживания MLflow.
    • MLflowApp — бессерверное приложение MLflow.
  • Хранилище метаданных бэкенда для информации об отслеживании.
  • Хранилище файлов моделей и данных.

Эта архитектура обеспечивает защищённую связь, сохраняя совместимость с существующими корпоративными системами. Прокси-сервис выступает мостом, преобразуя стандартные HTTPS-запросы в аутентифицированные вызовы AWS API, которые могут взаимодействовать с SageMaker MLflow.

Архитектура и поток запросов

На следующей схеме показано, как прокси-сервис Flask обеспечивает защищённую связь между внешними клиентами и Amazon SageMaker MLflow.

Схема архитектуры, показывающая, как внешние клиенты отправляют HTTPS-запросы через Application Load Balancer к прокси-сервису Flask, который аутентифицирует запросы и пересылает их в Amazon SageMaker MLflow
Рисунок 1: схема архитектуры, показывающая интеграцию прокси-сервиса Flask с Amazon SageMaker MLflow

На схеме архитектуры показаны три основных компонента:

  • ALB, который обрабатывает входящий трафик.
  • Прокси-сервис Flask, который управляет аутентификацией и преобразованием запросов.
  • Amazon SageMaker MLflow, который обрабатывает операции ML.

Поток запросов

Рассмотрим, как запросы проходят через эту архитектуру, обеспечивая защищённый доступ к MLflow.

Когда клиент инициирует HTTPS-запрос, он сначала попадает на ALB, который выступает точкой входа для всего входящего трафика. Затем ALB направляет эти запросы в прокси-сервис MLflow.

После получения запроса прокси-сервис MLflow выполняет несколько критически важных функций:

  • Обрабатывает аутентификацию через интеграцию AWS IAM.
  • Преобразует URL и предварительно подписывает их для безопасного доступа.
  • При необходимости обрабатывает конечные точки MLflow REST API.

Прокси-сервис MLflow преобразует входящий запрос в аутентифицированный запрос AWS перед вызовом API к конечным точкам SageMaker MLflow REST. После обработки запроса SageMaker MLflow возвращает ответ, который прокси-сервис MLflow обрабатывает и направляет обратно исходному клиенту.

Такой поток сохраняет безопасность и одновременно обеспечивает интеграцию между корпоративными системами и SageMaker MLflow.

Предварительные требования

Чтобы выполнить это пошаговое руководство, убедитесь, что у вас есть следующее:

  • Учётная запись AWS.
  • Рабочая станция со следующими установленными инструментами:
    • AWS Command Line Interface (AWS CLI), настроенный с правами на создание:
      • Amazon Virtual Private Cloud (Amazon VPC) и связанных сетевых компонентов.
      • Экземпляров Amazon Elastic Compute Cloud (Amazon EC2).
      • Ресурсов Amazon SageMaker AI.
      • Ведёрок Amazon Simple Storage Service (Amazon S3).
      • Ролей и политик AWS Identity and Access Management (IAM).
      • Стеков AWS CloudFormation.
      • AWS Application Load Balancer.
    • Node.js версии 18.0.0 или новее.
    • NPM.
    • AWS Cloud Development Kit (AWS CDK) CLI версии 2.100.0 или новее.
    • Python 3.x с pip или pip3.
  • Необходимые знания:
    • Базовое понимание сервисов AWS и разрешений IAM.
    • Знакомство с приложениями Python и Flask.
    • Понимание концепций и операций MLflow.
  • Финансовые соображения:
    • Это решение создаёт ресурсы AWS, которые могут привести к расходам.
    • Ключевые ресурсы, влияющие на стоимость:
      • Экземпляры Amazon EC2.
      • Application Load Balancer.
      • Ресурсы Amazon SageMaker AI.
      • Хранилище Amazon S3.

Информацию о ценах на сервисы AWS см. в AWS Pricing Calculator.

Развёртывание решения

В этом разделе показано, как развернуть решение в вашей учётной записи AWS и проверить его работу. Процесс развёртывания занимает примерно 40 минут.

Шаг 1: разверните инфраструктуру с помощью AWS CDK

  1. Скачайте код решения и установите зависимости:

    # Клонируйте репозиторий
    git clone https://github.com/aws-samples/sample-sagemaker-mlflow-rest-apis.git
    
    # Перейдите в каталог проекта и установите зависимости
    cd sample-sagemaker-mlflow-rest-apis
    npm ci
    
  2. Подготовьте окружение для AWS CDK. Пропустите этот шаг, если ваша учётная запись AWS и регион уже подготовлены для AWS CDK. Подготовьте учётную запись AWS и регион для CDK:

    npx cdk bootstrap aws://<ACCOUNT_ID>/<REGION>
    
  3. Разверните необходимые ресурсы в своей учётной записи AWS. Решение состоит из четырёх стеков CDK:
    • Сетевой стек — создаёт VPC и сетевые компоненты.
    • Стек домена SageMaker AI — настраивает домен SageMaker.
    • Стек SageMaker MLflow — разворачивает сервер отслеживания MLflow или бессерверное приложение MLflow.
    • Стек приложения Flask — разворачивает прокси-сервис MLflow.

    Разверните все стеки одной из следующих команд.

    Для развёртывания на базе tracking server:

    Формулы и расчет
    npx cdk deploy --all --require-approval=never -c mlflowType=tracking
    

    Для развёртывания на базе serverless app:

    Формулы и расчет
    npx cdk deploy --all --require-approval=never -c mlflowType=serverless
    

Шаг 2: установите и настройте прокси-сервис Flask MLflow

  1. Подключитесь к экземпляру EC2:
    1. Запишите идентификатор экземпляра Amazon EC2 из вывода CDK или из раздела вывода стека AWS CloudFormation sagemaker-infra-flaskapp-{mlflowType}.
    2. Используйте AWS Systems Manager Session Manager для подключения. Следуйте руководству по подключению через Session Manager.
  2. Установите Python 3.13 и зависимости. Установите пакеты Python:

    # Переключитесь на пользователя root
    sudo su -
    cd /root
    
    # Установите Python и зависимости
    chmod +x install_python13.sh
    ./install_python13.sh
    

    Примечание: этот скрипт предназначен для систем на базе Ubuntu. Для других дистрибутивов Linux установите Python 3.12+, PIP3 и Virtualenv с помощью пакетного менеджера вашей системы.

  3. Установите и запустите прокси-сервис MLflow:

    chmod +x setup_mlflow_proxy_app.sh
    ./setup_mlflow_proxy_app.sh
    
  4. Проверьте статус прокси-сервиса Flask MLflow:

    systemctl status mlflowproxy
    

    Примечание: если сервис не запущен, проверьте журналы с помощью следующей команды:

    journalctl -u mlflowproxy
    

Шаг 3: проверьте доступ к MLflow REST API

В этом разделе показано, как взаимодействовать с REST API MLflow через ALB.

Примечание: в этих примерах используется протокол HTTP (без шифрования). Для производственной среды мы рекомендуем HTTPS. В этой статье мы используем curl для выполнения API-запросов, но вы можете использовать любой удобный инструмент. Приведённые команды curl работают одинаково как для режима tracking server, так и для serverless; прокси-сервис прозрачно обрабатывает различия.

  1. Получите DNS-имя вашего ALB, выполнив следующую команду на рабочей станции:
    Формулы и расчет
    aws cloudformation describe-stacks --stack-name sagemaker-infra-flaskapp-{mlflowType} --query 'Stacks[0].Outputs[?OutputKey==`ALBUrl`].OutputValue' --output text
    
  2. Проверьте конечные точки MLflow API, выполнив следующие команды на рабочей станции. Замените <ALB DNS>, <EXP ID>, <RUN ID> и <RUN NAME> соответствующими значениями.
    1. Создайте эксперимент:

      curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/experiments/create -H "Content-Type: application/json" -d '{"name": "mlflow-experiment"}'
      
    2. Найдите эксперименты:

      curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/experiments/search -H "Content-Type: application/json" -d '{"max_results": 5}'
      
    3. Получите эксперимент:
      Формулы и расчет
      curl -X GET 'http://<ALB DNS>/ajax-api/2.0/mlflow/experiments/get?experiment_id=0'
      
    4. Создайте запуск внутри эксперимента:

      curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/runs/create -H "Content-Type: application/json" -d '{"experiment_id": <EXP ID>, "run_name": "<RUN NAME>"}'
      
    5. Получите список артефактов запуска:
      Формулы и расчет
      curl -X GET "http://<ALB DNS>/ajax-api/2.0/mlflow/artifacts/list?run_id=<RUN ID>"
      
    6. Установите тег для запуска:

      curl -X POST "http://<ALB DNS>/ajax-api/2.0/mlflow/runs/set-tag" -H "Content-Type: application/json" -d '{"run_id": "<RUN ID>", "key": "model_type","value": "api-test"}'
      
    7. Удалите запуск:

      curl -X POST http://<ALB DNS>/ajax-api/2.0/mlflow/runs/delete -H "Content-Type: application/json" -d '{"run_id": "<RUN ID>"}'
      

    Примечание: вы также можете открыть MLflow UI и увидеть изменения, которые вносите с помощью приведённых команд curl. Инструкции по запуску MLflow UI см. в статье Запуск MLflow UI с использованием предварительно подписанного URL.

Очистка

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

  1. Удалите ресурсы, управляемые CDK. Перейдите в корневой каталог клонированного репозитория на рабочей станции и выполните следующие команды. Для развёртывания на базе tracking server:
    Формулы и расчет
    npx cdk destroy --all -c mlflowType=tracking
    

    Для развёртывания на базе serverless app:

    Формулы и расчет
    npx cdk destroy --all -c mlflowType=serverless
    

    Примечание: сетевой стек и стек домена SageMaker используются совместно обоими режимами развёртывания. AWS CDK удаляет их только тогда, когда удалена последняя пара стеков MLflow или Flask app.

  2. Ручная очистка ресурсов. Некоторые ресурсы могут потребовать ручного удаления из-за политик хранения или зависимостей:
    1. Ведёрки Amazon S3:
      1. Перейдите в консоль Amazon S3.
      2. Определите ведёрки, созданные этим решением.
      3. Очистите каждое ведёрко и удалите его.
    2. Группы журналов Amazon CloudWatch:
      1. В консоли CloudWatch найдите группы журналов, связанные с этим решением.
      2. Удалите эти группы журналов.

Соображения по безопасности

При развёртывании этого решения в производственной среде рассмотрите следующие меры безопасности:

  • Настройте мониторинг Amazon CloudWatch для прокси-сервиса на базе Flask, чтобы отслеживать состояние приложения, выявлять аномалии и настраивать оповещения о подозрительной активности.
  • Внедрите ограничение частоты запросов для прокси-сервиса Flask, чтобы защититься от потенциальных атак отказа в обслуживании (DoS) и контролировать число запросов от отдельных клиентов. Для реализации правил на основе частоты можно использовать AWS WAF (web application firewall) вместе с ALB.
  • Разверните внутренний (не доступный из интернета) ALB, чтобы ограничить доступ к прокси только вашей частной сетью. Такая схема гарантирует, что к сервису сможет обращаться только трафик из вашей VPC или связанных сетей. Подключайтесь через VPC peering или AWS Transit Gateway.
  • Включите HTTPS-терминацию на уровне ALB для защищённой связи между клиентами и вашим приложением. Для выдачи и управления SSL/TLS-сертификатами можно использовать AWS Certificate Manager (ACM). Инструкции по настройке HTTPS listeners см. в документации по HTTPS listeners Application Load Balancer.

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

Заключение

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

Преимущества решения:

  • Интеграция с существующими корпоративными средствами безопасности.
  • Минимальные изменения в существующих рабочих процессах ML.
  • Снижение сложности развёртывания.
  • Интеграция через REST API.
  • Совместимость с корпоративными прокси-сервисами.

Что дальше

Попробуйте это решение в своей среде и расскажите о своём опыте в комментариях.


Материал — перевод статьи с английского.

Оригинал: Streamline external access to Amazon SageMaker MLflow using a REST API proxy