Руководство. Применение моделей машинного обучения в Azure Functions с помощью Python и TensorFlow

В этой статье вы узнаете, как использовать Python, TensorFlow и Azure Functions с моделью машинного обучения для классификации изображения на основе его содержимого. Поскольку вся работа выполняется локально и в облаке не создаются ресурсы Azure, выполнение этого руководства не требует затрат.

  • Инициализация локальной среды для разработки Azure Functions в Python.
  • Импорт настраиваемой модели машинного обучения TensorFlow в приложение-функцию.
  • Создание бессерверного HTTP API для определения, содержит ли изображение собаку или кота.
  • Вызвать API из веб-приложения.

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

Проверка предварительных условий

  1. В окне терминала или командной строки запустите func --version, чтобы убедиться, что Azure Functions Core Tools версии 2.7.1846 или более поздней.
  2. Запустите python --version (Linux/macOS) или py --version (Windows), чтобы проверить, что ваша версия Python — 3.7.x.

Клонирование репозитория руководства

  1. В окне терминала или командном окне клонируйте следующий репозиторий, используя Git.

    git clone https://github.com/Azure-Samples/functions-python-tensorflow-tutorial.git
    
  2. Перейдите в папку и изучите ее содержимое.

    cd functions-python-tensorflow-tutorial
    
    • start — это папка для работы с этим учебником;
    • end — это итоговый результат и полная реализация для вашего ознакомления.
    • resources — папка с моделью машинного обучения и вспомогательными библиотеками;
    • frontend — папка с веб-сайтом, который вызывает приложение-функцию.

Создание и активация виртуальной среды Python

Перейдите к папке start и выполните следующие команды для создания и активации виртуальной среды с именем .venv. Обязательно используйте Python 3.7, который поддерживается Azure Functions.

cd start
python -m venv .venv
source .venv/bin/activate

Если Python не установил пакет venv в вашем дистрибутиве Linux, выполните следующую команду:

sudo apt-get install python3-venv

Все последующие команды будут выполняться в этой активированной виртуальной среде. (Чтобы выйти из виртуальной среды, выполните команду deactivate.)

Создать локальный проект функций

В Azure Functions проект функции — это контейнер для одной или нескольких отдельных функций, которые каждый отвечает на конкретный триггер. Все функции в проекте совместно используют те же локальные конфигурации и конфигурации размещения. В этом разделе вы создадите проект функции, содержащий одну шаблонную функцию с именем classify, которая предоставляет конечную точку HTTP. Вы добавите более конкретный код в одном из следующих разделов.

  1. В папке start используйте Azure Functions Core Tools для инициализации приложения-функции Python:

    func init --worker-runtime python
    

    После инициализации папка start содержит различные файлы проекта, включая файлы конфигурации local.settings.json и host.json. Так как local.settings.json может содержать секреты, скачанные из Azure, файл по умолчанию исключается из системы управления версиями в файле .gitignore.

    Совет

    Так как проект функций привязан к определенной среде выполнения, все функции в проекте должны быть написаны на одном языке.

  2. Добавьте функцию в проект с помощью следующей команды, где аргумент --name — уникальное имя функции, а аргумент --template указывает триггер функции. С помощью func new создайте вложенную папку с именем функции, которая содержит файл кода на выбранном для проекта языке и файл конфигурации function.json.

    func new --name classify --template "HTTP trigger"
    

    Эта команда создает папку classify, которая соответствует имени функции. В этой папке содержатся два файла: __init__.py, содержащий код функции, и function.json, который описывает триггер функции и его входные и выходные привязки. Дополнительные сведения о содержимом этих файлов см. в разделе Программная модель руководства разработчика Python.

Локальное выполнение функции

  1. Запустите функцию, запуская локальный узел среды выполнения Azure Functions в папке :

    func start
    
  2. После отображения конечной точки classify в выходных данных перейдите по URL-адресу http://localhost:7071/api/classify?name=Azure. В выходных данных должно появиться сообщение "Hello Azure!".

  3. Чтобы остановить хост, используйте клавиши CTRL-C.

Импорт модели TensorFlow и добавление вспомогательного кода

Чтобы изменить функцию classify для классификации изображения на основе его содержимого, используйте предварительно созданную модель TensorFlow, которая была обучена и экспортирована из службы пользовательского визуального распознавания Azure. Модель, которая содержится в папке resources в примере, клонированном ранее, классифицирует изображение, определяя, кто на нем: кошка или собака. Затем вы добавите в проект вспомогательный код и зависимости.

Чтобы создать собственную модель с помощью бесплатного уровня службы пользовательского визуального распознавания, следуйте инструкциям в репозитории проекта sample.

Совет

Если вы хотите разместить модель TensorFlow независимо от приложения-функции, вы можете подключить общую папку, содержащую модель, к приложению-функции Linux. Дополнительные сведения см. в разделе "Подключение общих папок".

  1. В папке start выполните следующую команду, чтобы скопировать файлы модели в папку classify. Не забудьте добавить \* в эту команду.

    cp ../resources/model/* classify
    
  2. Убедитесь, что файлы model.pb и labels.txt находятся в папке classify. В противном случае убедитесь, что вы выполнили команду в папке start.

  3. В папке start выполните следующую команду, чтобы скопировать файл с вспомогательным кодом в папку classify:

    cp ../resources/predict.py classify
    
  4. Убедитесь, что файл predict.py находится в папке classify.

  5. Откройте в текстовом редакторе файл start/requirements.txt и добавьте в него следующие зависимости, требуемые вспомогательному коду.

    tensorflow==1.14
    Pillow
    requests
    
  6. Сохраните файл requirements.txt.

  7. Установите зависимости, выполнив следующую команду в папке start: Установка может занять несколько минут. В это время можно перейти к изменению функции в следующем разделе.

    pip install --no-cache-dir -r requirements.txt
    

    На Windows вы можете столкнуться с ошибкой: "Не удалось установить пакеты из-за ошибки среды: [Errno 2] Нет такого файла или каталога:", после которой следует длинное имя пути к файлу, например sharded_mutable_dense_hashtable.cpython-37.pyc. Как правило, эта ошибка возникает из-за слишком длинного пути к папке. В этом случае установите значение 1 для ключа реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled, чтобы включить длинные пути. Кроме того, проверьте, где установлен Python интерпретатор. Если у этого расположения длинный путь, попробуйте переустановить в папке с более коротким путем.

Совет

При вызове predict.py для создания первого прогноза функция _initialize загружает модель TensorFlow с диска и кэширует ее в глобальных переменных. Благодаря этому кэшированию последующие прогнозы ускоряются.

Обновление функции для выполнения прогнозов

  1. Чтобы импортировать стандартную библиотеку JSON и вспомогательные функции predict, откройте файл import в текстовом редакторе и добавьте приведенные ниже строки после существующих инструкций .

    import logging
    import azure.functions as func
    import json
    
    # Import helper script
    from .predict import predict_image_from_url
    
  2. Замените все содержимое функции main следующим кодом:

    def main(req: func.HttpRequest) -> func.HttpResponse:
        image_url = req.params.get('img')
        logging.info('Image URL received: ' + image_url)
    
        results = predict_image_from_url(image_url)
    
        headers = {
            "Content-type": "application/json",
            "Access-Control-Allow-Origin": "*"
        }
    
        return func.HttpResponse(json.dumps(results), headers = headers)
    

    Эта функция получает URL-адрес изображения в параметре строки запроса с именем img. Затем она вызывает predict_image_from_url из вспомогательной библиотеки, чтобы скачать и классифицировать изображение с помощью модели TensorFlow. Затем функция возвращает ответ HTTP с результатами.

    Внимание

    Так как конечная точка HTTP вызывается веб-страницей, размещенной в другом домене, ответ содержит заголовок Access-Control-Allow-Origin в соответствии с требованиями к общему доступу к ресурсам независимо от источника (CORS), предъявляемыми браузером.

    В рабочем приложении измените * на источник веб-страницы для повышения безопасности.

  3. Сохраните изменения, а затем, при условии, что зависимости установлены, снова запустите локальный хост функций с помощью func start. Не забудьте запустить хост в папке start с активированной виртуальной средой. В противном случае хост запустится, но при вызове функции возникнут ошибки.

    func start
    
  4. В браузере откройте следующий URL-адрес для вызова функции с URL-адресом изображения кота и убедитесь, что возвращенный JSON классифицирует изображение как изображение с котом.

    http://localhost:7071/api/classify?img=https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    
  5. Оставьте хост запущенным, поскольку он будет использоваться на следующем шаге.

Запуск интерфейса локального веб-приложения для проверки функции

Чтобы проверить вызов конечной точки функции из другого веб-приложения, можно воспользоваться простым приложением, расположенным в папке frontend репозитория.

  1. Откройте новый терминал или командную строку и активируйте виртуальную среду (как описано ранее в разделе Create и активируйте виртуальную среду Python).

  2. Перейдите в папку frontend в репозитории.

  3. Запустите HTTP-сервер с Python:

    python -m http.server
    
  4. В браузере перейдите по адресу localhost:8000, введите один из следующих URL-адресов фотографий в текстовое поле или используйте URL-адрес любого общедоступного изображения.

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/cat2.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog1.png
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-tensorflow-tutorial/master/resources/assets/samples/dog2.png
  5. Нажмите кнопку Отправить, чтобы вызвать конечную точку функции для классификации изображения.

    Снимок экрана готового проекта

    Если при попытке отправить URL-адрес изображения браузер выдает сообщение об ошибке, проверьте терминал, в котором выполняется приложение-функция. Если отображается сообщение об ошибке наподобие "No module found 'PIL'" (Не найден модуль PIL), возможно, вы запустили приложение-функцию в папке start без предварительной активации созданной ранее виртуальной среды. Если ошибки по-прежнему отображаются, снова запустите pip install -r requirements.txt с активированной виртуальной средой и найдите ошибки.

Примечание.

Модель всегда классифицирует содержимое изображения как "Кошка" или "Собака", независимо от того, есть ли на изображении одно из этих животных. По умолчанию изображение классифицируется как "Собака". Например, изображения тигров и пантер классифицируются как "Кошка", а изображения слонов, морковок или самолетов — как "Собака".

Очистка ресурсов

Поскольку данное руководство выполняется локально на вашем компьютере, нет необходимости удалять ресурсы или службы Azure.

Следующие шаги

В этом руководстве вы узнали, как создать и настроить конечную точку API HTTP с помощью Azure Functions для классификации изображений с помощью модели TensorFlow. Вы также научились вызывать API из веб-приложения. Вы можете использовать методы, описанные в этом руководстве, для создания API любой сложности, при этом задействуя бессерверную вычислительную модель, предоставляемую Azure Functions.

См. также: