Руководство по Применение моделей машинного обучения в Функциях Azure с использованием Python и TensorFlow
В этой статье вы узнаете, как классифицировать изображение на основе его содержимого с помощью модели машинного обучения, используя Python, TensorFlow и Функции Azure. Так как вся работа выполняется локально и никакие ресурсы Azure не создаются в облаке, вы не понесете никакие затраты на прохождение этого учебника.
- Инициализация локальной среды разработки Функций Azure в Python.
- Импорт настраиваемой модели машинного обучения TensorFlow в приложение-функцию.
- Создание бессерверного API HTTP для классификации изображения как изображения с собакой или котом.
- Использование API из веб-приложения.
Предварительные требования
- Учетная запись Azure с активной подпиской. Создайте учетную запись бесплатно.
- Python версии 3.7.4. (Python 3.7.4 и Python 3.6.x совместимы с Функциями Azure. Python 3.8 и более поздние версии пока не поддерживаются.)
- 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-tensorflow-tutorial.git
Перейдите в папку и изучите ее содержимое.
cd functions-python-tensorflow-tutorial
- start — это папка для работы с этим учебником;
- end — справочная папка с итоговым результатом проекта и полной его реализацией;
- resources — папка с моделью машинного обучения и вспомогательными библиотеками;
- frontend — папка с веб-сайтом, который вызывает приложение-функцию.
Создание и активация виртуальной среды Python
Перейдите к папке start и выполните следующие команды для создания и активации виртуальной среды с именем .venv
. Обязательно используйте версию Python 3.7, которую поддерживают Функции Azure.
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.
Импорт модели TensorFlow и добавление вспомогательного кода
Чтобы изменить функцию classify
для классификации изображения на основе его содержимого, используйте предварительно созданную модель TensorFlow, которая была обучена и экспортирована из службы "Пользовательское визуальное распознавание Azure". Модель, которая содержится в папке resources в примере, клонированном ранее, классифицирует изображение, определяя, кто на нем: кошка или собака. Затем вы добавите в проект вспомогательный код и зависимости.
Чтобы создать собственную модель с помощью службы "Пользовательское визуальное распознавание" уровня "Бесплатный", следуйте инструкциям из репозитория примера проекта.
Совет
Если вы хотите разместить модель TensorFlow независимо от приложения-функции, вы можете подключить общую папку, содержащую модель, к приложению-функции Linux. Подробные сведения см. в статье Подключение общей папки к приложению-функции Python с помощью Azure CLI.
В папке start выполните следующую команду, чтобы скопировать файлы модели в папку classify. Не забудьте добавить
\*
в эту команду.cp ../resources/model/* classify
Убедитесь, что файлы model.pb и labels.txt находятся в папке classify. В противном случае убедитесь, что вы выполнили команду в папке start.
В папке start выполните следующую команду, чтобы скопировать файл с вспомогательным кодом в папку classify:
cp ../resources/predict.py classify
Убедитесь, что файл predict.py находится в папке classify.
Откройте в текстовом редакторе файл start/requirements.txt и добавьте в него следующие зависимости, требуемые вспомогательному коду.
tensorflow==1.14 Pillow requests
Сохраните файл 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. Если у этого расположения длинный путь, попробуйте переустановить интерпретатор в папке с более коротким путем.
Совет
При вызове predict.py для создания первого прогноза функция _initialize
загружает модель TensorFlow с диска и кэширует ее в глобальных переменных. Благодаря этому кэшированию последующие прогнозы ускоряются. Дополнительные сведения об использовании глобальных переменных см. в справочнике разработчика Python по Функциям Azure.
Обновление функции для выполнения прогнозов
Чтобы импортировать стандартную библиотеку 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
из вспомогательной библиотеки, чтобы скачать и классифицировать изображение с помощью модели TensorFlow. Затем функция возвращает ответ 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-tensorflow-tutorial/master/resources/assets/samples/cat1.png
Оставьте узел запущенным, так как он используется на следующем шаге.
Запуск интерфейса локального веб-приложения для проверки функции
Чтобы проверить вызов конечной точки функции из другого веб-приложения, можно воспользоваться простым приложением, расположенным в папке frontend репозитория.
Откройте новое окно терминала или командное окно и активируйте виртуальную среду (как описано выше в разделе Создание и активация виртуальной среды Python).
Перейдите в папку frontend в репозитории.
Запустите HTTP-сервер с Python.
python -m http.server
В браузере перейдите по адресу
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
Нажмите кнопку Отправить, чтобы вызвать конечную точку функции для классификации изображения.
Если при попытке отправить URL-адрес изображения браузер выдает сообщение об ошибке, проверьте терминал, в котором выполняется приложение-функция. Если отображается сообщение об ошибке наподобие "No module found 'PIL'" (Не найден модуль PIL), возможно, вы запустили приложение-функцию в папке start без предварительной активации созданной ранее виртуальной среды. Если ошибки по-прежнему отображаются, снова запустите
pip install -r requirements.txt
с активированной виртуальной средой и найдите ошибки.
Примечание
Модель всегда классифицирует содержимое изображения как "Кошка" или "Собака", независимо от того, есть ли на изображении одно из этих животных. По умолчанию изображение классифицируется как "Собака". Например, изображения тигров и пантер классифицируются как "Кошка", а изображения слонов, морковок или самолетов — как "Собака".
Очистка ресурсов
Все инструкции из этого учебника выполняются локально на вашем компьютере, поэтому нет необходимости в очистке ресурсов или служб Azure.
Дальнейшие действия
Из этого учебника вы узнали, как создать и настроить конечную точку API HTTP с помощью Функций Azure для классификации изображений с использованием модели TensorFlow. Вы также научились вызывать API из веб-приложения. С помощью описанных в этом руководстве методов можно создавать API любой сложности, работая при этом в бессерверной вычислительной модели, которую предоставляют Функции Azure.
См. также
- Руководство. Создание и развертывание бессерверных функций Azure на языке Python с помощью Visual Studio Code.
- Azure Functions Python Developer Guide (Справочник по Функциям Azure для разработчика Python)
- Подключение общей папки к приложению-функции Python с помощью Azure CLI