Более эффективный способ передачи данных в AWS Batch Transform Job

Вопрос или проблема

У меня есть процесс в Sagemaker для обучения и проведения инференса на данных в Sagemaker:

  1. Обработка задания: чтение входных CSV файлов из S3 и очистка данных, вывод CSV файлов в S3
  2. Обработка задания: чтение очищенных CSV данных из S3 и разделение данных на обучающие выборки, вывод CSV файлов в S3
  3. Обучающее задание: чтение файлов X_train, y_train, X_test, y_test из S3 и запуск обучения с использованием CatBoost или XGBoost, вывод обученных параметров в S3
  4. Задание пакетной трансформации (инференс): потоковое извлечение данных для инференса из S3 на HTTP сервер внутри контейнера Docker, используя ранее обученные параметры из S3 как модель, вывод оцененных данных в S3

Я хотел заменить тип файла с CSV на Parquet, но у меня есть проблема: задание пакетной трансформации не монтирует данные для инференса из S3 на контейнер и вместо этого заставляет вас использовать HTTP сервер для потоковой передачи данных из S3 в контейнер для обработки. Кроме того, максимальный размер полезной нагрузки, как я полагаю, установлен Sagemaker на 10 Мб. Мне удалось сделать это с CSV файлами, установив SplitType = Line. Я понимаю, что не могу использовать SplitType = Line с Parquet файлами.

Есть ли у кого-то метод, который работает для потоковой передачи больших объемов данных в задание пакетной трансформации, которое не использует CSV в качестве типа файла? Я хотел бы использовать Parquet файлы, но единственное решение, которое я могу придумать, это использовать другую обработку для разделения Parquet файлов на 10 Мб или меньше, чтобы задание пакетной трансформации могло работать, потоково передавая отдельный Parquet файл.

Мой предыдущий процесс использовал типы файлов CSV с Sagemaker SplitType = Line, поэтому мне не нужно было самостоятельно управлять размером CSV файлов. Прилагаю мой словарь конфигурации для задания пакетной трансформации, но я в основном ищу варианты, как я могу подойти к этой проблеме. Каковы альтернативы, поскольку опция CSV работает, но не идеальна, а опция Parquet не работает без разделения Parquet файлов на 10 Мб или меньше. Я просто предполагаю, что должен быть простой способ потоковой передачи данных из S3 в задание пакетной трансформации Sagemaker без необходимости вручную контролировать размеры файлов для Parquet и без необходимости использовать CSV файлы, которые вводят другие проблемы.

inference_job_config = {
    'TransformJobName': inference_job_name,
    'ModelName': self.model_name,
    'TransformInput': {
        'DataSource': {
            'S3DataSource': {
                'S3Uri': f's3://{self.s3_bucket}/{self.s3_preprocessed_inference}/',
                'S3DataType': 'S3Prefix'
            }
        },
        'ContentType': 'text/csv',
        'CompressionType': 'None',
        'SplitType': 'Line'
    },
    'TransformOutput': {
        'S3OutputPath': f's3://{self.s3_bucket}/{self.s3_inference_results}/',
        'AssembleWith': 'None'
    },
    'TransformResources': {
        'InstanceType': self.instance_type,
        'InstanceCount': 1
    },
    'DataProcessing': {
        'JoinSource': 'None'
    }
}

Я видел один пост здесь, который показывал, как можно принимать Parquet файлы на HTTP сервере в контейнере, выполняющем задание пакетной трансформации, но это все равно не решает проблему с размерами файлов, насколько я вижу. Если размеры файлов заранее обработаны так, чтобы быть 10 Мб или меньше, то это работает, и я могу это сделать, но я надеялся на что-то более простое, как вариант с CSV, но с типами файлов, которые лучше, чем CSV.

Ответ или решение

Оптимизация потоковой передачи данных в задачу преобразования AWS Batch

Ваша задача состоит в оптимизации процесса обработки и передачи данных в задачи AWS SageMaker Batch Transform с использованием файлов формата Parquet вместо CSV. Давайте рассмотрим основные трудности и пути их решения.

Проблема потока данных в формате Parquet

Ваша проблема заключается в следующем:

  1. Ограничения по размеру данных: SageMaker устанавливает максимальный размер полезной нагрузки для входных данных, который составляет 10 МБ.
  2. Отсутствие поддержки SplitType = Line для формата Parquet: В отличие от CSV, Parquet не поддерживает потоковую передачу данных по строкам, поэтому для обработки больших объемов данных этот формат требует иного подхода.

Оптимальные решения для потоковой передачи Parquet

1. Пакетная обработка Parquet с использованием дополнительных шагов

Хотя вы упомянули, что единственное решение заключается в разбивке Parquet-файлов на части размером менее 10 МБ, я рекомендую следующий подход, который также позволит сохранить целостность данных:

  • Создание предварительно обработанной паркетной версии: Вы можете создать дополнительный шаг предобработки, чтобы разбить большие Parquet-файлы на меньшие файлы размером до 10 МБ. Это можно автоматизировать с помощью Python и библиотеки pyarrow или pandas.
import pandas as pd
import pyarrow as pa
import pyarrow.parquet as pq

def split_parquet_file(input_file, max_size_mb=10):
    table = pq.read_table(input_file)
    total_rows = table.num_rows
    total_size = table.nbytes
    num_splits = total_size // (max_size_mb * 1024 * 1024) + 1

    for i in range(num_splits):
        start_row = i * (total_rows // num_splits)
        end_row = (i + 1) * (total_rows // num_splits) if i != num_splits - 1 else total_rows
        split_table = table.slice(start_row, end_row)
        pq.write_table(split_table, f's3://{your_bucket}/split_file_{i}.parquet')

split_parquet_file('s3://path_to_your_parquet_file.parquet')

Этот скрипт разделит ваш файл Parquet на более мелкие части, которые затем могут быть использованы в Batch Transform.

2. Использование сторонних сервисов для предварительной обработки данных

Вы можете рассмотреть возможность использования AWS Glue для предобработки больших Parquet-файлов. Glue позволяет масштабируемо обрабатывать большие наборы данных, и его возможности преобразования в рамках ETL позволят вам надлежащим образом разбить данные перед загрузкой в SageMaker.

3. Использование пользовательских контейнеров в SageMaker

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

Заключение

К сожалению, SageMaker Batch Transform имеет определенные ограничения, которые необходимо учитывать при работе с Parquet-файлами. Однако предлагаемые решения — предобработка с использованием Python или AWS Glue, а также создание пользовательских контейнеров — позволяют эффективно организовать поток данных.

Максимально эффективное использование Parquet вместо CSV действительно стоит предпринятых усилий, учитывая преимущества формата, такие как сжатие и производительность чтения. Путем внедрения одного из предложенных методов вы сможете создать более надежный и масштабируемый процесс работы с данными в AWS SageMaker, соответствующий вашим бизнес-целям.

Ключевые слова: AWS SageMaker, Batch Transform, Parquet, потоковая передача данных, предобработка, производительность данных.

Оцените материал
Добавить комментарий

Капча загружается...