Краткий обзор. Разверните экземпляр обученной модели ConvNeXt-B на TorchServe для классификации изображений в реальном времени с использованием категорий, представленных в наборе данных Food 101.

TorchServe — это платформа для беспрепятственного и эффективного обслуживания моделей, обученных pyTorch.

В этом руководстве мы рассмотрим шаги по развертыванию модели PyTorch локально и в контейнере Docker.

Настройка среды:

Мы используем Anaconda для управления библиотеками в python.

  • После того, как мы установили Anaconda, мы можем настроить среду Python, как показано ниже.
conda create --prefix <env_name_location> \
        -c pytorch -c nvidia -c conda-forge \
        torchserve torch-model-archiver \
        torch-workflow-archiver \
        python=3.8.12
conda activate <env_name_location>
  • Создайте базовый каталог проекта и клонируйте git-репозиторий TorchServe.
mkdir <base_torchserve_dir>
git clone https://github.com/pytorch/serve.git
  • TorchServe обеспечивает развертывание модели в двух вариантах — ЦП и ГП.
    В этом руководстве мы будем использовать версию ЦП для развертывания.
    Выполните следующие команды, чтобы установить все зависимости для TorchServe.
cd <base_torchserve_dir>/serve
#Default for CPU based inference
python ./ts_scripts/install_dependencies.py
# For GPU based inference
python ./ts_scripts/install_dependencies.py --cuda=cu113
# Optional - create a conda requirements file
conda list -e > requirements_conda_torchserve_min.txt
  • Создайте каталог для хранения обученной модели и определения модели для состояния обученных весов
    Для получения подробной информации об обучении модели классификации изображений с помощью трансферного обучения нажмите здесь.
# creates a directory to store trained model definition / state files
mkdir -p <base_torchserve_dir>/serve/model_defs
# creates a directory to store the model in torchserve format 
mkdir -p <base_torchserve_dir>/serve/model_store

Добавить обученную модель в TorchServe:

  • Создайте определение классификатора ConvNeXt-B для загрузки обученных весов, как показано ниже.
    Это необходимо, поскольку модель, используемая в этом руководстве, была обучена с помощью пользовательского классификатора для изучения категорий продуктов питания.
  • Создайте индекс для удобного сопоставления имен категорий для категорий продуктов питания.
    Поскольку мы используем модель, обученную на наборе данных Food 101, нам необходимо сопоставить индексы с классами продуктов питания в том же порядке.
  • Примечание. Загрузчик данных ImageFolder PyTorch сопоставляет индексы с классами на основе алфавитного порядка сортировки. Этот список отсортированных классов доступен в разделе Food101/meta/classes.txt .
    Нам нужно преобразовать этот простой список в строку json с ключом: ‹index› и значением: ‹название категории›.
    Gist Link для файла json со 101 проиндексированной категорией продуктов питания из набора данных Food 101.

  • Необязательно. Расширьте классификатор TorchServe для предварительной обработки, переопределив атрибуты по умолчанию.
    В этом примере мы возвращаем первые 10 результатов, а не первые 5 результатов по умолчанию.
from ts.torch_handler.image_classifier import ImageClassifier

class ImageClassifierConvNeXtBTorchServe(ImageClassifier):
    topk = 10
  • Скопируйте следующие файлы в обученную модель <base_torch_serve_dir/serve/model_defs
    – pyTorch — pth файл dict состояния
    ImageClassifierConvNeXtBTorchServe файл классификатора пользовательских изображений torchserve
    ImageClassfierConvNeXtB файл определения модели python
    index_to_name.json файл, в котором отображаются индексы обученной модели для удобные названия категорий

Создайте архивный файл TorchServe, который будет использоваться для создания выводов в реальном времени.

Как только эта команда будет успешно выполнена, она должна сохранить файл convnextbfood101.mar в папке <base_dir>/serve/model_store, как показано ниже.

Запустите TorchServe:

Выполните следующую команду с включенной средой conda, чтобы запустить TorchServe.

torchserve --start --ncs \
    --model-store <base_torchserve_dir>/serve/model_store \
    --models foodnet=convnextbfood101.mar
  • Необязательно — добавьте дополнительные свойства конфигурации для TorchServe, т. е. количество рабочих на модель и т. д.
    Создайте файл config.properties, как показано ниже, и сохраните его в каталоге <base_torchserve_dir>/serve/model_configs.

Для запуска TorchServe с указанным выше файлом конфигурации добавьте дополнительный параметр, указывающий на файл конфигурации.

torchserve --start --ncs \
    --model-store <base_torchserve_dir>/serve/model_store \
    --models foodclass=convnextbfood101.mar \
    --ts-config <base_dir>/serve/model_configs/conf_food101.properties

Выводы в реальном времени:

Для получения выводов в реальном времени мы можем использовать API gRPC или REST API.

Например, давайте воспользуемся REST API, чтобы классифицировать категорию еды для изображения ниже.

# Download the unsplash image
# Named as 'meal_salmon_zuch_caseylee.jpg'
# Url to download the image
https://unsplash.com/photos/awj7sRviVXo/download?force=true&w=1920
#Run the inference on the image
curl http://127.0.0.1:8080/predictions/foodclass -T meal_salmon_zuch_caseylee.jpg

Результат вывода:

Судя по выходным данным вызова REST API, grilled salmon имеет наибольшую вероятность, что верно.

Примечание. Поскольку обученная модель имеет точность около 85 %, прогнозы модели также будут иметь неправильные категории, присвоенные определенным изображениям.

{
  "grilled_salmon": 0.6429812908172607,
  "shrimp_and_grits": 0.14269301295280457,
  "paella": 0.07746776193380356,
  "gnocchi": 0.049594469368457794,
  "pork_chop": 0.026730146259069443,
  "scallops": 0.020880170166492462,
  "risotto": 0.017987729981541634,
  "chicken_curry": 0.006645840592682362,
  "ceviche": 0.003106149611994624,
  "escargots": 0.0023537822999060154
}

Развертывание в контейнере Docker:

  • Перейдите в папку docker в клонированном репозитории torchserve.
  • Обновите Dockerfile с помощью следующей команды, поскольку мы столкнулись с ошибкой gnupg, показанной ниже.

RUN apt-get update && apt-get install -y gnupg
  • Запустите скрипт build_image.sh для создания контейнера.
cd <base_torchserve_dir>/serve/docker
# CPU based inference container
./build_image.sh -b master -bt production -t food101convnextb1_0
#GPU based inference container, with CUDA already installed, say 11.3
./build_image.sh -b master -bt production -t food101convnextb1_0gpucu113 -g -cv cu113
  • Создайте новые файлы свойств конфигурации Docker.
    Примечание. При сравнении с исходным файлом конфигурации, указанным ранее в этом руководстве, отображаются только разностные изменения.
  • Выполните следующие команды, чтобы развернуть док-контейнер для модели классификации продуктов питания.
# Run from <base_torchserve_dir>
# Mount the config file
# Mount the modelstore folder
# Override entrypoint command to point to the custom config file
docker run --rm -it \
    -p 8080:8080 \
    -p 8081:8081 \
    -p 8082:8082 \
    -p 7070:7070 \
    -p 7071:7071  \
    --mount type=bind,source=$(pwd)/serve/model_store,target=/tmp/modelstore \
    --mount type=bind,source=$(pwd)/serve/model_configs/config_food101_docker.properties,target=/tmp/config.properties \
    food101convnextb1_0:latest \
    torchserve --model-store=/tmp/modelstore \
    --ts-config=/tmp/config.properties

Выводы в реальном времени на основе Docker:

Для проверки вывода о классификации пищевых продуктов при размещении в док-контейнере ниже приведен образец изображения.

  • Загрузите образ и запустите его для модели torchserve, развернутой на докере.
# Url to download the image
https://unsplash.com/photos/RwDmUKpUP50/download?ixid=MnwxMjA3fDB8MXxzZWFyY2h8OHx8Y2FuYXBlfGVufDB8fHx8MTY1Mzk0NDE4NQ&force=true
# Call torchserve on docker for this downloadedimage
curl http://127.0.0.1:8080/predictions/foodclass \
    -T sebastian-coman-photography-RwDmUKpUP50-unsplash.jpg

Результаты вывода на основе Docker:

Модель способна классифицировать пищу как scallops с вероятностью 96%.

{
  "scallops": 0.9640653133392334,
  "grilled_salmon": 0.027381636202335358,
  "filet_mignon": 0.005994760897010565,
  "hamburger": 0.0007836359436623752,
  "bibimbap": 0.0006225404795259237,
  "foie_gras": 0.0004113266186323017,
  "steak": 0.00012357658124528825,
  "crab_cakes": 0.00010399901657365263,
  "tuna_tartare": 8.00026609795168e-05,
  "sushi": 7.516794721595943e-05
}

Вывод:

TorchServe — хороший инструмент для развертывания и масштабирования нескольких моделей, обученных с помощью pyTorch. Он также обеспечивает интеграцию с платформами Kubernetes, mlflow и Google Vertex AI Managed среди прочих.

Другие статьи из этой серии:

Ссылки: