Краткий обзор. Разверните экземпляр обученной модели 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 среди прочих.
Другие статьи из этой серии:
- Настройка мультипроцессорной обработки в Pytorch — Часть 1
- Классификация изображений с помощью ResNet, ConvNeXt с использованием PyTorch — Часть 2
Ссылки:
- Документация по PyTorch
- Документация TorchServe
- Чжуан Лю, Ханзи Мао, Чао-Юань Ву, Кристоф Файхтенхофер, Тревор Даррелл, Сайнин Се. (2022). Конвнет на 2020-е годы
- Зе Лю, Ютун Линь, Юэ Цао, Хань Ху, Исюань Вэй, Чжэн Чжан, Стивен Линь, Байнин Го. (2021). Swin Transformer: Преобразователь иерархического зрения с использованием сдвинутых окон
- Дэн Хендрикс, Кевин Гимпел. (2016). Линейные единицы с ошибкой Гаусса (GELU)
- Набор данных Food 101
- Барт, Альваро. (2021). Обслуживание моделей PyTorch с помощью TorchServe