Обслуживание модели PyTorch с помощью FastAPI и Docker

Обслуживание модели PyTorch с помощью FastAPI и Docker стиль, эффективность и преимущества

Фото от SpaceX на Unsplash

Узнайте, как разрабатывать полный сервис машинного обучения

Вступление

Работа над личными проектами машинного/глубинного обучения очень увлекательна. Вечером, перед ноутбуком, вы пишете код ваших проектов, читаете интересные статьи, и у вас нет сроков выполнения заданий. Мы все знаем, что программирование только хорошо, если вы не делаете это на работе! 😂

Тем не менее, даже если это всего лишь личный проект, одно из самых больших удовлетворений наступает, когда то, что вы сделали, начинает использоваться другими людьми. Так что вам нужно сделать вашу модель доступной для других и изучить правильные инструменты для этого. В этой статье я покажу вам, как обслуживать модель глубинного обучения, разработанную с использованием PyTorch, с помощью FastAPI и Docker.

Изображение автора

Настройка сервера с использованием FastAPI

Сначала мы создаем модель компьютерного зрения. Эта модель будет способна распознавать изображения с котами и рыбами. Для этого мы берем предварительно обученную нейронную сеть типа ResNet50 и изменяем последний слой классификации так, чтобы вывод был бинарным.

Я поместил следующий код в файл с именем model.py

from torchvision import modelsimport torch.nn as nnCatfishClasses = ["кот", "рыба"]CatfishModel = models.resnet50()CatfishModel.fc = nn.Sequential(    nn.Linear(CatfishModel.fc.in_features, 500),    nn.ReLU(),    nn.Dropout(),    nn.Linear(500, 2))

Теперь мы создаем экземпляр сервера с помощью FastAPI, к которому могут подключаться клиенты, чтобы запросить у нашей модели сделать предсказания.

from PIL import Imagefrom torchvision import transformsimport torchimport osfrom fastapi import FastAPIfrom fastapi.responses import JSONResponsefrom .model import CatfishModel, CatfishClassesfrom io import BytesIOfrom fastapi import HTTPExceptionimport requestsapp = FastAPI()def open_image(image_path):    # Добавьте здесь необходимую логику предварительной обработки изображения    image = Image.open(image_path)    return imagedef load_model():    return CatfishModel@app.get("/")def status():    return {"status"…