В нашей предыдущей статье мы увидели, как запустить Jupyter Notebook на AWS SageMaker. Хотя мы не написали ни строчки кода, нам осталось сделать еще несколько шагов, прежде чем мы приступим к кодированию. В этой статье мы сделаем следующее.

  1. Создайте корзину на AWS S3 (Simple Storage Service), в которой будут храниться наборы данных.
  2. Загрузите наши наборы данных в корзину.
  3. Создайте политики, чтобы экземпляр записной книжки SageMaker мог получить доступ к наборам данных.
  4. Создайте кластер экземпляров для запуска настройки гиперпараметров. Каждый из этих экземпляров будет запускать контейнер.
  5. Выберите лучшую модель и запустите прогнозы в другом экземпляре, снова используя контейнер.
  6. Сравните тестовый набор и наземную правду.

Код Python для этого проекта можно найти в этом репозитории GitHub.

Загрузка наборов данных

Загрузите CSV-файлы ground_truth, train , validation и test. Теперь вернитесь в консоль AWS и на этот раз найдите сервис S3 (Simple Storage Service). Мы не будем слишком углубляться в набор данных. Просто имейте в виду, что файлы csv должны соответствовать следующим характеристикам согласно SageMaker. Есть 111 функций и ярлык.

  1. Не должно быть столбцов заголовков
  2. Метки должны быть в первом столбце. Таким образом, файлы обучения и проверки имеют 112 столбцов.
  3. В тестовом наборе есть только функции без столбца меток. Итак, у него 111 столбцов.
  4. Файл наземной истины — это файл набора тестов, к началу которого добавлен столбец меток. Таким образом, он имеет 112 столбцов.

Дополнительную информацию о форматах ввода SageMaker можно найти здесь

В моем случае у меня уже есть два ведра. Нажмите «Создать корзину», и откроется следующее окно.

Введите имя корзины, учитывая следующее

  1. S3 использует глобальное пространство имен, то есть имя вашей корзины должно быть глобально уникальным. В моем случае я назвал его mylaundrybucket (простите за каламбур).
  2. См. дополнительные рекомендации, напечатанные мелким шрифтом под текстовым полем.

Прокрутите вниз до конца и нажмите «Создать корзину». Теперь вы должны увидеть вновь созданное ведро. Нажмите на имя корзины, и вы должны получить следующее окно для загрузки ваших файлов.

Нажмите «Загрузить» и выберите все четыре файла из вашей локальной системы. Это должно привести вас к окну прогресса ниже.

Теперь щелкните имя корзины под пунктом назначения, теперь вы сможете увидеть все файлы в своей корзине. Нажмите «Разрешения», и вы должны открыть следующую страницу с обзором разрешений.

Прокрутите вниз, пока не увидите политику корзины. Нажмите Редактировать

Откроется следующее окно. Нажмите «Добавить новый оператор», и прямо под «Политикой» появится несколько строк JSON.

Настройка политик

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

  1. Замените строку mylaundrybucket названием своей корзины.
  2. Вставьте ARN роли IAM из первой части этой статьи. Вы найдете его чуть выше рис. 9.2 в Часть-I.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::570517415597:role/service-role/AmazonSageMaker-ExecutionRole-20210106T114090"
            },
            "Action": "s3:*",
            "Resource": "arn:aws:s3:::mylaundrybucket"
        }
    ]
}

Все, что мы сделали, это предоставили нашему экземпляру Sagemaker Notebook ( Основной ) доступ к корзине S3 ( Ресурсу ) от вашего имени и выполнили все возможные действия с корзиной s3 ( Действие). Это позволит ноутбуку получать данные поезда и набора тестов во время обучения. В практическом сценарии у вас могут быть наборы данных размером в несколько десятков ГБ. Затем можно отправлять ваши данные по частям в алгоритм обучения.

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

Назад к Sagemaker

Теперь мы можем вернуться в верхнюю часть консоли, набрать в поиске SageMaker и выбрать Amazon Sagemaker. Найдите Блокнот › Экземпляры ноутбуков слева. Теперь вы сможете вернуться к этому окну.

Проверяем экземпляр MyDemoInstance, жмем Actions›Start. Подождите, пока статус не станет InService. Теперь нажмите Открыть JupyterLab

Вы должны увидеть Jupyter Notebook, который вы создали в первой части. Приступаем к кодированию, вставляем следующие строки в первую ячейку.

from imblearn.over_sampling import SMOTE
import boto3
import sagemaker
from sagemaker.debugger import Rule, rule_configs
from sagemaker.tuner import(
    IntegerParameter,
    ContinuousParameter,
    HyperparameterTuner,
)
from sagemaker.inputs import TrainingInput
from sagemaker import get_execution_role
import pandas as pd

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

Двигаясь дальше, запустите этот фрагмент кода в следующей ячейке.

role = get_execution_role()
my_region = boto3.session.Session().region_name
print("Success - the MySageMakerInstance is in the " + my_region )
print(role)

Это должно напечатать что-то похожее на следующие строки. В вашем случае вы получите распечатанное название вашего региона (в моем случае это ap-south-1). Кроме того, мы распечатали ARN роли IAM, который полностью идентичен тому, что вы получили выше.

Success - the MySageMakerInstance is in the ap-south-1
arn:aws:iam::570517415597:role/service-role/AmazonSageMaker-ExecutionRole-20210106T114090

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

sess = sagemaker.Session()
container = sagemaker.image_uris.retrieve("xgboost", my_region, "latest")
print(container)

Переменная sess позволяет нам взаимодействовать с другими сервисами AWS. В этом случае мы будем взаимодействовать с S3, а также делать вызовы API для запуска нескольких экземпляров. оператор печати дает нам строку, подобную следующей. Это просто название образа, который мы будем использовать для AWS ECR (Elastic Container Registry).

991648021394.dkr.ecr.ap-south-1.amazonaws.com/xgboost:latest

У AWS есть большой репозиторий готовых образов Dockerздесь. Вы заметите, что только для XGBoost есть так много вариантов на выбор. Точно так же существуют предварительно созданные контейнеры для Tensorflow, Scikit-learn, SPARK ML и т. д. Идея состоит в том, чтобы позволить нам позволить контейнерам выполнять всю тяжелую работу. Вы также можете сделать свой образ, но я думаю, что это в другой день.

Если вы перейдете по ссылке выше и прокрутите до раздела XGBoost, вы сможете увидеть это изображение.

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

#Replace bucket name with your bucket
my_bkt='mylaundrybucket'
rules=[Rule.sagemaker(rule_configs.create_xgboost_report())]
xgb = sagemaker.estimator.Estimator(
    container,
    role,
    instance_count=1,
    instance_type="ml.m4.xlarge",
    output_path='s3://{}/models'.format(my_bkt),
    sagemaker_session=sess,
)
xgb.set_hyperparameters(
    eval_metric="auc",
    objective="binary:logistic",
    num_round=100,
    rate_drop=0.3,
    tweedie_variance_power=1.4,
    rules=rules
)

xgb — это экземпляр класса оценщика SageMaker. Мы инкапсулировали в него аргументы container, role и sess, которые мы определили выше.

Аргумент output_path — это папка, которую алгоритм обучения создаст внутри нашего сегмента для хранения артефактов модели. В вашем случае папка с именем models будет автоматически создана внутри вашего ведра.

Мы устанавливаем некоторые гиперпараметры по умолчанию.

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

s3_input_train = sagemaker.inputs.TrainingInput(s3_data='s3://{}/sage_train.csv'.format(my_bkt), content_type='csv')
s3_input_validation = sagemaker.inputs.TrainingInput(s3_data='s3://{}/sage_val.csv'.format(my_bkt), content_type='csv')

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

hyperparameter_ranges = {
    "eta": ContinuousParameter(0, 1),
    "min_child_weight": ContinuousParameter(1, 10),
    "alpha": ContinuousParameter(0, 2),
    "max_depth": IntegerParameter(4, 10),
}
objective_metric_name = "validation:auc"
tuner = HyperparameterTuner(xgb, objective_metric_name, hyperparameter_ranges, max_jobs=6, max_parallel_jobs=3)

Обратите внимание, что некоторые параметры являются непрерывными, а некоторые целыми. Непрерывные перемещаются от минимума к максимуму с десятичным приращением. Наконец, мы определяем экземпляр тюнера класса HyperparameterTuner и инкапсулируем некоторые из аргументов, которые мы определили выше. Параметры max_jobs и max_parallel_jobs имеют компромисс, описанный в ссылке на рекомендации выше.

max_jobs — это максимальное общее количество обучающих заданий, которые нужно запустить для задания настройки гиперпараметров (по умолчанию: 1, мы выбрали 6).

max_parallel_jobs — максимальное количество параллельных обучающих заданий для запуска (по умолчанию: 1, мы выбрали 3).

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

Запуск задания настройки

Наконец, затаив дыхание, запускаем следующую строчку кода. Это запустит обучающие задания на нескольких виртуальных машинах (экземплярах EC2).

tuner.fit({"train": s3_input_train, "validation": s3_input_validation}, include_cls_metadata=False)

Эта ячейка займет некоторое время, чтобы запустить. Вернитесь к Amazon Sagemaker (соседняя страница) в браузере. Найдите Training›Training jobs, как показано на изображении ниже. Теперь вы должны увидеть три обучающих задания, все в статусе InProgress.

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

Попробуем разобраться, что происходит под капотом. Код, который мы написали до сих пор, запустил эти 3 экземпляра (виртуальные серверы) типа ml.m4.xlarge. Каждый из этих экземпляров запускает док-контейнер, который мы указали выше. Внутри каждого из этих контейнеров уже встроен алгоритм XGBoost. Этот алгоритм извлекает данные обучения и проверки и ищет лучший гиперпараметр.

Результаты настройки

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

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

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

Вернемся в JupyterLab и напечатаем эти строки. Это даст нам сводку о работе по настройке, которую мы выполнили.

from pprint import pprint
tuning_job_result=boto3.client("sagemaker").describe_hyper_parameter_tuning_job(
    HyperParameterTuningJobName=tuner.latest_tuning_job.job_name
)
if tuning_job_result.get("BestTrainingJob", None):
    print("Best model found so far:")
    pprint(tuning_job_result["BestTrainingJob"])
else:
    print("No training jobs have reported results yet.")

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

Best model found so far:
{'CreationTime': datetime.datetime(2022, 7, 2, 6, 2, 44, tzinfo=tzlocal()),
 'FinalHyperParameterTuningJobObjectiveMetric': {'MetricName': 'validation:auc','Value': 0.9948490262031555},
 'ObjectiveStatus': 'Succeeded',
 'TrainingEndTime': datetime.datetime(2022, 7, 2, 6, 6, 48, tzinfo=tzlocal()),
 'TrainingJobArn': 'arn:aws:sagemaker:ap-south-1:570517415597:training-job/xgboost-220702-0557-006-b02e145d',
 'TrainingJobName': 'xgboost-220702-0557-006-b02e145d',
 'TrainingJobStatus': 'Completed',
 'TrainingStartTime': datetime.datetime(2022, 7, 2, 6, 4, 25, tzinfo=tzlocal()),
 'TunedHyperParameters': {'alpha': '0.36843552580362204',
                          'eta': '0.3283748406816732',
                          'max_depth': '8',
                          'min_child_weight': '6.631353393968709'}}

Проверка AUC составляет 99,5%. Здесь также печатаются настроенные значения гиперпараметров. Наконец, лучшая модель, созданная в этом упражнении, хранится в S3 под именем xgboost-220702–0557–006-b02e145d.

Прокрутите вверх и введите S3 в строке поиска и вернитесь к созданному нами сегменту. Щелчок по нашему сегменту показывает, что были созданы новые модели папок. Внутри этой папки у нас ровно 6 папок с моделями. Одна из этих папок содержит лучшую модель (в данном случае это xgboost-220702–0557–006-b02e145d). Навигация внутри папки также показывает подпапку с именем output, которая содержит файл model.tar.gz. Это то, чего мы пытались достичь. Запишите свою лучшую модель, так как она скоро понадобится для выполнения прогнозов.

Выполнение прогнозов

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

s3 = boto3.resource('s3')
bucket = s3.Bucket(my_bkt)
for obj in bucket.objects.all():
    if obj.key.find('model.tar')>-1:
        print(obj.key)
        KEY=obj.key

Это должно перечислить что-то похожее на строки ниже. Обратите внимание, что это также включает путь нашей лучшей модели.

models/xgboost-220702-0557-001-7e933b22/output/model.tar.gz
models/xgboost-220702-0557-002-a50caa48/output/model.tar.gz
models/xgboost-220702-0557-003-8e680304/output/model.tar.gz
models/xgboost-220702-0557-004-d59193ca/output/model.tar.gz
models/xgboost-220702-0557-005-47391ac0/output/model.tar.gz
models/xgboost-220702-0557-006-b02e145d/output/model.tar.gz

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

my_best_job=tuning_job_result["BestTrainingJob"]["TrainingJobName"]
model = sagemaker.model.Model(    image_uri=container,model_data='s3://{}/models/{}/output/model.tar.gz'.format(my_bkt,my_best_job),role=role)
transformer = model.transformer(
    instance_count=1, instance_type="ml.m4.xlarge", 
    assemble_with="Line", accept="text/csv",
    output_path='s3://{}/models'.format(my_bkt)
)

На этот раз мы определяем модель как экземпляр класса SageMaker Model и инкапсулируем тот же контейнер, который мы использовали выше, но на этот раз мы будем использовать его для логического вывода (предсказания) и внедрить в него нашу лучшую модель. Мы также назначаем тот же ARN роли IAM, который мы использовали выше. Для нашей работы по прогнозированию мы будем использовать тот же тип экземпляра, который мы использовали для обучения. Для метода преобразования модели требуется тип экземпляра и путь s3 для хранения выходных данных.

Наконец, запустите эти строки и расслабьтесь. Прогнозы длятся около 4 минут.

test_data_path='s3://{}/sage_test.csv'.format(my_bkt)
transformer.transform(test_data_path, content_type="text/csv")

Как только это будет сделано, он создаст файл sage_test.csv.out внутри нашей корзины s3 в папке моделей, содержащий вероятности прогнозирования в подпапке моделей в нашей корзине.

Мы можем просто скопировать его в наш экземпляр и просмотреть прогноз. Мы также загрузим в наш экземпляр файл Ground_Truth.csv, чтобы можно было выполнить сравнение.

#Downloading both the ground truth and the predictions into our instance.
s3.Bucket(my_bkt).download_file('Ground_Truth.csv', 'Ground_Truth.csv')
s3.Bucket(my_bkt).download_file('models/sage_test.csv.out', 'sage_test.csv.out')

Когда у нас есть оба файла, мы импортируем некоторые стандартные библиотеки для расчета метрик.

import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.metrics import plot_confusion_matrix,roc_curve,roc_auc_score,auc
import seaborn as sns
#Read in the downloaded files. pred_proba contains the predicted probabilities from our best model.
#The test_df comtains the ground truth data, with the first column containing the tru class labels.
pred_proba = pd.read_csv('output.csv',header=None)
test_df =pd.read_csv('Ground_Truth.csv',header=None)
y_test=test_df.iloc[:, 0].values
# Evaluate the metrics for various thresholds
fpr, tpr, thresholds = roc_curve(y_test,pred_proba)
# compute AUC
roc_auc = auc(fpr, tpr)
# Plotting the Threshold on the ROC Curve
fig = plt.figure(figsize=(9,6))
ax = fig.add_subplot(111)
ax.set_title('Choosing the Correct Threshold with Hold Out ROC-AUC {:0.3f}'.format(roc_auc), fontsize=14)
ax.set_ylabel('TPR and Threshold')
ax.set_xlabel('FPR')
 
# Plot the AUC Curve
ax=sns.lineplot(fpr[1::], thresholds[1::], markeredgecolor='r',linestyle='dashed', color='r',label='Thresholds')
# Plot the Thresholds Curve
ax=sns.lineplot(x=fpr[1::], y=tpr[1::],linewidth= 3,color='b',label='FPR vs TPR')

Это создает следующую кривую. Обратите внимание, что мы получили AUC 99,5% для набора тестов удержания.

Заключение

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

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

Внимание!! Еще раз, я настоятельно рекомендую убедиться, что вы закрыли свой экземпляр, как только вы закончите. Вернитесь на страницу экземпляров SageMaker Notebook. Выберите переключатель вашего экземпляра. Нажмите Действия›Остановить. Если вы пропустите этот шаг, AWS будет продолжать взимать плату за экземпляр , пока он работает.