Руководство. Развертывание предварительно обученной модели классификации изображений в Функциях Azure с помощью PyTorch

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

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

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

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

  1. В окне терминала или командном окне запустите func --version, чтобы убедиться, что используется версия Azure Functions Core Tools 2.7.1846 или более поздняя.
  2. Выполните команду python --version (в ОС Linux и MacOS) или py --version (в ОС Windows), чтобы убедиться, что для Python возвращается версия 3.7 или более поздняя.

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

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

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

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

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

Перейдите к папке start и выполните следующие команды для создания и активации виртуальной среды с именем .venv.

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

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

sudo apt-get install python3-venv

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

Создание локального проекта службы "Функции"

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

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

    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 в папке start:

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

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

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

Чтобы изменить функцию classify для классификации изображений на основе его содержимого, используйте предварительно обученную модель ResNet. Предварительно обученная модель, которая поступает от PyTorch, относит изображение к 1 из 1000 классов ImageNet. Затем вы добавите в проект вспомогательный код и зависимости.

  1. В папке start выполните следующую команду, чтобы скопировать код прогнозирования и метки в папку classify.

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

  3. Откройте начальный или requirements.txt в текстовом редакторе и добавьте зависимости, необходимые для вспомогательного кода, которые должны выглядеть следующим образом:

    azure-functions
    requests
    -f https://download.pytorch.org/whl/torch_stable.html
    torch==1.13.0+cpu
    torchvision==0.14.0+cpu
    

    Совет

    Версии torch и torchvision должны соответствовать значениям, перечисленным в таблице версий репозитория зрения PyTorch.

  4. Сохраните requirements.txt, а затем выполните следующую команду из папки start, чтобы установить зависимости.

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

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

Совет

В ОС Windows может возникнуть ошибка "Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:" (Не удалось установить пакеты из-за ошибки среды: [среда № 2]. Не существует такого файла или папки:), после которой указан длинный путь к файлу, например sharded_mutable_dense_hashtable.cpython-37.pyc. Как правило, эта ошибка возникает из-за слишком длинного пути к папке. В этом случае задайте для раздела реестра HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystem@LongPathsEnabled значение 1, чтобы включить длинные пути. Можно также проверить, где установлен интерпретатор Python. Если у этого расположения длинный путь, попробуйте переустановить интерпретатор в папке с более коротким путем.

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

  1. Чтобы импортировать стандартную библиотеку JSON и вспомогательные функции predict, откройте файл classify/__init__.py в текстовом редакторе и добавьте приведенные ниже строки после существующих инструкций 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 из вспомогательной библиотеки, чтобы скачать и классифицировать изображение с помощью модели PyTorch. Затем функция возвращает ответ 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-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    
  5. Оставьте узел запущенным, так как он используется на следующем шаге.

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

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

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

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

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

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

    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/Bernese-Mountain-Dog-Temperament-long.jpg
    • https://github.com/Azure-Samples/functions-python-pytorch-tutorial/blob/master/resources/assets/bald-eagle.jpg?raw=true
    • https://raw.githubusercontent.com/Azure-Samples/functions-python-pytorch-tutorial/master/resources/assets/penguin.jpg
  5. Нажмите кнопку Отправить, чтобы вызвать конечную точку функции для классификации изображения.

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

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

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

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

Дальнейшие действия

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

См. также