Одна из известных истин мира машинного обучения (ML) заключается в том, что развертывание моделей машинного обучения в производственной среде занимает гораздо больше времени, чем их разработка.

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

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

Оборудование / ВМ

Самый прямой способ развернуть что-либо - арендовать виртуальную машину, превратить модель в какой-то сервер и оставить ее работающей. Будучи чрезвычайно простым и настраиваемым, этот метод имеет множество недостатков, таких как жесткая интеграция в конвейеры CI / CD и проблемы с изоляцией.

Контейнеры

Можно развернуть модели машинного обучения в контейнерах Docker с помощью Kubernetes или аналогичных инструментов оркестровки. Эта опция обеспечивает намного больше улучшений качества жизни. Модели могут быть легко обернуты в специально разработанные серверы, такие как NVIDIA Triton или Tensorflow Runtime (также работает с опцией VM). Теперь объединить модели в цепочку стало еще проще, используя сложные фреймворки, такие как Kubeflow.

Однако возможность настройки достигается за счет сложности DevOps и необходимости поддерживать технологии, обеспечивающие работу вашей модели.

Бессерверные платформы общего назначения

Простой способ просто разместить свою модель в облаке - использовать бессерверные платформы PaaS. Здесь вам нужно обернуть вашу модель некоторым кодом предварительной и постобработки.

Такие платформы, как Heroku или Google App Engine, обеспечивают большую гибкость, поскольку вы даже можете обернуть свой код в контейнер, в то время как функции AWS Lambda, Google Cloud Functions или Azure Functions значительно упрощают развертывание, даже обеспечивая отличная интеграция с соответствующими облачными сервисами.

Этот подход отлично подходит для обработки фоновых задач, поскольку время вывода относительно велико, поскольку вы ограничены моделями обработки на ЦП, а сами модели обычно хранятся далеко от узлов обработки и могут требуется время для загрузки.

Бессерверные провайдеры, ориентированные на машинное обучение

Сейчас мы наблюдаем рост бессерверных провайдеров, ориентированных на машинное обучение, которые размещают вашу модель, предоставляя API или набор фреймворков. Один набор поставщиков будет Amazon SageMaker (развертывание с платформой SageMaker прекрасно раскрыто в этой статье) или Google Cloud AI Platform. Эти службы по-прежнему требуют аренды базовых вычислительных экземпляров, на которых будут работать ваши модели.

Другой вариант - использовать DeepMux, Алгоритмию, Датику. Здесь вы обычно получаете истинный бессерверный опыт, поскольку вы платите только за время работы ваших моделей.

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

В этой статье мы собираемся использовать DeepMux для развертывания классификатора ImageNet на основе модели ResNet18.

Ниже я продемонстрирую процесс развертывания.

Давайте начнем

Вы можете скопировать следующие блоки кода в свой любимый блокнот или попробовать этот блокнот в Google Colab.

Предварительные условия

Установите пакет DeepMux Python SDK с помощью pip:

pip install deepmux

Подготовьте свой токен доступа DeepMux:

# get your token from https://app.deepmux.com/api_key
token = '<YOUR TOKEN GOES HERE>'

Мы будем использовать следующий импорт

from io import BytesIO
import numpy as np
import requests
import torch
from imageio import imread
from torchvision import transforms
from PIL import Image
import deepmux

Подготовьте свою модель torchhub

pytorch_model = torch.hub.load('pytorch/vision:v0.5.0', 'resnet18', pretrained=True)

Развертывание нашей модели

В качестве примера мы использовали известную модель ResNet от PyTorchHub.

model = deepmux.create_model(
 pytorch_model,
 model_name='imagenet-classifier-resnet',
 input_shape=[1, 3, 224, 224],
 output_shape=[1, 1000],
 token=token)
print("Model uploaded, ready to serve")

Вот и все! Ваша модель развернута и готова к выводу. Не беспокойтесь о Docker, Kubernetes и прочем DevOps.

Вы можете вызывать свою модель из любого места с помощью вашего токена через Python SDK или REST API.

Предварительная обработка и постобработка

# Init preprocessor
preprocessor = transforms.Compose([
 transforms.ToPILImage(),
 transforms.Resize(256),
 transforms.CenterCrop(224),
 transforms.ToTensor(),
 transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]),
])
# Prerocess image
def preprocess(input_image):
 input_tensor = preprocessor(input_image)
 return input_tensor.unsqueeze(0).numpy()
# Load imagenet class labels
classes = requests.get('https://s3.amazonaws.com/deep-learning-models/image-models/imagenet_class_index.json').json()
classes = dict((int(k), v[1]) for k, v in classes.items())
# Postprocess image
def postprocess(result):
 return classes[np.argmax(result[0])]

Давайте запустим нашу модель

Теперь вы можете вызвать model.run (…) для запуска.

def predict(image_url):
 inp = preprocess(image_url)
 out = model.run(inp)
 return postprocess(out)

А теперь давайте попробуем с этим милым медведем: 3

IMAGE_URL = ‘https://www.arctictravelcentre.com.au/wp-content/uploads/2016/09/Polar-Bear.jpg'
image = imread(IMAGE_URL)
predict(image)

Достанет нас

ice_bear

У нас также есть пример сервера Flask в нашем репозитории SDK.



Заключение

Одна из самых больших недооцененных проблем в разработке машинного обучения - это развертывание обученных моделей в производственной среде, которое также является масштабируемым. Я прочитал одну шутку по этому поводу: «Самый распространенный способ развертывания машинного обучения сегодня - это слайды в PowerPoint :)». ²

Мы успешно рассмотрели распространенные варианты развертывания моделей машинного обучения и продемонстрировали быстрое пошаговое руководство с помощью DeepMux. Этот инструмент был создан для того, чтобы специалисты по данным могли сосредоточиться на своих основных задачах и упростить MLOps или DevOps для машинного обучения.

Спасибо за чтение! Следите за новыми статьями и не стесняйтесь писать в разделе комментариев или задавать вопросы на нашу электронную почту [email protected].

использованная литература

[1]: Адарш Шах. (21 июня 2020 г.). Проблемы внедрения моделей машинного обучения в производственную среду https://towardsdatascience.com/challenges-deploying-machine-learning-models-to-production-ded3f9009cb3

[2]: Самбит Махапатра. (17 марта 2019 г.). Модели машинного обучения как микросервисы в Docker https://towardsdatascience.com/machine-learning-models-as-micro-services-in-docker-a798e1f068a5

[3]: Джеймс Ле (6 марта 2020 г.). 5 компонентов для создания готовых к производству систем машинного обучения https://medium.com/cracking-the-data-science-interview/the-5-components-towards-building-production-ready-machine-learning-system- a4d5237ec04e