Введение

Машинное обучение стало неотъемлемой частью цифровизации и модернизации ИТ-систем. Мы переносим все больше и больше задач машинного обучения из POC в производство. Предприятия принимают прогнозы/рекомендации машинного обучения для решения множества критически важных проблем, влияющих на жизнь людей и рентабельность инвестиций в бизнес.

Поэтому мы должны сосредоточиться на разработке системы машинного обучения, которая может быть легко интегрирована с ИТ-системами организации. Методы DevOps в области машинного обучения (называемые MLOps) позволяют команде специалистов по обработке и анализу данных создавать такие оркестровки.

В следующих нескольких разделах мы рассмотрим концепцию MLOps, рассмотрим архитектуру сквозного конвейера MLOps на платформе AWS Sagemaker и, наконец, развернем Nvidia Triton Inference Server для обслуживания моделей в Sagemaker.

Примечание. Чтобы узнать больше об AWS Sagemaker, платформе машинного обучения, ознакомьтесь с другим моим блогом: Создание модели машинного обучения в AWS Sagemaker.

Примечание. Чтобы узнать больше об AWS Sagemaker, передовой платформе машинного обучения, ознакомьтесь с другим моим блогом: Построение модели машинного обучения в AWS Sagemaker.

Что такое Млопс

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

Практики MLOps можно визуализировать на диаграмме ниже.

Почему AWS Sagemaker

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

AWS Sagemaker — это комплексная платформа машинного обучения, которая предоставляет все необходимые сервисы для развертывания модели в рабочей среде.

Эталонная архитектура MLOps AWS Sagemaker

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

Конечная точка Sagemaker является основной службой модуля Model Serving и переносит результат модели в реальный мир.

Что такое модельное обслуживание

Предсказание модели или обслуживание логического вывода — важная часть конвейера машинного обучения. Модель развертывается на сервере вывода после проверки и оптимизации. Мы можем использовать развернутую модель для прогнозирования неизвестного набора данных с помощью службы API или кластеров Kubernetes.

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

Результат модели предоставляется внешним пользователям в качестве сервера логических выводов.

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

Варианты подачи модели Sagemaker

Выводы Sagemaker –

1. Конечная точка в реальном времени

2. Пакетное преобразование

3. Безсерверный вывод

4. Асинхронный вывод

5. Nvidia Triton Inference (продукт Nividia AI)

Конечная точка Sagemaker Realtime — это лучшее решение для удовлетворения требований модели с высокой производительностью и малой задержкой. Однако есть важные показатели производительности, которые отслеживаются для достижения обслуживания SLA.

На приведенной ниже диаграмме показаны некоторые ключевые показатели, применимые к производительности конечной точки Sagemaker Realtime.

Почему Nvidia Triton Inference Server

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

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

Как правило, мы создаем рабочий процесс на основе DAG (ориентированный ациклический граф) для обработки запросов и обслуживания сквозного конвейера машинного обучения. По мере увеличения сложности архитектура машинного обучения использует сложные модели, большие объемы данных, несколько источников и различные инструменты для работы в многократных операциях, что приводит к большому времени отклика и плохому взаимодействию с пользователем.

Мы можем сократить время отклика и выполнить SLA по общей пропускной способности, разместив несколько моделей в одном экземпляре.

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

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

Nvidia Triton Inference Server — это технология с открытым исходным кодом, предлагающая решения для логических выводов с высокой пропускной способностью и малой задержкой для моделей машинного обучения производственного уровня. Хостинг моделей машинного обучения (ML) может иметь критично сложное соглашение об уровне обслуживания для бизнеса. Примеры использования, аналогичные механизму рекомендаций, обнаружению мошенничества и прогнозированию критически важных приложений в сфере здравоохранения и электронной коммерции. Этим приложениям требуется модель, обслуживающая API, с высокой пропускной способностью и малой задержкой, где счет идет на миллисекунды.

Мы создаем рабочий процесс на основе DAG (направленный ациклический граф) и обслуживаем сквозной конвейер машинного обучения. По мере увеличения сложности архитектура машинного обучения использует сложные модели, большие объемы данных, несколько источников и инструменты в многократных операциях, что приводит к большому времени отклика и плохому взаимодействию с пользователем.

Мы можем сократить время отклика и выполнить SLA по общей пропускной способности, разместив несколько моделей в одном экземпляре.

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

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

Nvidia Triton Inference Server — это технология с открытым исходным кодом, предлагающая решения для вывода с высокой пропускной способностью и малой задержкой для моделей машинного обучения производственного уровня.

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

Решение будет сосредоточено на развертывании модели Sagemaker в реальном времени с использованием Nvidia Triton Inference Server Container. Мы не собираемся обсуждать, как построить и обучить модель в Sagmaker, на которую можно сослаться в другом моем блоге, упомянутом во введении.

Мы собираемся использовать Sagemaker Inference для развертывания одной предварительно обученной PyTorch модели RESNET50 на сервере Nvidia Triton.

Модель RESNET50 будет загружена из torchvision с помощью док-контейнера PyTorch.

Настройте среду и роль IAM, которые будут использоваться Sagemaker для доступа к изображению Triton ECR и артефактам модели из S3.

Решение работает на экземпляре ноутбука sagemaker с типом GPU.

Эталонная архитектура Nvidia Triton показана ниже для понимания компонентов решения.

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

Мы установим необходимые пакеты, такие как boto3, sagemaker, nvidia-pyindex и tritonclient, для создания среды. После этого идентификатор учетной записи будет сопоставлен, и мы настроим образ контейнера.

Мы также установим среду выполнения Sagemaker и роль выполнения.

!pip install -qU pip awscli boto3 sagemaker
!pip install nvidia-pyindex
!pip install tritonclient[http]

import boto3, json, sagemaker, time
from sagemaker import get_execution_role
sm_client = boto3.client(service_name="sagemaker")
runtime_sm_client = boto3.client("sagemaker-runtime")
sagemaker_session = sagemaker.Session(boto_session=boto3.Session())
role = get_execution_role()

account_id_map = {
'США-восток-1': '785573368785',
'США-восток-2': '007439368137',
'США-восток-1': '710691900526' ,
'us-west-2': '301217895009',
'eu-west-1': '802834080501',
'eu-west-2': '205493899709',< br /> 'eu-west-3': '254080097072',
'eu-north-1': '601324751636',
'eu-south-1': '966458181534',
'eu-south-1': '966458181534',
> 'eu-central-1': '746233611703',
'ap-east-1': '110948597952',
'ap-south-1': '763008648453',
' ap-northeast-1': '941853720454',
'ap-northeast-2': '151534178276',
'ap-southeast-1': '324986816169',
'ap- юго-восток-2': '355873309152',
'сп-северо-запад-1': '474822919863',
'сп-север-1': '472730292857',
'са-восток- 1': '756306329178',
'ca-central-1': '464438896020',
'я-юг-1': '836785723513',
'af-юг-1' : '774647643957'
}

region = boto3.Session().region_name
если регион не указан в account_id_map.keys():
поднять("НЕПОДДЕРЖИВАЕМАЯ РЕГИОН")

Настройка uri изображения для изображения triton ECR

base = «amazonaws.com.cn», если region.startswith(«cn-») else «amazonaws.com»
triton_image_uri = «{account_id}.dkr.ecr.{region}.{base}/sagemaker- tritonserver:21.08-py3”.format(
account_id=account_id_map[region], region=region, base=base
)

Нам нужен служебный метод для подготовки полезной нагрузки запроса.

импортировать numpy как np
из PIL import Image
s3_client = boto3.client('s3')
s3_client.download_file(
«sagemaker-sample-files»,
"datasets/image/pets/shiba_inu_dog.jpg",
"shiba_inu_dog.jpg"
)

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

def get_sample_image():
image_path = "./shiba_inu_dog.jpg"
img = Image.open(image_path).convert("RGB")
img = img.resize((224, 224))
img = (np.array(img).astype(np.float32) / 255) — np.array(
[0,485, 0,456, 0,406], dtype=np.float32
).reshape(1, 1, 3)
img = img / np.array([0,229, 0,224, 0,225], dtype=np.float32).reshape(1, 1, 3)
img = np.transpose(img, (2, 0, 1))
вернуть img.tolist()

Импорт клиентского пакета triton, который создаст служебный метод для полезной нагрузки. Мы также преобразуем запрос логического вывода в двоичный формат, чтобы повысить производительность обслуживания логического вывода.

импортировать tritonclient.http как httpclient
def _get_sample_image_binary(input_name, output_name):
inputs = []
outputs = []
inputs.append(httpclient.InferInput(input_name, [1 , 3, 224, 224], «FP32»))
input_data = np.array(get_sample_image(), dtype=np.float32)
input_data = np.expand_dims(input_data, axis=0)< br /> inputs[0].set_data_from_numpy(input_data, binary_data=True)
outputs.append(httpclient.InferRequestedOutput(output_name, binary_data=True))
request_body, header_length = httpclient.InferenceServerClient.generate_request_body(< br /> входы, выходы = выходы
)
return request_body, header_length
def get_sample_image_binary_pt():
return _get_sample_image_binary("INPUT__0", "OUTPUT__0")
def get_sample_image_binary_trt():
вернуть _get_sample_image_binary («ввод», «вывод»)

docker запустит скрипт generate_models.sh, который загрузит модель pytorch resnet50 из torchvision и развернет ее на сервере логического вывода Triton в sagemaker.

!docker run — gpus=all — rm -it \

-v `pwd`/рабочая область:/рабочая область nvcr.io/nvidia/pytorch:21.08-py3 \

/bin/bash generate_models.sh

Собственное изображение автора из аккаунта AWS

Собственное изображение автора из аккаунта AWS

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

Я запускал модель в экземпляре ноутбука Sagemaker — Jupyterlab. Снимок экрана показан ниже.

Изображение автора взято из собственного аккаунта AWS

Упаковка и загрузка модели в S3

В этом разделе мы загрузим загруженную предварительно обученную модель в корзину S3 с помощью функции sagemaker_session.upload_data().

Эта модель будет развернута в конечной точке sagemaker для обслуживания модели.

Модель упакована со всеми артефактами, которые загружаются из контейнера torchvision. Они заархивированы с помощью tar.gz и сохранены в каталоге «triton-serve-pt/resnet/1/». Заархивированный пакет настроен для моделирования пути uri с использованием приведенных ниже кодов.

!mkdir -p triton-serve-pt/resnet/1/
!mv -f workspace/model.pt triton-serve-pt/resnet/1/
!tar -C triton-serve-pt / -czf model.tar.gz resnet
model_uri = sagemaker_session.upload_data(path="model.tar.gz", key_prefix="triton-serve-pt")
print(model_uri)

печать покажет -> s3://sagemaker-us-east-1–999999999/triton-serve-pt/model.tar.gz

Создание конечной точки Sagemaker

Теперь мы создаем конфигурацию конечной точки. Мы укажем тип экземпляра и количество экземпляров, которые будут использоваться конечной точкой. Мы используем тип GPU «g4dn.4xlarge».

Модель управляется версией с помощью datetime.

«SAGEMAKER_TRITON_DEFAULT_MODEL_NAME» — это переменная среды, для которой установлено значение = resnet. Обратите внимание, что это должно совпадать с именем папки, загруженной в s3.

Мы также можем установить SAGEMAKER_TRITON_BUFFER_MANAGER_THREAD_COUNT &

SAGEMAKER_TRITON_THREAD_COUNT для оптимизации количества потоков.

Следующие коды реализуют эти шаги.

sm_model_name = "triton-resnet-pt-" + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
container = {
«Изображение»: triton_image_uri,
«ModelDataUrl»: model_uri,
«Окружающая среда»: {«SAGEMAKER_TRITON_DEFAULT_MODEL_NAME»: «resnet»},
}
create_model_response = sm_client.create_model (
ModelName=sm_model_name, ExecutionRoleArn=role, PrimaryContainer=container
)
print("Arn модели: " + create_model_response["ModelArn"])

endpoint_config_name = "triton-resnet-pt-" + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
create_endpoint_config_response = sm_client.create_endpoint_config (
EndpointConfigName=endpoint_config_name,
ProductionVariants=[
{
«InstanceType»: «ml.g4dn.4xlarge»,
«InitialVariantWeight»: 1,
«InitialVariantWeight»: 1,
> «InitialInstanceCount»: 1,
«ModelName»: sm_model_name,
«VariantName»: «AllTraffic»,
}
],
)
print («Конфигурация конечной точки Arn: « + create_endpoint_config_response[«EndpointConfigArn»])

Выход :

Арн конфигурации конечной точки: arn:aws:sagemaker:us-east-1:99999999:endpoint-config/triton-resnet-pt-2022–08–01–15–12–24

Теперь мы создадим sagemaker emdpoint, используя приведенную выше конфигурацию конечной точки. Подождите, пока конечная точка не перейдет в состояние обслуживания.

endpoint_name = "triton-resnet-pt-" + time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())
create_endpoint_response = sm_client.create_endpoint (
EndpointName=endpoint_name, EndpointConfigName=endpoint_config_name
)
print("Endpoint Arn: " + create_endpoint_response["EndpointArn"])

Выход -> Конечная точка Arn: arn:aws:sagemaker:us-east-1:9999999:endpoint/triton-resnet-pt-2022–08–01–15–12–32

Проверка состояния конечной точки

resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp["EndpointStatus"]
print("Status: " + status)
while status == "Creating":
> time.sleep(60)
resp = sm_client.describe_endpoint(EndpointName=endpoint_name)
status = resp["EndpointStatus"]
print("Status: " + status)
print("Arn: " + resp["EndpointArn"])
print("Status: " + status)

Выход ->

Статус: Создание

Статус: Создание

Статус: Создание

Статус: Создание

Статус: Создание

Статус: Создание

Статус: В рабочем состоянии

Arn: arn:aws:sagemaker:us-east-1:999999:endpoint/triton-resnet-pt-2022–08–01–15–12–32

Статус: В рабочем состоянии

Изображение автора из ее собственного аккаунта AWS

Мы запустим вывод, как только конечная точка перейдет в состояние «работает».

Изображение автора из ее собственного аккаунта AWS

Изображение автора из ее собственного аккаунта AWS

Вызов конечной точки и выполнение логического вывода

Затем мы вызовем конечную точку для прогнозирования и выполнения вывода с загруженным ранее образцом изображения.

Мы определим входные данные полезной нагрузки, определим функцию invoke_endpoint.

полезная нагрузка = {
«входы»: [
{
«имя»: «INPUT__0»,
«форма»: [1, 3, 224, 224],
«тип данных»: «FP32»,
«данные»: get_sample_image(),
}
]
}

ответ = runtime_sm_client.invoke_endpoint(

EndpointName=endpoint_name, ContentType=”application/octet-stream”, Body=json.dumps(payload)
)
print(json.loads(response[“Body”]].read().decode( "утф8")))

request_body, header_length = get_sample_image_binary_pt()
response = runtime_sm_client.invoke_endpoint(
EndpointName=endpoint_name,
ContentType="application/vnd.sagemaker-triton.binary+json;json-header-size= {}».format(
header_length
),
Body=request_body,
)

header_length_prefix = «application/vnd.sagemaker-triton.binary+json;json-header-size=»

header_length_str = ответ["ContentType"][len(header_length_prefix):]

Чтение тела ответа

result = httpclient.InferenceServerClient.parse_response_body(
response["Body"].read(), header_length=int(header_length_str)
)
output0_data = result.as_numpy("OUTPUT__0")
печать (output0_data)

Заключение

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

В этой статье мы проверили, как интегрировать сервер вывода Triton с Sagemaker.

  • С помощью Sagemaker и Nvidia Triton Inference Server (интеграция контейнера) мы можем еще больше упростить развертывание машинного обучения, имея единое решение для обслуживания логических выводов на нескольких платформах (Pytorch, Tensorflow, ONNX и т. д.) с использованием высокопроизводительных графических и центральных процессоров.
  • • Тем не менее, Triton не является лучшим решением для всех видов требований к логическому выводу.
  • • Мы должны понимать постановку проблемы, технологический ландшафт и ожидания конечного пользователя для сравнения текущего и целевого SLA производительности.
  • • Анализ затрат и результатов и расчет рентабельности инвестиций важны перед размещением любой рабочей нагрузки по логическому выводу на сервере Nvidia Triton Inference Server или разработкой нового решения для логического вывода Triton.

Очистка ресурсов AWS

Очистите конечную точку, все запущенные задания, остановите все экземпляры ноутбуков после завершения проекта.

Вы можете использовать приведенный ниже код для очистки ресурсов. Мы также можем использовать консоль управления AWS для очистки.

sm_client.delete_model(ModelName=sm_model_name)
sm_client.delete_endpoint_config(EndpointConfigName=endpoint_config_name)
sm_client.delete_endpoint(EndpointName=endpoint_name)

Ссылка:

https://github.com/aws/amazon-sagemaker-examples/tree/435506384dc397daf8307f5fb74ac97ade386dcd/sagemaker-triton/resnet50

https://github.com/aws/amazon-sagemaker-examples/tree/435506384dc397daf8307f5fb74ac97ade386dcd/sagemaker-triton/resnet50