Развёртывание вашей модели машинного обучения в облачной среде

Развертывание вашей модели машинного обучения в облачной среде советы и рекомендации

 

AWS, или Amazon Web Services, это облачный сервис, который используется во многих бизнесах для хранения, аналитики, приложений, развертывания и других целей. Это платформа, которая использует несколько сервисов для поддержки бизнеса в безсерверном режиме с оплатой по мере использования.

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

В этой статье будет рассмотрено развертывание модели машинного обучения в облачном сервисе AWS в продакшн. Как это можно сделать? Давайте рассмотрим подробнее.

 

Подготовка

 

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

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

 

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

 

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

После получения набора данных мы создадим ведро S3 для его хранения. Ищем S3 в сервисах AWS и создаем ведро.

  

В этой статье я назвал ведро “telecom-churn-dataset” и разместил его в Сингапуре. Вы можете изменить эти параметры, если хотите, но пока что оставим так.

После создания ведра и загрузки данных в него, мы перейдем к сервису AWS SageMaker. В этом сервисе мы будем использовать Studio в качестве рабочей среды. Если вы ранее не использовали Studio, давайте создадим домен и пользователя перед продолжением.

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

  

В разделе Пользователи вы увидите множество кнопок для выбора. В этом окне выберите кнопку Создать домен.

  

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

  

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

  

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

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

  

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

  Изображение: автор

С новым блокнотом мы будем создавать модель прогнозирования оттока и развертывать модель в API-инференсах, которые мы можем использовать в производстве.

Сначала импортируем необходимые пакеты и прочитаем данные об оттоке.

import boto3import pandas as pdimport sagemakersagemaker_session = sagemaker.Session()role = sagemaker.get_execution_role()df = pd.read_csv('s3://telecom-churn-dataset/telecom_churn.csv')

  Изображение: автор

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

from sklearn.model_selection import train_test_splittrain, test = train_test_split(df, test_size = 0.3, random_state = 42)

 

Мы установим размер тестовых данных на 30% от исходных данных. После разделения данных мы загрузим их обратно в корзину S3.

bucket = 'telecom-churn-dataset'train.to_csv(f's3://{bucket}/telecom_churn_train.csv', index = False)test.to_csv(f's3://{bucket}/telecom_churn_test.csv', index = False)

 

Вы можете увидеть данные в вашей корзине S3, которая в настоящее время состоит из трех разных наборов данных.

  Изображение: автор

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

Для следующего шага нам нужно создать дополнительный файл Python, который я назвал train.py, в той же папке.

  Изображение: автор

Внутри этого файла мы зададим процесс разработки модели для создания модели прогнозирования оттока. Для этого руководства я использовал некоторый код из Ram Vegiraju.

Сначала мы импортируем все необходимые пакеты для разработки модели.

import argparseimport osimport ioimport boto3import jsonimport pandas as pdfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.metrics import accuracy_scoreimport joblib

 

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

if __name__ == '__main__':        parser = argparse.ArgumentParser()    parser.add_argument('--estimator', type=int, default=10)    parser.add_argument('--sm-model-dir', type=str, default=os.environ.get('SM_MODEL_DIR'))    parser.add_argument('--model_dir', type=str)    parser.add_argument('--train', type=str, default=os.environ.get('SM_CHANNEL_TRAIN'))        args, _ = parser.parse_known_args()        estimator = args.estimator    model_dir = args.model_dir    sm_model_dir = args.sm_model_dir    training_dir = args.train    s3_client = boto3.client('s3')    bucket = 'telecom-churn-dataset'    obj = s3_client.get_object(Bucket=bucket, Key='telecom_churn_train.csv')    train_data = pd.read_csv(io.BytesIO(obj['Body'].read()))        obj = s3_client.get_object(Bucket=bucket, Key='telecom_churn_test.csv')    test_data = pd.read_csv(io.BytesIO(obj['Body'].read()))        X_train = train_data.drop('Churn', axis =1)    X_test = test_data.drop('Churn', axis =1)        y_train = train_data['Churn']    y_test = test_data['Churn']        rfc = RandomForestClassifier(n_estimators=estimator)    rfc.fit(X_train, y_train)    y_pred = rfc.predict(X_test)        print('Accuracy Score: ',accuracy_score(y_test, y_pred))        joblib.dump(rfc, os.path.join(args.sm_model_dir, "rfc_model.joblib"))

 

В конце концов, нам нужно определить четыре различные функции, которые требуются SageMaker для выполнения выводов: model_fn, input_fn, output_fn и predict_fn.

#Десериализация модели для их загрузкиdef model_fn(model_dir):    model = joblib.load(os.path.join(model_dir, "rfc_model.joblib"))    return model#Входной запрос приложенияdef input_fn(request_body, request_content_type):    if request_content_type == 'application/json':        request_body = json.loads(request_body)        inp_var = request_body['Input']        return inp_var    else:        raise ValueError("Эта модель поддерживает только ввод в формате application/json")#Функции прогнозированияdef predict_fn(input_data, model):    return model.predict(input_data)#Функция выводаdef output_fn(prediction, content_type):    res = int(prediction[0])    resJSON = {'Output': res}    return resJSON

 

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

from sagemaker.sklearn import SKLearnsklearn_estimator = SKLearn(entry_point='train.py',                           role=role,                          instance_count=1,                           instance_type='ml.c4.2xlarge',                          py_version='py3',                          framework_version='0.23-1',                          script_mode=True,                          hyperparameters={                              'estimator': 15})sklearn_estimator.fit()

 

Если обучение прошло успешно, у вас будет следующий отчет.

 Изображение от автора 

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

model_artifact = sklearn_estimator.model_dataimage_uri = sklearn_estimator.image_uriprint(f'Артефакт модели сохранен по адресу: {model_artifact}')print(f'URI изображения: {image_uri}')

 

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

import timechurn_endpoint_name='churn-rf-model-'+time.strftime("%Y-%m-%d-%H-%M-%S", time.gmtime())churn_predictor=sklearn_estimator.deploy(initial_instance_count=1,instance_type='ml.m5.large',endpoint_name=churn_endpoint_name)

 

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

 Изображение от автора 

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

client = boto3.client('sagemaker-runtime')content_type = "application/json"#замените на ваши данные вводаrequest_body = {"Input": [[128,1,1,2.70,1,265.1,110,89.0, 9.87,10.0]]}#замените на имя вашей точки входаendpoint_name = "churn-rf-model-2023-09-24-12-29-04" #Сериализация данныхdata = json.loads(json.dumps(request_body))payload = json.dumps(data)#Вызов точки входаresponse = client.invoke_endpoint(    EndpointName=endpoint_name,    ContentType=content_type,    Body=payload)result = json.loads(response['Body'].read().decode())['Output']result

 

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

from sagemaker import Sessionsagemaker_session = Session()sagemaker_session.delete_endpoint(endpoint_name='имя-вашей-точки-входа')

 

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

Для дальнейшего чтения вы можете прочитать более подробно о оценщике SKLearn и Batch Transform inferences, если вы предпочитаете не использовать модель точки доступа.

Заключение

Платформа AWS Cloud – многоцелевая платформа, которую многие компании используют для поддержки своего бизнеса. Одна из часто используемых услуг – анализ данных, особенно производство моделей. В этой статье мы узнаем, как использовать AWS SageMaker и как развернуть модель в точку доступа. Cornellius Yudha Wijaya – заместитель руководителя отдела науки о данных и писателя данных. В то время как он работает на полную ставку в Allianz Indonesia, он любит делиться советами по Python и обработке данных через социальные сети и печатные СМИ.