Размещение нескольких моделей компьютерного зрения TensorFlow с использованием мультимодельных конечных точек Amazon SageMaker.

Исходный узел: 1853804

Создатель мудреца Амазонки помогает специалистам по данным и разработчикам быстро подготавливать, создавать, обучать и развертывать высококачественные модели машинного обучения (ML), объединяя широкий набор возможностей, специально созданных для ML. SageMaker ускоряет внедрение инноваций в вашей организации, предоставляя специализированные инструменты для каждого этапа разработки машинного обучения, включая маркировку, подготовку данных, разработку функций, обнаружение статистической погрешности, AutoML, обучение, настройку, хостинг, объяснимость, мониторинг и автоматизацию рабочих процессов.

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

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

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

Обзор решения

Мультимодельные конечные точки SageMaker работают с несколькими платформами, такими как TensorFlow, PyTorch, MXNet и sklearn, и вы можете создайте свой собственный контейнер с сервером с несколькими моделями. Конечные точки с несколькими моделями также изначально поддерживаются в следующих популярных встроенных алгоритмах SageMaker: XGBoost, Линейный ученик, Случайный вырубленный лес (РКФ) и K-Ближайшие соседи (КНН). Вы можете напрямую использовать контейнеры, предоставленные SageMaker, при использовании этих алгоритмов без необходимости создавать свой собственный контейнер.

Следующая диаграмма представляет собой упрощенную иллюстрацию того, как вы можете размещать несколько (в этом посте — шесть) моделей, используя многомодельные конечные точки SageMaker. На практике конечные точки с несколькими моделями могут поддерживать от сотен до десятков тысяч моделей машинного обучения за конечной точкой. В нашей архитектуре, если мы размещаем больше моделей, используя артефакты моделей, хранящиеся в Простой сервис хранения Amazon (Amazon S3), мультимодельные конечные точки динамически выгружают некоторые наименее используемые модели для размещения новых моделей.

В этом посте мы покажем, как разместить две модели компьютерного зрения, обученные с помощью платформы TensorFlow, за одной мультимодельной конечной точкой SageMaker. Мы используем Обслуживание TensorFlow контейнер включен для конечных точек с несколькими моделями для размещения этих моделей. Для нашей первой модели мы обучаем уменьшенную версию АлексНет CNN классифицировать изображения из СИФАР-10 набор данных. Для второй модели мы используем ВГГ16 Модель CNN предварительно обучена на IMAGEnet набор данных и настроен на Набор данных цифр языка жестов классифицировать изображения символов рук. Мы также предоставляем полнофункциональную ноутбук для демонстрации всех шагов.

Модель 1: классификация изображений CIFAR-10

CIFAR-10 — это эталонный набор данных для классификации изображений в компьютерном зрении и машинном обучении. Изображения CIFAR цветные (три канала) с драматическим изменением внешнего вида объектов. Он состоит из цветных изображений 32 × 32 в 10 классах, по 6,000 изображений в каждом классе. Он содержит 50,000 10,000 обучающих изображений и XNUMX XNUMX тестовых изображений. На следующем изображении показан пример изображений, сгруппированных по меткам.

Для построения классификатора изображений мы используем упрощенную версию классической AlexNet CNN. Сеть состоит из пяти сверточных слоев и слоев пула и трех полносвязных слоев. Наша упрощенная архитектура состоит из трех сверточных слоев и двух полносвязных (плотных) слоев.

Первый шаг — загрузить набор данных в обучающие и тестовые объекты. Платформа TensorFlow предоставляет нам набор данных CIFAR для загрузки с помощью метода load_data(). Затем мы масштабируем входные изображения, разделив значения пикселей на 255: [0,255] ⇒ [0,1]. Нам также нужно подготовить этикетки, используя одноразовое кодирование. Одно горячее кодирование представляет собой процесс, посредством которого категориальные переменные преобразуются в числовую форму. Следующий фрагмент кода показывает эти шаги в действии:

from tensorflow.keras.datasets import cifar10 # load dataset
(X_train, y_train), (X_test, y_test) = cifar10.load_data() # rescale input images
X_train = X_train.astype('float32')/255
X_test = X_test.astype('float32')/255 # one hot encode target labels
num_classes = len(np.unique(y_train))
y_train = utils.to_categorical(y_train, num_classes)
y_test = utils.to_categorical(y_test, num_classes)

После того как набор данных подготовлен и готов к обучению, он сохраняется в Amazon S3 для использования SageMaker. Архитектура модели и обучающий код для классификатора изображений собраны в обучающий скрипт (cifar_train.py). Чтобы сгенерировать пакеты данных тензорного изображения для процесса обучения, мы используем ImageDataGenerator. Это позволяет нам применять преобразования увеличения данных, такие как сдвиг поворота, ширины и высоты, к нашим обучающим данным.

На следующем этапе мы используем обучающий скрипт для создания оценщика TensorFlow с помощью SageMaker SDK (см. следующий код). Мы используем оценщик, чтобы соответствовать модели CNN на входных данных CIFAR-10. По завершении обучения модель сохраняется в Amazon S3.

from sagemaker.tensorflow import TensorFlow model_name = 'cifar-10' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'cifar_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'model_dir': f'/opt/ml/model', 'role': role, 'hyperparameters': hyperparameters, 'output_path': f's3://{BUCKET}/{PREFIX}/cifar_10/out', 'base_job_name': f'mme-cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_1 = TensorFlow(**estimator_parameters) estimator_1.fit(inputs)

Позже мы покажем, как разместить эту модель с помощью мультимодельной конечной точки SageMaker вместе со второй моделью (классификатор цифр языка жестов).

Модель 2: Классификация цифр языка жестов

Для нашей второй модели мы используем набор данных цифр языка жестов. Этот набор данных различает цифры жестового языка от 0 до 9. На следующем изображении показан пример набора данных.

Набор данных содержит 100 x 100 изображений в цвете RGB и имеет 10 классов (цифры 0–9). Обучающий набор содержит 1,712 изображений, проверочный набор 300 и тестовый набор 50.

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

Чтобы обучить эту модель, мы используем предварительно обученную модель CNN VGG16, обученную на наборе данных ImageNet, и настраиваем ее для работы с нашим набором данных на языке жестов. Предварительно обученная модель — это сеть, предварительно обученная на большом наборе данных, как правило, на крупномасштабной задаче классификации изображений. Архитектура модели VGG16, которую мы используем, имеет всего 13 сверточных слоев. Для набора данных языка жестов, поскольку его домен отличается от исходного домена набора данных ImageNet, мы точно настраиваем только последние несколько слоев. Под тонкой настройкой здесь понимается замораживание нескольких сетевых слоев, которые используются для извлечения признаков, и совместное обучение как незамороженных слоев, так и недавно добавленных слоев классификатора предварительно обученной модели.

Сценарий обучения (Sign_language_train.py) инкапсулирует архитектуру модели и логику обучения для классификатора цифр жестового языка. Сначала мы загружаем предварительно обученные веса из сети VGG16, обученной на наборе данных ImageNet. Затем мы замораживаем часть части экстрактора признаков, а затем добавляем новые слои классификатора. Наконец, мы компилируем сеть и запускаем процесс обучения, чтобы оптимизировать модель для меньшего набора данных.

Затем мы используем этот обучающий скрипт для создания оценщика TensorFlow с помощью SageMaker SDK. Этот оценщик используется для подгонки классификатора цифр языка жестов к предоставленным входным данным. По завершении обучения модель сохраняется в Amazon S3 для размещения на конечных точках с несколькими моделями SageMaker. См. следующий код:

model_name = 'sign-language' hyperparameters = {'epochs': 50} estimator_parameters = {'entry_point':'sign_language_train.py', 'instance_type': 'ml.m5.2xlarge', 'instance_count': 2, 'hyperparameters': hyperparameters, 'model_dir': f'/opt/ml/model', 'role': role, 'output_path': f's3://{BUCKET}/{PREFIX}/sign_language/out', 'base_job_name': f'cv-{model_name}', 'framework_version': TF_FRAMEWORK_VERSION, 'py_version': 'py37', 'script_mode': True} estimator_2 = TensorFlow(**estimator_parameters) estimator_2.fit({'train': train_input, 'val': val_input})

Развертывание мультимодельной конечной точки

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

Чтобы создать конечную точку с несколькими моделями, сначала нам нужно скопировать обученные модели для отдельных оценщиков (1 и 2) из ​​их сохраненных местоположений S3 в общий префикс S3, который может использоваться конечной точкой с несколькими моделями:

tf_model_1 = estimator_1.model_data
output_1 = f's3://{BUCKET}/{PREFIX}/mme/cifar.tar.gz' tf_model_2 = estimator_2.model_data
output_2 = f's3://{BUCKET}/{PREFIX}/mme/sign-language.tar.gz' !aws s3 cp {tf_model_1} {output_1}
!aws s3 cp {tf_model_2} {output_2}

После того, как модели скопированы в общее место, обозначенное префиксом S3, мы создаем обслуживающую модель, используя класс TensorFlowModel из SageMaker SDK. Модель обслуживания создается для одной из моделей, которая будет размещаться в конечной точке с несколькими моделями. В данном случае мы используем первую модель (классификатор изображений CIFAR-10). Затем мы используем класс MultiDataModel из SageMaker SDK для создания модели данных с несколькими моделями, используя модель обслуживания для модели-1, которую мы создали на предыдущем шаге:

from sagemaker.tensorflow.serving import TensorFlowModel
from sagemaker.multidatamodel import MultiDataModel model_1 = TensorFlowModel(model_data=output_1, role=role, image_uri=IMAGE_URI) mme = MultiDataModel(name=f'mme-tensorflow-{current_time}', model_data_prefix=model_data_prefix, model=model_1, sagemaker_session=sagemaker_session)

Наконец, мы развертываем MultiDataModel, вызывая метод deploy(), предоставляя атрибуты, необходимые для создания инфраструктуры хостинга, необходимой для поддержки конечной точки с несколькими моделями:

predictor = mme.deploy(initial_instance_count=2, instance_type='ml.m5.2xlarge', endpoint_name=f'mme-tensorflow-{current_time}')

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

Протестируйте мультимодельную конечную точку для логического вывода в реальном времени.

Конечные точки с несколькими моделями позволяют совместно использовать ресурсы памяти между вашими моделями. Если модель, на которую нужно сослаться, уже кэширована, конечные точки с несколькими моделями немедленно запускают логический вывод. С другой стороны, если конкретная запрошенная модель не кэшируется, SageMaker должен загрузить модель, что увеличивает задержку для этого первоначального запроса. Однако это занимает лишь часть времени, необходимого для запуска совершенно новой инфраструктуры (экземпляров) для индивидуального размещения модели в SageMaker. После кэширования модели в конечной точке с несколькими моделями последующие запросы инициируются в режиме реального времени (если модель не удалена). В результате вы можете запускать множество моделей из одного экземпляра, эффективно отделяя количество моделей от стоимости развертывания. Это упрощает управление масштабируемыми развертываниями машинного обучения и снижает затраты на развертывание вашей модели за счет увеличения использования конечной точки и ее базовых вычислительных экземпляров. Для получения дополнительной информации и демонстрации экономии затрат более чем на 90 % для примера из 1,000 моделей см. Экономьте на затратах на логические выводы, используя мультимодельные конечные точки Amazon SageMaker..

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

Давайте посмотрим, как сделать вывод из классификатора изображений CIFAR-10 (модель-1), размещенного в конечной точке с несколькими моделями. Во-первых, мы загружаем образец изображения из одного из классов — самолета — и подготавливаем его к отправке в конечную точку с несколькими моделями, используя предиктор, созданный на предыдущем шаге.

С помощью этого предиктора мы можем вызвать метод predict() вместе с параметром initial_args, который определяет имя вызываемой целевой модели. В данном случае целевой моделью является cifar.tar.gz. Следующий фрагмент подробно демонстрирует этот процесс:

img = load_img('./data/cifar_10/raw_images/airplane.png', target_size=(32, 32))
data = img_to_array(img)
data = data.astype('float32')
data = data / 255.0
data = data.reshape(1, 32, 32, 3)
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'cifar.tar.gz'})
predicted_label = CIFAR10_LABELS[np.argmax(y_pred)]
print(f'Predicted Label: [{predicted_label}]')

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

Predicted Label: [airplane]

Далее давайте посмотрим, как динамически загрузить классификатор цифр языка жестов (модель-2) в многомодельную конечную точку, вызвав конечную точку с sign-language.tar.gz в качестве целевой модели.

Мы используем следующий образец изображения цифры 0 в виде знака руки.

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

test_path = './data/sign_language/test'
img = mpimg.imread(f'{test_path}/0/IMG_4159.JPG') def path_to_tensor(img_path): # loads RGB image as PIL.Image.Image type img = image.load_img(img_path, target_size=(224, 224)) # convert PIL.Image.Image type to 3D tensor with shape (224, 224, 3) x = image.img_to_array(img) # convert 3D tensor to 4D tensor with shape (1, 224, 224, 3) and return 4D tensor return np.expand_dims(x, axis=0) data = path_to_tensor(f'{test_path}/0/IMG_4159.JPG')
payload = {'instances': data}
y_pred = predictor.predict(data=payload, initial_args={'TargetModel': 'sign-language.tar.gz'})predicted_label = np.argmax(y_pred)
print(f'Predicted Label: [{predicted_label}]')

Следующий код является нашим ответом с меткой 0:

Predicted Label: [0]

Заключение

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

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

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


Об авторах

Арунпрасат Шанкар является специалистом по архитектуре решений в области искусственного интеллекта и машинного обучения (AI / ML) в AWS, помогая клиентам во всем мире эффективно масштабировать свои решения AI в облаке. В свободное время Арун любит смотреть научно-фантастические фильмы и слушать классическую музыку.

Марк Рой является главным архитектором машинного обучения в AWS, помогая клиентам AWS разрабатывать и создавать решения AI/ML. Работа Марка охватывает широкий спектр вариантов использования машинного обучения, в первую очередь интересуясь компьютерным зрением, глубоким обучением и масштабированием машинного обучения на предприятии. Он помогал компаниям во многих отраслях, включая страхование, финансовые услуги, средства массовой информации и развлечения, здравоохранение, коммунальные услуги и производство. Марк имеет шесть сертификатов AWS, в том числе сертификат ML Specialty Certification. До прихода в AWS Марк был архитектором, разработчиком и руководителем технологий более 25 лет, в том числе 19 лет в сфере финансовых услуг.

Источник: https://aws.amazon.com/blogs/machine-learning/host-multiple-tensorflow-computer-vision-models-using-amazon-sagemaker-multi-model-endpoints/

Отметка времени:

Больше от Блог машинного обучения AWS