Развертывание моделей машинного обучения Python в Функциях Azure

Функциональное программирование в чистом виде не подразумевает никакого состояния и никаких побочных эффектов при вызове (поскольку нет состояния). Функции Azure (аналогично AWS Lambda и Google Cloud Functions) - это изящная концепция, в которой не требуется какой-либо явной инфраструктуры, вы просто развертываете функцию и ссылаетесь на нее через конечную точку (URI).

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

Настроить легко: перейдите на портал Azure и запустите обычную команду «Создать» и выполните поиск по запросу «Функции».

Недостаточно хорошо задокументировано то, что вам необходимо установить как пакет узла (npm install -g azure-functions-core-tools) , так и пакет python через pip (pip install azure -функции), если вы пишете на Python в Visual Studio Code.

На некоторых языках есть онлайн-редактор на портале Azure, что неплохо (хотя и опасно). Для Python вам необходимо использовать внешний редактор, например VS Code, и установить расширения.

На вкладке Azure (внизу слева) вы можете создать функцию с помощью (+) молнии.

Выберите свой язык (Python) и дайте ему имя (AzMLHttpTrigger в моем случае).

Как видите, VS Code дает вам довольно простое, но функциональное (без каламбура) представление вашего кода и структур.

Сам код прост, поскольку это всего лишь одна функция без состояния. (Обратите внимание, что я обманываю, поддерживая карту моделей {}, которая выгружается по истечении времени ожидания моего приложения).

Распакуйте модель (см. Этот блокнот для получения полной информации об обучении или эту статью), вытащите параметры из тела POST и всего метода model.predict (param).

models = {}
def main(req: func.HttpRequest) -> func.HttpResponse:    
    if (len(models) == 0):
        models['XGB2'] = joblib.load('xgb_model.pkl')
        models['ISO'] = joblib.load('iso_model.pkl')
    else:
        logging.info('loaded already: ' +str(models))
    if (models.getreq.params.get('model')) is None):
        print('model not found: ',model)
        return func.HttpResponse("[-1]")
j_data = np.array( .get_json()['data'])
    y_hat = np.array2string(models[model].predict(j_data))
return func.HttpResponse(f"Hello {y_hat}")

Нажмите «F5» в VS Code, чтобы запустить его на локальном веб-сервере и протестировать в Postman, чтобы убедиться, что все работает правильно с предыдущей моделью.

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

Анализ эффективности

Самая большая проблема с Функциями Azure - это чисто виртуальная функция - здесь нет устойчивого состояния или кэширования. Это хорошо с точки зрения ресурсов и простоты, но явно не масштабируется и не работает.

  • Каждый раз, когда вы вызываете функцию, если она не вызывалась в последнее время, она перезагружает состояние из скетча (в данном случае модели удаления травления).
  • Удаление травления происходит относительно медленно - я тестировал с некоторыми примерами ниже, линейно по размеру файла, но минимум 0,4 мс по сравнению с ссылкой на локальную память ~ 100 нс.
  • Для тех, кто не помнит 1 мс = 1000 мкс = 1000000 нс - см. Эту таблицу Норвига, прославленную Джеффом Дином.

Совместимость

Мне было приятно узнать, что моя модель AutoML работает (в отличие от моего опыта развертывания моделей Azure AutoML в контейнере Python-Flask). Как уже упоминалось, мне не нравятся его рабочие характеристики, но если это будет бесплатно по цене 200 мс, я возьму его.

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

Разработка довольно проста - учитывая, что это всего лишь функция, у вас есть довольно простое поле для кода.

Развертывание можно выполнить с помощью регистрации на GitHub и автоматического развертывания, но его не так легко настроить, как для веб-приложений. В этой статье описывается настройка Azure Pipeline for Functions вручную.

Анализ затрат

Я ищу самый дешевый способ разместить модели машинного обучения. Я обнаружил, что контейнеры Azure ML ACI очень дороги. Развертывание отдельной виртуальной машины Flask - это нормально, но все же стоит мне 14 долларов в месяц. В базовой ценовой модели количество бесплатных исполнений довольно велико, так что это может быть самый дешевый способ перейти на демонстрационный сайт!

Учитывая, что это единственный способ развернуть мою модель AutoML (LightBGM), я обновлю свое Приложение Full Stack ML, которое я описал в прошлом месяце.