Розміщуйте кілька моделей комп’ютерного зору TensorFlow за допомогою мультимодельних кінцевих точок Amazon SageMaker

Вихідний вузол: 1853804

Amazon SageMaker допомагає науковцям і розробникам даних готувати, створювати, навчати та швидко розгортати високоякісні моделі машинного навчання (ML), об’єднуючи широкий набір можливостей, спеціально створених для ML. SageMaker прискорює впровадження інновацій у вашій організації, надаючи спеціально створені інструменти для кожного етапу розробки ML, включаючи маркування, підготовку даних, розробку функцій, виявлення статистичних зміщень, AutoML, навчання, налаштування, хостинг, пояснюваність, моніторинг і автоматизацію робочого процесу.

Компанії все частіше навчають моделі ML на основі індивідуальних даних користувачів. Наприклад, служба обміну зображеннями, призначена для виявлення інформації в Інтернеті, тренує власні моделі на основі завантажених кожним користувачем зображень та історії веб-перегляду, щоб персоналізувати рекомендації для цього користувача. Компанія також може навчити користувацькі моделі на основі тем пошуку для рекомендацій зображень на тему. Створення користувацьких моделей ML для кожного випадку використання призводить до вищої точності висновків, але збільшує вартість розгортання та керування моделями. Ці проблеми стають більш помітними, коли не всі моделі доступні з однаковою швидкістю, але вони все одно повинні бути доступними в будь-який час.

SageMaker багатомодельні кінцеві точки забезпечують масштабований і економічно ефективний спосіб розгортання великої кількості моделей машинного навчання в хмарі. Багатомодельні кінцеві точки SageMaker дозволяють розгортати кілька моделей ML за однією кінцевою точкою та обслуговувати їх за допомогою єдиного контейнера для обслуговування. Вашій програмі просто потрібно включити виклик API з цільовою моделлю до цієї кінцевої точки, щоб досягти низької затримки та високої пропускної здатності. Замість того, щоб платити за окрему кінцеву точку для кожної моделі, ви можете розмістити багато моделей за ціною однієї кінцевої точки. Додаткову інформацію про багатомодельні кінцеві точки SageMaker див Заощаджуйте кошти на висновки, використовуючи багатомодельні кінцеві точки Amazon SageMaker.

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

Огляд рішення

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

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

У цій публікації ми показуємо, як розмістити дві моделі комп’ютерного зору, навчені за допомогою фреймворку TensorFlow, за однією мультимодельною кінцевою точкою SageMaker. Ми використовуємо Обслуговування TensorFlow контейнер, увімкнений для кінцевих точок із кількома моделями для розміщення цих моделей. Для нашої першої моделі ми тренуємо зменшену версію AlexNet CNN класифікувати зображення з ЦИФАР-10 набір даних. Для другої моделі ми використовуємо a VGG16 Модель 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 за допомогою SDK SageMaker (див. наступний код). Ми використовуємо оцінювач, щоб адаптувати модель 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.

Цей набір даних дуже малий. Навчання мережі з нуля на цьому невеликому наборі даних не дає хороших результатів. Для досягнення більшої точності ми використовуємо переклад вивчення. Трансферне навчання зазвичай є найкращим підходом, коли ви починаєте класифікаційний проект, особливо коли у вас недостатньо навчальних даних. Він переносить знання, отримані з вихідного набору даних, у цільовий набір даних, щоб заощадити час навчання та витрати на обчислення.

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

Сценарій навчання (sign_language_train.py) інкапсулює архітектуру моделі та логіку навчання для класифікатора цифр мови жестів. Спочатку ми завантажуємо попередньо підготовлені ваги з мережі VGG16, навчені на наборі даних ImageNet. Далі ми заморожуємо частину частини екстрактора функцій, після чого додаємо нові шари класифікатора. Нарешті, ми компілюємо мережу та запускаємо процес навчання, щоб оптимізувати модель для меншого набору даних.

Далі ми використовуємо цей навчальний сценарій, щоб створити оцінювач TensorFlow за допомогою SDK SageMaker. Цей оцінювач використовується для підгонки класифікатора цифр мови жестів до наданих вхідних даних. Після завершення навчання модель зберігається в 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 із SDK SageMaker. Модель обслуговування створюється для однієї з моделей, яка буде розміщена в кінцевій точці з кількома моделями. В даному випадку ми використовуємо першу модель (класифікатор зображень CIFAR-10). Далі ми використовуємо клас MultiDataModel із SDK SageMaker, щоб створити багатомодельну модель даних за допомогою моделі обслуговування для моделі-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. Після кешування моделі в мультимодельній кінцевій точці наступні запити ініціюються в реальному часі (якщо модель не видалено). У результаті ви можете запускати багато моделей з одного екземпляра, фактично відокремлюючи кількість моделей від вартості розгортання. Це спрощує керування розгортанням ML у великих масштабах і знижує витрати на розгортання вашої моделі за рахунок збільшення використання кінцевої точки та базових обчислювальних екземплярів. Для отримання додаткової інформації та демонстрації економії витрат понад 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) у кінцеву точку з кількома моделями, викликаючи кінцеву точку з мовою жестів.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. Моделі класифікації зображень мали різну архітектуру моделей і навчалися на різних наборах даних. The ноутбук До публікації входять докладні інструкції щодо навчання та розміщення моделей.

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


Про авторів

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

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

Джерело: https://aws.amazon.com/blogs/machine-learning/host-multiple-tensorflow-computer-vision-models-using-amazon-sagemaker-multi-model-endpoints/

Часова мітка:

Більше від Блог машинного навчання AWS