Развертывание моделей машинного обучения 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, которое я описал в прошлом месяце.