Узнайте, как развернуть модель ResNet50 с помощью среды выполнения ONNX и функций Azure! Мы используем среду выполнения ONNX, потому что она ускоряет вывод и предлагает кросс-платформенные возможности.

Наша модель уже находится в формате ONNX, поэтому мы не будем рассматривать преобразование модели в этом блоге. Если вы хотите узнать больше о преобразовании вашей модели для использования этих возможностей, ознакомьтесь с примерами ONNX GitHub и ONNX Runtime Docs.

Видеоурок:

Предпосылки

Этапы развертывания с помощью функций Azure

  1. Следуйте этим инструкциям, чтобы создать HTTP Python Azure Function with VS Code. Если вы предпочитаете, чтобы функция выполнялась по расписанию, а не по запросам, выберите timertype при создании функции.
  2. Теперь, когда вы создали функцию, давайте обновим скрипт 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