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

Существуют проблемы, связанные с проектами ML, когда они создаются и выполняются разными разработчиками в команде или иным образом. Иногда зависимости могут не совпадать, вызывая проблемы для других зависимых библиотек в том же проекте. Кроме того, вам также необходимо иметь четкую документацию по каждому шагу, если вы предоставляете проект, который должен быть выполнен определенным образом.

Все это можно сделать проще и быстрее с помощью Docker. Контейнеризация позволяет сэкономить много времени и и упростить процесс развертывания приложения в долгосрочной перспективе.

Если вы ищете руководство с полным набором шагов для ручной сборки и запуска образа Docker для вашего проекта, вы можете найти его прямо здесь, в этой статье:



Однако в этом уроке я расскажу о более простом процессе разработки Docker, который можно полностью выполнить с помощью самого VSCode.

Давайте рассмотрим каждый шаг создания модели, затем API и, наконец, докеризацию.👇

Построение нашей модели машинного обучения

Мы будем использовать Spacy для создания простого классификатора настроений, который выводит два результата для любого переданного ему фрагмента текста:

Полярность — это число с плавающей запятой, лежащее в диапазоне [-1,1], где 1 означает полностью положительное утверждение, а -1 означает полностью отрицательное утверждение.

Субъективность. Предложения «субъективны» обычно относятся к личному мнению, эмоциям или суждениям, тогда как «объективны» относятся к фактической информации. Эточисло с плавающей запятой, лежащее в диапазоне [0,1].

Теперь давайте установим несколько пакетов, чтобы начать нашу разработку:

pipenv shell # make a new virtual environment
pipenv install pydantic fastapi uvicorn spacy spacytextblob # the packages to install

Теперь перейдите в проект и создайте новый файл с именем «model.py».

Давайте заполним код для этого файла:

import spacy
from spacytextblob.spacytextblob import SpacyTextBlob
from pydantic import BaseModel

class SentimentQueryModel(BaseModel): 
    text : str
class SentimentModel:
    def get_sentiment(self, text):
        nlp = spacy.load('en_core_web_sm')
        nlp.add_pipe("spacytextblob")
        doc = nlp(text)
        polarity = doc._.polarity
        subjectivity = doc._.subjectivity
        return polarity, subjectivity

Мы используем SentimentQueryModel, чтобы содержать наш единственный запрос для этой модели — текст, для которого мы будем предсказывать тональность, и SentimentModel как класс, который загружает пространственный токенизатор и spacytextblob и выполняет прогноз тональности для данного текста.

Теперь мы перейдем к следующему шагу, на котором мы создадим наш API.

Создание API

FastAPI — это более новый и лучший способ развернуть вашу модель машинного обучения в качестве REST API для использования в ваших веб-приложениях.

Давайте используем наш «model.py» в новом файле с именем «main.py» и создадим с его помощью REST API:

import uvicorn
from fastapi import FastAPI
from model import SentimentModel, SentimentQueryModel
app = FastAPI()
model = SentimentModel()

@app.post('/predict')
    def predict(data: SentimentQueryModel):
        data = data.dict()
        polarity, subjectivity = model.get_sentiment(data['text'])
        return { 'polarity': polarity,
                  'subjectivity': subjectivity
        }
if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)

Этот API теперь будет работать на порту 8000 локального хоста, что мы проверим, запустив в терминале:

python main.py

и вы увидите вывод:

Если вы перейдете на localhost:8000/docs, вы сможете просмотреть и протестировать API в самом браузере! Разве это не здорово?

Но теперь, когда у нас есть наша модель и наш API, мы наконец-то можем перейти к созданию контейнера Docker!

Контейнеризация с помощью Docker

Убедитесь, что в вашем VSCode установлено расширение Docker от Microsoft. Затем продолжайте и запустите Docker Desktop на своем компьютере.

Теперь зайдите в VSCode и введите: Command + Shift + P, чтобы открыть палитру команд. Введите «Добавить файлы Docker», и вы получите возможность добавить файл Docker в свой проект. Этот процесс значительно упрощает весь наш рабочий процесс.

Следуйте инструкциям и оставьте номер порта 8080. Не забывайте, что порт 8000 используется для самого нашего API, поэтому нам нужен другой порт для запуска Docker!

Теперь просто щелкните правой кнопкой мыши файл Dockerfile на боковой панели и выберите «Создать образ».

Вы начнете видеть вывод в терминале по мере создания образа.

Затем вы можете перейти на вкладку Docker на боковой панели VSCode.

Здесь вы увидите список изображений, которые уже есть в вашей системе. Новое изображение, которое мы только что создали, также будет отображаться здесь следующим образом:

Теперь вам нужно только щелкнуть правой кнопкой мыши «последнее» под именем изображения и выбрать параметр Выполнить.

Вы можете просмотреть журналы запуска, щелкнув правой кнопкой мыши построенный контейнер и выбрав опцию «Просмотр журналов».

Теперь, когда вы перейдете к localhost:8000/docs, вы увидите следующий экран:

Вы можете просто нажать «Выполнить», что приведет к выводу, например:

Несколько напутственных слов…

Итак, у вас есть полный конвейер создания API из модели машинного обучения и контейнеризации его с помощью Docker!

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

Также ознакомьтесь с этим замечательным постом о распространенных ошибках, которых следует избегать при развертывании модели!

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

Стань участником Medium, чтобы не пропустить ни одной статьи о науке о данных, которую я публикую каждую неделю. Присоединяйтесь сюда 👇



Свяжись со мной!

Подписывайтесь на меня в Твиттере.
Подпишитесь на мою публикацию по науке о данных.
Посмотрите полный репозиторий кода всех моих статей по науке о данных!

Еще пара моих статей, которые могут быть вам интересны: