Узнайте, как развернуть модель ResNet50 с помощью среды выполнения ONNX и функций Azure! Мы используем среду выполнения ONNX, потому что она ускоряет вывод и предлагает кросс-платформенные возможности.
Наша модель уже находится в формате ONNX, поэтому мы не будем рассматривать преобразование модели в этом блоге. Если вы хотите узнать больше о преобразовании вашей модели для использования этих возможностей, ознакомьтесь с примерами ONNX GitHub и ONNX Runtime Docs.
Видеоурок:
Предпосылки
- Учетная запись Azure с активной подпиской. "Создайте учетную запись бесплатно".
- Основные инструменты функций Azure версии 3.x.
- Версии Python, поддерживаемые Функциями Azure
- Visual Studio Code на одной из поддерживаемых платформ.
- Расширение Python для Visual Studio Code.
- Расширение функций Azure для Visual Studio Code.
- Почтальон для тестирования конечной точки
Этапы развертывания с помощью функций Azure
- Следуйте этим инструкциям, чтобы создать HTTP Python Azure Function with VS Code. Если вы предпочитаете, чтобы функция выполнялась по расписанию, а не по запросам, выберите
timer
type при создании функции. - Теперь, когда вы создали функцию, давайте обновим скрипт score
__init__.py
. Ниже мы разберем каждый шаг в сценарии.
- Сначала импортируйте пакеты:
import logging
import azure.functions as func
import base64
import numpy as np
import cv2
import io
import onnxruntime as ort
- Затем добавьте основную функцию записи для функции Azure. Мы реализовали эту функцию, чтобы ожидать закодированное изображение base64.
def main(req: func.HttpRequest) -> func.HttpResponse: logging.info('Python HTTP trigger function processed request.')
# Get the img value from the post. img_base64 = req.params.get('img') if not img_base64: try: req_body = req.get_json() except ValueError: pass else: img_base64 = req_body.get('img')
if img_base64: # decode image img = decode_base64(img_base64)
# preprocess image img = preprocess(img)
# load model model_path = '../model/resnet50v2.onnx'
# run model
outputs = run_model(model_path, img)# map output to class and return result string. return func.HttpResponse(f"The image is a {map_outputs(outputs)}") else: return func.HttpResponse( "This HTTP triggered function successfully.", status_code=200 )
- Ниже приведены вспомогательные функции, вызываемые для декодирования строки base64 и предварительной обработки изображения.
# decode base64 image def decode_base64(data): img = base64.b64decode(data) img = cv2.imdecode(np.fromstring(img, np.uint8), cv2.IMREAD_COLOR) img = cv2.resize(img, (224, 224)) img = img.transpose((2,0,1)) img = img.reshape(1, 3, 224, 224) return img
# preprocess image def preprocess(img_data): mean_vec = np.array([0.485, 0.456, 0.406]) stddev_vec = np.array([0.229, 0.224, 0.225]) norm_img_data = np.zeros(img_data.shape).astype('float32') for i in range(img_data.shape[0]): # for each pixel and channel # divide the value by 255 to get value between [0, 1] norm_img_data[i,:,:] = (img_data[i,:,:]/255 - mean_vec[i]) / stddev_vec[i] return norm_img_data
#load text file as list def load_labels(path): labels = [] with open(path, 'r') as f: for line in f: labels.append(line.strip()) return labels
# map mobilenet outputs to classes def map_outputs(outputs): labels = load_labels('../data/imagenet_classes.txt') return labels[np.argmax(outputs)]
- Добавьте функцию
run_model
для создания и запускаInferenceSession
def run_model(model_path, img): ort_sess = ort.InferenceSession(model_path) outputs = ort_sess.run(None, {'data': img}) return outputs
3. Обновите requirements.txt
Добавьте следующие пакеты в файл требований:
azure-functions
numpy
onnxruntime
opencv-python
4. Добавьте файлы модели и этикеток в проект в папку ImageNetHttpTrigger
.
- Модель можно скачать из модельного зоопарка. В этом примере мы использовали ResNet50v2.
- Оригинальный текстовый файл классов можно найти здесь. Тот, что используется для этого примера, немного упрощен. Упрощенный файл можно найти здесь в репозитории GitHub для этого примера.
5. Далее мы проверим функцию локально с помощью Postman.
- Сначала вам нужно преобразовать изображение в строку base64 для отправки в конечную точку.
# get base64 encoded image img_path = '../image/goldfish.jpg' with open(img_path, "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) img_base64 = encoded_string.decode('utf-8') print(img_base64)
Затем откройте Postman, чтобы отправить строку в конечную точку локальной функции:
- В Postman создайте запрос.
- Выберите
POST
- Вставьте локальный URL
- Выберите
body
,raw
иjson
. - Вставьте в тело json.
- Нажмите
f5
, чтобы запустить функцию локально в VS Code. - После запуска функции выберите конечную точку и нажмите «Отправить».
6. Следуйте инструкциям по развертыванию в Azure с VS Code.
- После создания функции в Azure возьмите конечную точку и снова протестируйте ее в Postman.
Использование бессерверных технологий для развертывания моделей машинного обучения очень полезно, но это не единственный способ ввести модель в действие. Оставайтесь с нами, чтобы узнать больше о том, как развертывать модели с помощью Azure!
Ресурсы: ONNX Model Zoo, источник на GitHub, YouTube Video, ONNX Runtime Docs