Введение

Amazon Web Services (AWS) — популярный поставщик облачных услуг, предлагающий широкий спектр услуг, включая SageMaker, полностью управляемый сервис для создания, обучения и развертывания моделей машинного обучения. В этой статье мы рассмотрим сценарий Python, который использует AWS SageMaker для обучения и развертывания модели XGBoost в известном наборе данных Iris. Мы подробно объясним каждую строку кода и обсудим ключевые концепции развертывания моделей машинного обучения в AWS SageMaker. Вы можете получить доступ к полному коду здесь.

Раздел 1. Импорт библиотек и загрузка набора данных

Первым шагом в нашем скрипте является импорт необходимых библиотек:

import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import boto3
import json
import numpy as np
import time
import botocore.exceptions

Начнем с импорта pandas, широко используемой библиотеки для обработки и анализа данных. Затем мы импортируем load_iris из sklearn.datasets, что загружает набор данных Iris. Мы также импортируем train_test_split из sklearn.model_selection, которые будут использоваться для разделения набора данных на наборы для обучения и тестирования.

boto3 — это AWS SDK для Python, который позволяет разработчикам Python писать программное обеспечение, взаимодействующее с такими сервисами AWS, как SageMaker. Мы также импортируем json для анализа данных JSON, numpy для числовых операций, time для доступа к текущему времени и botocore.exceptions для обработки исключений из AWS SDK.

Затем мы загружаем и подготавливаем набор данных Iris:

iris = load_iris()
iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)
iris_df['target'] = iris.target

Здесь мы загружаем набор данных Iris с помощью функции load_iris, которая возвращает объект Bunch, содержащий функции и метки набора данных. Затем мы создаем кадр данных pandas, iris_df, используя данные функций, и устанавливаем имена столбцов в имена функций. Наконец, мы добавляем целевую переменную в DataFrame.

Раздел 2. Подготовка данных

Как только набор данных загружен, нам нужно подготовить его к обучению:

iris_df = iris_df[['target'] + [col for col in iris_df.columns if col != 'target']]

train_data, test_data = train_test_split(iris_df, test_size=0.2, random_state=42)

train_data.to_csv('train.csv', index=False, header=False)
test_data.to_csv('test.csv', index=False, header=False)

Сначала мы перемещаем целевую переменную в первый столбец DataFrame. Это делается потому, что некоторые алгоритмы SageMaker, включая XGBoost, ожидают, что целевая переменная будет первым столбцом во входных данных. Затем мы разделяем набор данных на наборы для обучения и тестирования с помощью функции train_test_split, при этом 80% данных используются для обучения и 20% для тестирования.

Затем данные обучения и тестирования сохраняются в виде файлов CSV (train.csv и test.csv) без индекса и заголовка, поскольку алгоритмы SageMaker не ожидают их во входных файлах.

Раздел 3. Загрузка данных в Amazon S3

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

s3 = boto3.resource('s3')
bucket_name = 'yout_bucket_name'
s3.meta.client.upload_file('train.csv', bucket_name, 'iris/train/train.csv')
s3.meta.client.upload_file('test.csv', bucket_name, 'iris/test/test.csv')

Раздел 4. Обучение модели XGBoost в SageMaker

Теперь, когда наши данные находятся в S3, мы можем начать обучение модели XGBoost, используя встроенный алгоритм SageMaker:

sagemaker = boto3.client('sagemaker', region_name='your_region_name')
role_arn = 'your_role_arn'
xgboost_image = '257758044811.dkr.ecr.us-east-2.amazonaws.com/sagemaker-xgboost:1.2-1'

Сначала мы создаем клиент SageMaker, используя boto3. Параметр region_name указывает регион AWS, в котором будут созданы ресурсы. role_arn — это имя ресурса Amazon (ARN) роли IAM, которую SageMaker будет использовать для доступа к корзине S3 и другим ресурсам AWS. Переменная xgboost_image содержит URI образа контейнера XGBoost, который доступен в реестре эластичных контейнеров AWS (ECR).

Затем мы определяем уникальное имя задания обучения, используя текущее время:

training_job_name = f'xgboost-iris-{int(time.time())}'

Затем мы создаем задание обучения, указав образ контейнера XGBoost, режим ввода, ARN роли IAM, конфигурации входных и выходных данных, конфигурацию ресурсов, условие остановки и гиперпараметры:

response = sagemaker.create_training_job(
    TrainingJobName=training_job_name,
    AlgorithmSpecification={
        'TrainingImage': xgboost_image,
        'TrainingInputMode': 'File'
    },
    RoleArn=role_arn,
    InputDataConfig=[
        {
            'ChannelName': 'train',
            'DataSource': {
                'S3DataSource': {
                    'S3DataType': 'S3Prefix',
                    'S3Uri': f's3://{bucket_name}/iris/train/',
                    'S3DataDistributionType': 'FullyReplicated'
                }
            },
            'ContentType': 'text/csv'
        }
    ],
    OutputDataConfig={
        'S3OutputPath': f's3://{bucket_name}/iris/output/'
    },
    ResourceConfig={
        'InstanceType': 'ml.m5.large',
        'InstanceCount': 1,
        'VolumeSizeInGB': 10
    },
    StoppingCondition={
        'MaxRuntimeInSeconds': 3600
    },
    HyperParameters={
        'objective': 'multi:softmax',
        'num_round': '100',
        'num_class': '3'
    }
)

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

Затем мы ждем завершения задания обучения:

print("Waiting for the training job to complete...")
try:
    sagemaker.get_waiter('training_job_completed_or_stopped').wait(TrainingJobName=training_job_name)
except botocore.exceptions.WaiterError as e:
    print("Waiter encountered an error:", e)

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

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

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

model_name = f'xgboost-iris-{int(time.time())}'
endpoint_config_name = f'xgboost-iris-endpoint-config-{int(time.time())}'
endpoint_name = f'xgboost-iris-endpoint-{int(time.time())}'

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

Далее мы создаем модель, конфигурацию конечной точки и конечную точку:

sagemaker.create_model(
    ModelName=model_name,
    PrimaryContainer={
        'Image': xgboost_image,
        'ModelDataUrl': f's3://{bucket_name}/iris/output/{training_job_name}/output/model.tar.gz'
    },
    ExecutionRoleArn=role_arn
)

sagemaker.create_endpoint_config(
    EndpointConfigName=endpoint_config_name,
    ProductionVariants=[
        {
            'VariantName': 'AllTraffic',
            'ModelName': model_name,
            'InitialInstanceCount': 1,
            'InstanceType': 'ml.m5.large'
        }
    ]
)

sagemaker.create_endpoint(
    EndpointName=endpoint_name,
    EndpointConfigName=endpoint_config_name
)

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

Затем мы ждем, пока конечная точка станет доступной:

print(f"Creating endpoint {endpoint_name}...")
waiter = sagemaker.get_waiter('endpoint_in_service')
waiter.wait(EndpointName=endpoint_name)
print(f"Endpoint {endpoint_name} is in service.")

Раздел 6. Прогнозирование с использованием развернутой модели

Теперь, когда модель развернута на конечной точке, мы можем делать прогнозы с помощью клиента SageMaker Runtime:

runtime = boto3.client('sagemaker-runtime', region_name='your_region_name')

sample = test_data.sample(1)
sample_features = sample.drop(columns=['target']).values

Сначала мы создаем клиент SageMaker Runtime, а затем выбираем случайную выборку из тестового набора данных. Мы извлекаем функции выборки, удаляя целевой столбец.

Мы вызываем конечную точку, чтобы сделать прогноз:

response = runtime.invoke_endpoint(
    EndpointName=endpoint_name,
    ContentType='text/csv',
    Body=','.join(map(str, sample_features.flatten()))
)

Метод invoke_endpoint отправляет запрос в конечную точку с образцами объектов в качестве входных данных. Ответ содержит предсказанный класс.

Затем мы анализируем ответ и сравниваем предсказанный класс с истинным классом:

result = json.loads(response['Body'].read().decode('utf-8'))
predicted_class = result
true_class = int(sample['target'].values[0])

print(f"Predicted class: {predicted_class}, True class: {true_class}")

Раздел 7. Уборка

Наконец, мы удаляем конечную точку, чтобы избежать ненужных затрат:

sagemaker.delete_endpoint(EndpointName=endpoint_name)

Заключение

В этой статье мы рассмотрели сценарий Python, демонстрирующий, как обучить и развернуть модель XGBoost в наборе данных Iris с помощью AWS SageMaker. Мы подробно объяснили каждую строку кода, проливая свет на ключевые концепции, такие как подготовка данных, их загрузка в Amazon S3, обучение модели, ее развертывание в конечной точке и создание прогнозов с использованием развернутой модели. Этот сценарий может служить шаблоном для обучения и развертывания других моделей машинного обучения в SageMaker.

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

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