· Обзор
· Ручная обработка данных в Jupyter Notebook
Ручная обработка
· Использование встроенного контейнера SKLearnProcessor
· Принесите свой собственный контейнер для обработки
· Заключение
· Литература

Обзор

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

Amazon SageMaker Processing — это функция Amazon SageMaker, которая упрощает и упрощает предварительную и последующую обработку данных, а также оценку модели. Вы можете использовать SageMaker Processing с «Процессорами» для разработки функций, проверки данных, оценки модели, предварительной и постобработки.

Когда вы вызываете задание обработки, Amazon SageMaker берет сценарий, копирует данные из Amazon S3 и извлекает образ контейнера обработки для обработки данных. Затем обработанные данные записываются обратно в указанную вами корзину Amazon S3 или в корзину SageMaker S3 по умолчанию для этого конкретного региона. Вы можете выбрать встроенный образ SageMaker или использовать свой собственный образ для обработки данных.

Ниже показано, как работает Amazon SageMaker Processing. Данные копируются из корзины Amazon S3 в папку /opt/ml/process/input в докере, а обработанный файл записывается в папку /opt/ml/processing/output расположение внутри док-контейнера записывается обратно в Amazon S3.

Amazon SageMaker Processing предоставляет возможности для обработки данных с использованием Apache Spark, scikit-learn и готовых платформ машинного обучения, а именно — Hugging Face Framework, MXNet Framework, PyTorch Framework, TensorFlow Framework и XGBoost Framework.

Для обработки данных с помощью Apache Spark Amazon SageMaker предоставляет готовые образы Docker, включающие Apache Spark и другие зависимости, необходимые для выполнения задания распределенной обработки данных. Вы можете использовать класс sagemaker.spark.processing.PySparkProcessor для запуска сценариев PySpark в качестве задания обработки.

Для обработки данных скриптом scikit-learn вы можете использовать SKLearnProcessor из sagemaker.sklearn.processing.

Для других указанных платформ машинного обучения Amazon SageMaker предоставляет класс FrameworkProcessor. FrameworkProcessor поддерживает указание исходного каталога source_dir для сценариев обработки и зависимостей.

В этом блоге я расскажу о следующих трех вариантах:

  1. Обработка данных в Jupyter Notebook
  2. Использование встроенного контейнера scikit-learn
  3. Принесите свой собственный контейнер (BYOC)

Все вышеперечисленные варианты выполняются в Amazon SageMaker Studio. Amazon SageMaker Studio — полностью интегрированная среда разработки (IDE) для машинного обучения (ML), частично основанная на JupyterLab 3. Studio предоставляет веб-интерфейс для интерактивного выполнения задач разработки машинного обучения, необходимых для подготовки данных и создания, обучения и развертывания моделей машинного обучения.

Ручная обработка данных в Jupyter Notebook

В Amazon SageMaker Studio вы можете запустить новый блокнот Jupyter с образом Data Science и ядром Python 3. Я использовал образ Data Science 2.0 и ядро ​​Python 3, работающее в конфигурации типа экземпляра ml.t3.medium, для запуска блокнота Jupyter.

Вы можете обновить библиотеку sagemaker и boto3 до последней версии, используя следующие команды установки pip:

import sys
!{sys.executable} -m pip install --upgrade pip
!{sys.executable} -m pip install --upgrade boto3
!{sys.executable} -m pip install --upgrade sagemaker

После обновления пакета Python перезапустите ядро ​​и проверьте версии:

import sagemaker
import boto3
print(f'SageMaker Version: ',sagemaker.__version__)
print(f'Boto3 Version: ',boto3.__version__)

Образ Data Science в Amazon SageMaker Studio поставляется с установленными библиотеками Pandas и Numpy.

import pandas as pd
import numpy as np

Теперь вы можете создать фрейм данных Pandas, прочитав CSV-файл.

input_data = "s3://sagemaker-us-west-2-xxxxxxxxxxxx/datasets/census/full_data/census-income.csv"
df = pd.read_csv(input_data, nrows=10)
df.head(n=5)

В данном наборе данных у меня есть:

Целевой столбец: income

Особенности: age, education, major industry code, class of worker, num persons worked for employer, capital gains, capital losses, and dividends from stocks.

И я буду выполнять следующие шаги предварительной обработки данных:

  • Удалите дубликаты и строки с конфликтующими данными.
  • Преобразуйте целевой столбец income в столбец, содержащий две метки. Доход с - 50000 заменится на 0, а +50000 на 1.
  • Преобразуйте числовые столбцы age и num persons worked for employer в категориальные признаки, объединив их.
  • Масштабируйте непрерывные capital gains, capital losses и dividends from stocks, чтобы они подходили для обучения.
  • Закодируйте education, major industry code, class of worker, чтобы они подходили для обучения.
  • Разделите данные на обучающие и тестовые наборы данных и сохраните обучающие функции и метки, а также тестовые функции и метки.

Ручные шаги

Здесь мы применим все вышеупомянутые преобразования вручную в ячейке кода блокнота Jupyter —

# list of columns from the dataset
columns = [
"age",
"education",
"major industry code",
"class of worker",
"num persons worked for employer",
"capital gains",
"capital losses",
"dividends from stocks",
"income",
]

# define class label for target column `income`
class_labels = [" - 50000.", " 50000+."]
# create pandas dataframe reading the CSV file and only the required set of columns mentioned previously
df = pd.read_csv(input_data)
df = pd.DataFrame(data=df, columns=columns)

Ниже приведен скриншот набора данных. Набор данных содержит 199523 записи и имеет 9 функций/атрибутов, включая целевой атрибут:

Давайте отбросим строки, содержащие пропущенные значения и дублирующиеся. Также замените значение дохода — 50000 на 0 и + 50000 на 1.

df.dropna(inplace=True)
df.drop_duplicates(inplace=True)
df.replace(class_labels, [0, 1], inplace=True)

После этапа очистки данных давайте посмотрим на количество положительных и отрицательных примеров в столбце доходов.

negative_examples, positive_examples = np.bincount(df["income"])
print(
     "Data after cleaning: {}, {} positive examples, {} negative examples".format(
          df.shape, positive_examples, negative_examples
     )
)
Data after cleaning: (68285, 9), 11401 positive examples, 56884 negative examples

На этом этапе мы импортируем необходимые библиотеки scikit-learn, которые будут использоваться для преобразования данных в соответствии с нашими требованиями. О них можно прочитать далее здесь.

from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelBinarizer, KBinsDiscretizer
from sklearn.preprocessing import PolynomialFeatures
from sklearn.compose import make_column_transformer

И теперь, как и в любой задаче машинного обучения, мы хотим разделить набор данных на обучение и тестирование. Здесь мы выполняем разделение набора данных 80:20. Я знаю, что мне не хватает набора данных проверки :).

split_ratio=0.2
print("Splitting data into train and test sets with ratio {}".format(split_ratio))
X_train, X_test, y_train, y_test = train_test_split(
        df.drop("income", axis=1), df["income"], test_size=split_ratio, random_state=0
    )

Ниже приведено преобразование, которое мы выполним для поезда и тестовых данных с помощью make_column_transformer:

preprocess = make_column_transformer(
        (
            KBinsDiscretizer(encode="onehot-dense", n_bins=10),["age", "num persons worked for employer"]
        ),
        (StandardScaler(), ["capital gains", "capital losses", "dividends from stocks"]),
        (OneHotEncoder(sparse=False), ["education", "major industry code", "class of worker"])
    )

preprocess.fit_transform(X_train)

preprocess.transform(X_test)

Ниже приведен снимок экрана с запуском того же в ячейке кода блокнота Jupyter. После преобразования набор данных поезда и теста имеет 69 функций. :

Далее давайте выполним такое же преобразование, используя встроенный контейнер SKLearnProcessor в Amazon SageMaker.

Использование встроенного контейнера SKLearnProcessor

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

%%writefile preprocessing.py
 
import argparse
import os
import warnings
 
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelBinarizer, KBinsDiscretizer
from sklearn.compose import make_column_transformer
 
from sklearn.exceptions import DataConversionWarning
 
warnings.filterwarnings(action="ignore", category=DataConversionWarning)
 
 
columns = [
    "age",
    "education",
    "major industry code",
    "class of worker",
    "num persons worked for employer",
    "capital gains",
    "capital losses",
    "dividends from stocks",
    "income",
]
 
class_labels = [" - 50000.", " 50000+."]
 
 
def print_shape(df):
    negative_examples, positive_examples = np.bincount(df["income"])
    print(
        "Data shape: {}, {} positive examples, {} negative examples".format(
            df.shape, positive_examples, negative_examples
        )
    )
 
 
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--train-test-split-ratio", type=float, default=0.3)
    args, _ = parser.parse_known_args()
 
    print("Received arguments {}".format(args))
 
    input_data_path = os.path.join("/opt/ml/processing/input", "census-income.csv")
 
    print("Reading input data from {}".format(input_data_path))
    df = pd.read_csv(input_data_path)
    df = pd.DataFrame(data=df, columns=columns)
    df.dropna(inplace=True)
    df.drop_duplicates(inplace=True)
    df.replace(class_labels, [0, 1], inplace=True)
 
    negative_examples, positive_examples = np.bincount(df["income"])
    print(
        "Data after cleaning: {}, {} positive examples, {} negative examples".format(
            df.shape, positive_examples, negative_examples
        )
    )
 
    split_ratio = args.train_test_split_ratio
    print("Splitting data into train and test sets with ratio {}".format(split_ratio))
    X_train, X_test, y_train, y_test = train_test_split(
        df.drop("income", axis=1), df["income"], test_size=split_ratio, random_state=0
    )
 
    preprocess = make_column_transformer(
        (
            ["age", "num persons worked for employer"],
            KBinsDiscretizer(encode="onehot-dense", n_bins=10),
        ),
        (["capital gains", "capital losses", "dividends from stocks"], StandardScaler()),
        (["education", "major industry code", "class of worker"], OneHotEncoder(sparse=False)),
    )
    print("Running preprocessing and feature engineering transformations")
    train_features = preprocess.fit_transform(X_train)
    test_features = preprocess.transform(X_test)
 
    print("Train data shape after preprocessing: {}".format(train_features.shape))
    print("Test data shape after preprocessing: {}".format(test_features.shape))
 
    train_features_output_path = os.path.join("/opt/ml/processing/train", "train_features.csv")
    train_labels_output_path = os.path.join("/opt/ml/processing/train", "train_labels.csv")
 
    test_features_output_path = os.path.join("/opt/ml/processing/test", "test_features.csv")
    test_labels_output_path = os.path.join("/opt/ml/processing/test", "test_labels.csv")
 
    print("Saving training features to {}".format(train_features_output_path))
    pd.DataFrame(train_features).to_csv(train_features_output_path, header=False, index=False)
 
    print("Saving test features to {}".format(test_features_output_path))
    pd.DataFrame(test_features).to_csv(test_features_output_path, header=False, index=False)
 
    print("Saving training labels to {}".format(train_labels_output_path))
    y_train.to_csv(train_labels_output_path, header=False, index=False)
 
    print("Saving test labels to {}".format(test_labels_output_path))
    y_test.to_csv(test_labels_output_path, header=False, index=False)

Имея сценарий предварительной обработки, давайте инициализируем экземпляр SkLearnProcessor для выполнения задачи обработки данных с помощью scikit-learn. Во время инициализации я указываю framework_version (0.20.0), который является версией scikit-learn, которую будет использовать процессор. Кроме того, я использую один экземпляр (указанный параметром instance_count) файла ml.m5.xlarge (указанный параметром instance_type) для запуска задания обработки. Вы также можете указать другой доступный параметр, обратившись здесь

import boto3
import sagemaker
from sagemaker import get_execution_role
from sagemaker.sklearn.processing import SKLearnProcessor

role = get_execution_role()
sklearn_processor = SKLearnProcessor(
    framework_version="0.20.0"
    , role=role
    , instance_type="ml.m5.xlarge"
    , instance_count=1
    , base_job_name="sklearn-processor-nobyopc"
)

После инициализации экземпляра SKLearnProcessor следующим шагом будет вызов run() для запуска задания обработки. Здесь я предоставляю скрипт preprocessing.py для параметра кода. Входной параметр принимает входные файлы для задания обработки, а выходной параметр используется для определения выходных данных для задания. В параметре outputs вы можете указать destination вывода. В случаях, когда место назначения не указано, SageMaker записывает выходные данные в корзину SageMaker S3 по умолчанию для этого региона: 's3://‹имя-бакета-по умолчанию›/‹имя-задания›/output/‹имя-вывода›' .

from sagemaker.processing import ProcessingInput, ProcessingOutput

sklearn_processor.run(
    code="preprocessing.py",
    inputs=[
        ProcessingInput(
            source=input_data
            , destination="/opt/ml/processing/input"
            , s3_input_mode="File"
            , s3_data_distribution_type="FullyReplicated"
        )
    ],
    outputs=[
        ProcessingOutput(
            output_name="train_data"
            , source="/opt/ml/processing/train"
        ),
        ProcessingOutput(
            output_name="test_data"
            , source="/opt/ml/processing/test"
        ),
    ],
    arguments=["--train-test-split-ratio", "0.2"],
)

Log:

INFO:sagemaker:Creating processing-job with name sklearn-processor-nobyopc-2023-01-20-02-21-17-490
Job Name:  sklearn-processor-nobyopc-2023-01-20-02-21-17-490
Inputs:  [{'InputName': 'input-1', 'AppManaged': False, 'S3Input': {'S3Uri': 's3://sagemaker-us-west-2-xxxxxxxxxxx/datasets/census/full_data/census-income.csv', 'LocalPath': '/opt/ml/processing/input', 'S3DataType': 'S3Prefix', 'S3InputMode': 'File', 'S3DataDistributionType': 'FullyReplicated', 'S3CompressionType': 'None'}}, {'InputName': 'code', 'AppManaged': False, 'S3Input': {'S3Uri': 's3://sagemaker-us-west-2-xxxxxxxxxxxx/sklearn-processor-nobyopc-2023-01-20-02-21-17-490/input/code/preprocessing.py', 'LocalPath': '/opt/ml/processing/input/code', 'S3DataType': 'S3Prefix', 'S3InputMode': 'File', 'S3DataDistributionType': 'FullyReplicated', 'S3CompressionType': 'None'}}]
Outputs:  [{'OutputName': 'train_data', 'AppManaged': False, 'S3Output': {'S3Uri': 's3://sagemaker-us-west-2-xxxxxxxxxxx/sklearn-processor-nobyopc-2023-01-20-02-21-17-490/output/train_data', 'LocalPath': '/opt/ml/processing/train', 'S3UploadMode': 'EndOfJob'}}, {'OutputName': 'test_data', 'AppManaged': False, 'S3Output': {'S3Uri': 's3://sagemaker-us-west-2-xxxxxxxxxxx/sklearn-processor-nobyopc-2023-01-20-02-21-17-490/output/test_data', 'LocalPath': '/opt/ml/processing/test', 'S3UploadMode': 'EndOfJob'}}]
......................../miniconda3/lib/python3.7/site-packages/sklearn/externals/joblib/externals/cloudpickle/cloudpickle.py:47: DeprecationWarning: the imp module is deprecated in favour of importlib; see the module's documentation for alternative uses
  import imp
/miniconda3/lib/python3.7/site-packages/sklearn/utils/validation.py:37: DeprecationWarning: distutils Version classes are deprecated. Use packaging.version instead.
  LARGE_SPARSE_SUPPORTED = LooseVersion(scipy_version) >= '0.14.0'
Received arguments Namespace(train_test_split_ratio=0.2)
Reading input data from /opt/ml/processing/input/census-income.csv
Data after cleaning: (68285, 9), 11401 positive examples, 56884 negative examples
Splitting data into train and test sets with ratio 0.2
Running preprocessing and feature engineering transformations
Train data shape after preprocessing: (54628, 73)
Test data shape after preprocessing: (13657, 73)
Saving training features to /opt/ml/processing/train/train_features.csv
Saving test features to /opt/ml/processing/test/test_features.csv
Saving training labels to /opt/ml/processing/train/train_labels.csv
Saving test labels to /opt/ml/processing/test/test_labels.csv

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

preprocessing_job_description = sklearn_processor.jobs[-1].describe()
output_config = preprocessing_job_description["ProcessingOutputConfig"]
for output in output_config["Outputs"]:
    if output["OutputName"] == "train_data":
        preprocessed_training_data = output["S3Output"]["S3Uri"]
    if output["OutputName"] == "test_data":
        preprocessed_test_data = output["S3Output"]["S3Uri"]

На этом мы выполнили шаги, необходимые для обработки данных с помощью встроенного контейнера обработки Amazon SageMaker. Теперь давайте рассмотрим сценарий, в котором вы хотите использовать свой собственный контейнер обработки.

Если вам до сих пор нравилось читать этот пост в блоге, и он помог вам, вы можете угостить меня кофе, чтобы помочь мне написать больше и поделиться больше! :)

Принесите свой собственный контейнер для обработки

Здесь мы создадим собственный образ контейнера, который можно использовать для обработки данных в Amazon SageMaker. Используя контейнеры, вы можете обучать алгоритмы машинного обучения и быстро развертывать модели. В этом примере мы будем создавать контейнер Docker с помощью scikit-learn версии 1.2.0, которая в настоящее время недоступна в Amazon SageMaker.

Создайте каталог docker и добавьте файл Dockerfile в текущее местоположение, которое будет использоваться для создания контейнера обработки.

# Create a Docker directory 
!mkdir container
%%writefile container/Dockerfile
FROM python:3.8

RUN pip3 --no-cache-dir install pandas==1.5.2 scikit-learn==1.2.0

# Make sure python doesn't buffer stdout so we get logs ASAP.
ENV PYTHONUNBUFFERED=TRUE
ENTRYPOINT ["python3"]

Чтобы создать образ Docker из студии Amazon SageMaker, нам понадобится интерфейс командной строки Amazon SageMaker Studio Image Build. Он позволяет напрямую создавать образы Docker, совместимые с Amazon SageMaker, в средах Studio. Для этого необходимо установить пакет sagemaker-studio-image-build в среду своего ноутбука Studio. Далее можно прочитать здесь.

Давайте установим sagemaker-studio-image-build:

!pip install sagemaker-studio-image-build
Successfully built sagemaker-studio-image-build
Installing collected packages: botocore, sagemaker-studio-image-build
  Attempting uninstall: botocore
    Found existing installation: botocore 1.27.59
    Uninstalling botocore-1.27.59:
      Successfully uninstalled botocore-1.27.59
Successfully installed botocore-1.29.71 sagemaker-studio-image-build-0.6.0

После успешной установки теперь давайте используем sm-docker cli для сборки контейнера.

%%sh
cd container
sm-docker build . --repository sagemaker-studio-scikit-pandas:latest

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

%%writefile preprocessing_byopc.py
 
import argparse
import os
import warnings
 
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler, OneHotEncoder, LabelBinarizer, KBinsDiscretizer
from sklearn.compose import ColumnTransformer
 
from sklearn.exceptions import DataConversionWarning
 
warnings.filterwarnings(action="ignore", category=DataConversionWarning)
 
 
columns = [
    "age",
    "education",
    "major industry code",
    "class of worker",
    "num persons worked for employer",
    "capital gains",
    "capital losses",
    "dividends from stocks",
    "income",
]
class_labels = [" - 50000.", " 50000+."]
 
 
def print_shape(df):
    negative_examples, positive_examples = np.bincount(df["income"])
    print(
        "Data shape: {}, {} positive examples, {} negative examples".format(
            df.shape, positive_examples, negative_examples
        )
    )
 
 
if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--train-test-split-ratio", type=float, default=0.3)
    args, _ = parser.parse_known_args()
 
    print("Received arguments {}".format(args))
 
    input_data_path = os.path.join("/opt/ml/processing/input", "census-income.csv")
 
    print("Reading input data from {}".format(input_data_path))
    df = pd.read_csv(input_data_path)
    df = pd.DataFrame(data=df, columns=columns)
    df.dropna(inplace=True)
    df.drop_duplicates(inplace=True)
    df.replace(class_labels, [0, 1], inplace=True)
 
    negative_examples, positive_examples = np.bincount(df["income"])
    print(
        "Data after cleaning: {}, {} positive examples, {} negative examples".format(
            df.shape, positive_examples, negative_examples
        )
    )
 
    split_ratio = args.train_test_split_ratio
    print("Splitting data into train and test sets with ratio {}".format(split_ratio))
    X_train, X_test, y_train, y_test = train_test_split(
        df.drop("income", axis=1), df["income"], test_size=split_ratio, random_state=0
    )
 
    preprocess = ColumnTransformer(transformers=[
    ('tnf1', KBinsDiscretizer(encode="onehot-dense", n_bins=10), ["age", "num persons worked for employer"]),
    ('tnf2', StandardScaler(), ["capital gains", "capital losses", "dividends from stocks"]),
    ('tnf3', OneHotEncoder(sparse=False), ["education", "major industry code", "class of worker"])
], remainder='passthrough')
     
    print("Running preprocessing and feature engineering transformations")
    train_features = preprocess.fit_transform(X_train)
    test_features = preprocess.transform(X_test)
 
    print("Train data shape after preprocessing: {}".format(train_features.shape))
    print("Test data shape after preprocessing: {}".format(test_features.shape))
 
     
    train_features_output_path = os.path.join("/opt/ml/processing/train", "train_features.csv")
    train_labels_output_path = os.path.join("/opt/ml/processing/train", "train_labels.csv")
 
    test_features_output_path = os.path.join("/opt/ml/processing/test", "test_features.csv")
    test_labels_output_path = os.path.join("/opt/ml/processing/test", "test_labels.csv")
 
    print("Saving training features to {}".format(train_features_output_path))
    pd.DataFrame(train_features).to_csv(train_features_output_path, header=False, index=False)
 
    print("Saving test features to {}".format(test_features_output_path))
    pd.DataFrame(test_features).to_csv(test_features_output_path, header=False, index=False)
 
    print("Saving training labels to {}".format(train_labels_output_path))
    y_train.to_csv(train_labels_output_path, header=False, index=False)
 
    print("Saving test labels to {}".format(test_labels_output_path))
    y_test.to_csv(test_labels_output_path, header=False, index=False)

Для обработки данных с помощью собственного контейнера обработки необходимо использовать класс ScriptProcessor из Amazon SageMaker Python SDK. Задание обработки отвечает за обработку входных данных и сохранение полученных обработанных данных в Amazon S3. При настройке ScriptProcessor вам необходимо предоставить параметр image_uri с URI для созданного вами образа контейнера. Вам также необходимо предоставить ARN роли IAM, которая имеет доступ как минимум к целевому сегменту S3, instance_count и instance_type.

from sagemaker.processing import ScriptProcessor, ProcessingInput, ProcessingOutput
from sagemaker import get_execution_role

# docker image uri created earlier
image_uri = "xxxxxxxxxxxxx.dkr.ecr.us-west-2.amazonaws.com/sagemaker-studio-scikit-pandas:latest"

script_processor = ScriptProcessor(
    command=['python3']
    , image_uri=image_uri
    , role=role
    , instance_count=1
    , instance_type='ml.m5.xlarge'
    , base_job_name="sklearn-processor-byopc"
)

Теперь запустите скрипт предварительной обработки Python. input_data — это путь Amazon S3 к входным данным.

script_processor.run(
    code='preprocessing_byopc.py', 
    inputs=[
        ProcessingInput(
            source=input_data
            , destination='/opt/ml/processing/input'
            , s3_input_mode="File"
            , s3_data_distribution_type="FullyReplicated"
        )
    ], 
    outputs=[
        ProcessingOutput(
            output_name="train_data"
            ,source='/opt/ml/processing/train'
        ), 
        ProcessingOutput(
            output_name="test_data"
            , source='/opt/ml/processing/test')
        ]
    ,arguments=["--train-test-split-ratio", "0.2"],
)

После успешного завершения задания вы можете использовать следующий код, чтобы получить расположение выходного набора данных в Amazon S3. Вы также можете просмотреть артефакты из консоли AWS, перейдя в Amazon SageMaker › Processing › Processing Jobs › JobName.

preprocessing_job_description = script_processor.jobs[-1].describe()
output_config = preprocessing_job_description["ProcessingOutputConfig"]
for output in output_config["Outputs"]:
    if output["OutputName"] == "train_data":
        preprocessed_training_data = output["S3Output"]["S3Uri"]
    if output["OutputName"] == "test_data":
        preprocessed_test_data = output["S3Output"]["S3Uri"]

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

Заключение

В заключение в этом блоге мы рассмотрели различные способы обработки данных в Amazon SageMaker с помощью Amazon SageMaker Processing. С помощью Processing вы можете использовать упрощенный управляемый интерфейс SageMaker для выполнения рабочих нагрузок по обработке данных, таких как разработка функций, проверка данных, оценка модели и интерпретация модели. Первоначально мы выполняли этапы обработки данных вручную из блокнота Amazon SageMaker Studio Jupyter Notebook с помощью библиотеки sklearn, которая встроена в образ для обработки данных при настройке среды блокнота. Позже для обработки данных мы использовали процессор Amazon SageMaker SKLearn — встроенный контейнер, предоставленный Amazon SageMaker. Мы создали скрипт Python для предварительной обработки и использовали контейнер процессора SKLearn для обработки данных. Затем мы использовали концепцию «Принеси свой собственный контейнер» (BYOC) для обработки данных. Мы создали образ контейнера Docker с помощью интерфейса командной строки Amazon SageMaker Studio Image Build и использовали scikit-learn версии 1.2.0, которая в настоящее время недоступна во встроенных контейнерах обработки Amazon SageMaker. Затем мы использовали класс ScriptProcessor из Amazon SageMaker Python SDK для выполнения скрипта с нашим собственным контейнером для обработки данных.

Надеюсь, вы нашли этот блог полезным!

Рекомендации





Если вам понравилось читать это сообщение в блоге и оно помогло вам, вы можете угостить меня кофе, чтобы помочь мне написать больше и поделиться больше! :)

Высказанные точки зрения принадлежат мне, а не моему работодателю. Взгляды, мнения и комментарии, высказанные посетителями, принадлежат только им и могут не отражать мое мнение. Если вам понравилось читать эту статью, не стесняйтесь связаться со мной на LinkedIn. Если вы новичок в Medium, зарегистрируйтесь с помощью моего Реферала для участников.