Руководство. Развертывание предварительно обученной модели классификации изображений в Функциях Azure с помощью PyTorch
В этой статье вы узнаете, как использовать Python, PyTorch и Функции Azure для загрузки предварительно обученной модели классификации изображений на основе его содержимого. Так как вы выполняете все действия локально и не создаете ресурсы Azure в облаке, выполнение этого руководства не требует затрат.
- Инициализация локальной среды разработки Функций Azure в Python.
- Импорт обученной модели машинного обучения PyTorch в приложение-функцию.
- Создание бессерверного API HTTP для классификации как одного из 1000 классов ImageNet.
- Использование API из веб-приложения.
Предварительные требования
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.
- Python 3.7.4 или более поздней версии. (Python 3.8.x и Python 3.6.x также проверяются с помощью Функций Azure.)
- Azure Functions Core Tools.
- Редактор кода, например Visual Studio Code.
Проверка предварительных условий
- В окне терминала или командном окне запустите
func --version
, чтобы убедиться, что используется версия Azure Functions Core Tools 2.7.1846 или более поздняя. - Выполните команду
python --version
(в ОС Linux и MacOS) илиpy --version
(в ОС Windows), чтобы убедиться, что для Python возвращается версия 3.7 или более поздняя.
Клонирование репозитория руководства
В окне терминала или командном окне клонируйте следующий репозиторий, используя Git.
git clone https://github.com/Azure-Samples/functions-python-pytorch-tutorial.git
Перейдите в папку и изучите ее содержимое.
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. Мы добавим более конкретный код для нее в одном из следующих разделов.
В папке start инициализируйте приложение-функцию Python с помощью Azure Functions Core Tools.
func init --worker-runtime python
После инициализации папка start содержит различные файлы проекта, включая файлы конфигурации local.settings.json и host.json. Файл local.settings.json может содержать секреты, скачанные из Azure, поэтому файл по умолчанию исключен из системы управления версиями в GITIGNORE-файле.
Совет
Так как проект функций привязан к определенной среде выполнения, все функции в проекте должны быть написаны на одном языке.
Добавьте функцию в проект с помощью следующей команды, где аргумент
--name
— уникальное имя функции, а аргумент--template
указывает триггер функции. С помощьюfunc new
создайте вложенную папку с именем функции, которая содержит файл кода на выбранном для проекта языке и файл конфигурации function.json.func new --name classify --template "HTTP trigger"
Эта команда создает папку classify, которая соответствует имени функции. В этой папке содержатся два файла: __init__.py, содержащий код функции, и function.json, который описывает триггер функции и его входные и выходные привязки. Дополнительные сведения о содержимом этих файлов см. в разделе Модель программирования в руководстве разработчика python.
Локальное выполнение функции
Активируйте функцию, запустив локальное хост-приложение среды выполнения Функций Azure в папке start:
func start
Когда в выходных данных отобразится конечная точка
classify
, перейдите по URL-адресуhttp://localhost:7071/api/classify?name=Azure
. В выходных данных должно появиться сообщение "Hello Azure!".Чтобы остановить хост, используйте клавиши CTRL-C.
Импорт модели PyTorch и добавление вспомогательного кода
Чтобы изменить функцию classify
для классификации изображений на основе его содержимого, используйте предварительно обученную модель ResNet. Предварительно обученная модель, которая поступает от PyTorch, относит изображение к 1 из 1000 классов ImageNet. Затем вы добавите в проект вспомогательный код и зависимости.
В папке start выполните следующую команду, чтобы скопировать код прогнозирования и метки в папку classify.
cp ../resources/predict.py classify cp ../resources/labels.txt classify
Убедитесь, что файлы predict.py и labels.txt находятся в папке classify. В противном случае убедитесь, что вы выполнили команду в папке start.
Откройте начальный или 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.
Сохраните 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. Если у этого расположения длинный путь, попробуйте переустановить интерпретатор в папке с более коротким путем.
Обновление функции для выполнения прогнозов
Чтобы импортировать стандартную библиотеку 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
Замените все содержимое функции
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), предъявляемыми браузером.В рабочем приложении измените
*
на источник веб-страницы для повышения безопасности.Сохраните изменения, а затем, предполагая, что зависимости установлены, снова запустите локальный узел функции с помощью
func start
. Не забудьте запустить узел в папке start с активированной виртуальной средой. В противном случае узел запустится, но при вызове функции вы увидите ошибки.func start
В браузере откройте следующий 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
Оставьте узел запущенным, так как он используется на следующем шаге.
Запуск интерфейса локального веб-приложения для проверки функции
Чтобы проверить вызов конечной точки функции из другого веб-приложения, можно воспользоваться простым приложением, расположенным в папке frontend репозитория.
Откройте новое окно терминала или командное окно и активируйте виртуальную среду (как описано выше в разделе Создание и активация виртуальной среды Python).
Перейдите в папку frontend в репозитории.
Запустите HTTP-сервер с Python.
python -m http.server
В браузере перейдите по адресу
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
Нажмите кнопку Отправить, чтобы вызвать конечную точку функции для классификации изображения.
Если при попытке отправить URL-адрес изображения браузер выдает сообщение об ошибке, проверьте терминал, в котором выполняется приложение-функция. Если отображается сообщение об ошибке наподобие "No module found 'PIL'" (Не найден модуль PIL), возможно, вы запустили приложение-функцию в папке start без предварительной активации созданной ранее виртуальной среды. Если ошибки по-прежнему отображаются, снова запустите
pip install -r requirements.txt
с активированной виртуальной средой и найдите ошибки.
Очистка ресурсов
Все инструкции из этого учебника выполняются локально на вашем компьютере, поэтому нет необходимости в очистке ресурсов или служб Azure.
Дальнейшие действия
Из этого учебника вы узнали, как создать и настроить конечную точку API HTTP с помощью Функций Azure для классификации изображений с использованием модели PyTorch. Вы также научились вызывать API из веб-приложения. С помощью описанных в этом руководстве методов можно создавать API любой сложности, работая при этом в бессерверной вычислительной модели, которую предоставляют Функции Azure.
См. также
- Руководство. Создание и развертывание бессерверных функций Azure на языке Python с помощью Visual Studio Code.
- Azure Functions Python Developer Guide (Справочник по Функциям Azure для разработчика Python)