Ускорьте обучение модели глубокого обучения на 35% с помощью интеллектуального просеивания Amazon SageMaker

Увеличьте скорость обучения модели глубокого обучения на 35% с помощью интеллектуального отбора Amazon SageMaker

В быстро меняющемся мире искусственного интеллекта модели глубокого обучения оказались в центре инноваций, найдя применение в компьютерном зрении (CV), обработке естественного языка (NLP) и рекомендательных системах. Однако растущая стоимость обучения и настройки этих моделей ставит перед предприятиями серьезную проблему. Эта стоимость в основном обусловлена большим объемом данных, используемых при обучении моделей глубокого обучения. Сегодня большие модели часто обучаются на терабайтах данных и могут занимать недели для обучения, даже с мощными GPU или оборудованием на основе AWS Trainium. Обычно клиенты полагаются на техники и оптимизации, которые улучшают эффективность процесса обучения модели, такие как оптимизированные ядра или слои, тренировка смешанной точности или функционалы, такие как библиотеки распределенного обучения Amazon SageMaker. Однако сегодня меньше акцентируется внимание на эффективности самих обучающих данных. Не все данные одинаково вносят вклад в процесс обучения модели: значительная часть вычислительных ресурсов может быть потрачена на обработку простых примеров, которые не оказывают существенного влияния на общую точность модели.

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

Как еще можно преодолеть эту неэффективность, связанную с низкоинформативными образцами данных в процессе обучения модели?

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

В этой статье мы рассмотрим следующие темы:

  • Новая возможность умного отсева в SageMaker и как она работает
  • Как использовать умный отсев с рабочими нагрузками обучения PyTorch

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

Как работает умный отсев в SageMaker

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

Задача умного отсева состоит в том, чтобы просеивать ваши обучающие данные во время процесса обучения и передавать только наиболее информативные образцы модели. Во время обычного обучения с использованием PyTorch данные итеративно отправляются пакетами в цикл обучения и устройства-ускорители (например, GPU или чипы Trainium) с помощью PyTorch DataLoader. Умный отсев реализуется на этапе загрузки данных и, следовательно, независим от предварительной обработки данных в вашей тренировочной конвейере.

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

Важным параметром для умного отсева является доля исключаемых данных: например, установка доли на 33% (beta_value=0.5) означает, что образцы с примерно нижней третью потери каждого пакета будут исключены из обучения. Когда достаточное количество образцов с высокой потерей было определено для завершения пакета, данные отправляются через полный цикл обучения, и модель обучается и тренируется нормально. Вам не нужно делать никаких изменений в вашем цикле обучения, когда умный отсев включен.

Следующая диаграмма иллюстрирует этот рабочий процесс.

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

В таблице столбец % Accepted показывает долю данных, которая включена и используется в цикле обучения. Повышение этого настраиваемого параметра снижает стоимость (как показано в столбце IMR Savings %), но также может повлиять на точность. Правильная настройка % Accepted является функцией вашего набора данных и модели; вы должны экспериментировать и настраивать этот параметр, чтобы достичь наилучшего сочетания снижения затрат и влияния на точность.

Обзор решения

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

Предварительные условия

Мы предполагаем, что вы уже знаете, как обучить модель с использованием PyTorch или PyTorch Lightning с использованием SageMaker Python SDK и класса Estimator с использованием SageMaker Deep Learning Containers для тренировки. Если нет, обратитесь к Использование SageMaker Python SDK, прежде чем продолжить.

Начало работы с умным просеиванием SageMaker

В типичном задании обучения PyTorch вы инициализируете тренировочный DataLoader PyTorch DataLoader с вашим набором данных и другими необходимыми параметрами, который предоставляет партии ввода в процессе обучения. Чтобы включить умное просеивание в ваши тренировочные данные, вы будете использовать новый класс DataLoader: smart_sifting.dataloader.sift_dataloader.SiftingDataloader. Этот класс используется в качестве обертки над вашим существующим PyTorch DataLoader, и вместо этого процесса обучения будет использоваться SiftingDataloader для получения входных партий. SiftingDataLoader получает входную партию из вашего исходного PyTorch DataLoader, оценивает важность выборок в партии и создает просеянную партию с выборками с высокой потерей, которые затем передаются на шаг обучения. Оболочка выглядит следующим образом:

from smart_sifting.dataloader.sift_dataloader import SiftingDataloadertrain_dataloader = SiftingDataloader(    sift_config = sift_config,    orig_dataloader=DataLoader(self.train, self.batch_size, shuffle=True),    loss_impl=BertLoss(),    model=self.model)

Чтобы SiftingDataloader мог проанализировать ваши тренировочные данные, необходимы некоторые дополнительные параметры, которые вы можете указать с помощью параметра sift_config. Сначала создайте объект smart_sifting.sift_config.sift_configs.RelativeProbabilisticSiftConfig. Этот объект содержит настраиваемые и обязательные параметры beta_value и loss_history_length, которые определяют соответственно долю выборок для сохранения и окно выборок для включения при оценке относительной потери. Обратите внимание, что, поскольку умное просеивание использует вашу модель для определения важности выборки, могут возникнуть отрицательные последствия, если мы используем модель с полностью случайными весами. Вместо этого вы можете использовать loss_based_sift_config и sift_delay, чтобы задержать процесс просеивания, пока веса параметров в модели обновятся за пределами случайных значений. (Дополнительные сведения см. в Применение умного просеивания к вашему скрипту обучения.) В следующем коде мы определяем sift_config и указываем beta_value и loss_history_length, а также задержку начала просеивания с помощью loss_based_sift_config:

из smart_sifting.sift_config.sift_configs импортировать RelativeProbabilisticSiftConfig, LossConfig, SiftingBaseConfigsift_config = RelativeProbabilisticSiftConfig(    beta_value=3,    loss_history_length=500,    loss_based_sift_config=LossConfig(         sift_config=SiftingBaseConfig(sift_delay=10)    ))

Далее, в SiftingDataloader объекте вам также необходимо включить параметр loss_impl. Умный отсев работает на индивидуальном уровне выборки, и важно иметь доступ к методу расчета потерь, чтобы определить важность выборки. Вы должны реализовать метод расчета потерь, который возвращает тензор nx1, который содержит значения потерь n выборок. Обычно вы указываете тот же метод потерь, используемый вашей моделью во время обучения. Наконец, включите указатель на вашу модель в объект SiftingDataloader, который используется для оценки выборок перед включением их в обучение. Смотрите следующий код:

из smart_sifting.sift_config.sift_configs импортировать RelativeProbabilisticSiftConfig, LossConfig, SiftingBaseConfig## Определение метода отсевалок утратclass SiftBertLoss(Loss):    # Вам следует добавить следующую функцию инициализации    # для расчета потерь на выборку, а не на пакет.    def __init__(self):        self.celoss = torch.nn.CrossEntropyLoss(reduction='none')    def loss(            self,            model: torch.nn.Module,            transformed_batch: SiftingBatch,            original_batch: Any = None,    ) -> torch.Tensor:            device = next(model.parameters()).device        batch = [t.to(device) for t in original_batch]        # вычисляем потери        outputs = model(batch)        return self.celoss(outputs.logits, batch[2])........train_dataloader =  SiftingDataloader(    sift_config = sift_config,    orig_dataloader=DataLoader(self.train, self.batch_size, shuffle=True),    loss_impl=SiftBertLoss(),    model=self.model)

Следующий код показывает полный пример включения умного отсева в существующую задачу обучения BERT:

from smart_sifting.dataloader.sift_dataloader import SiftingDataloaderfrom smart_sifting.loss.abstract_sift_loss_module import Lossfrom smart_sifting.sift_config.sift_configs import RelativeProbabilisticSiftConfig, LossConfig, SiftingBaseConfig.........## Определение метода отсева SiftBertLoss(Loss):    # Вам следует добавить следующую функцию инициализации    # для расчета потерь на выборку, а не на пакет.    def __init__(self):        self.celoss = torch.nn.CrossEntropyLoss(reduction='none')    def loss(            self,            model: torch.nn.Module,            transformed_batch: SiftingBatch,            original_batch: Any = None,    ) -> torch.Tensor:            device = next(model.parameters()).device        batch = [t.to(device) for t in original_batch]        # вычисляем потери        outputs = model(batch)        return self.celoss(outputs.logits, batch[2])              .... .... ....  sift_config = RelativeProbabilisticSiftConfig(    beta_value=3,    loss_history_length=500,    loss_based_sift_config=LossConfig(        sift_config=SiftingBaseConfig(sift_delay=10)    ))train_dataloader =  SiftingDataloader(    sift_config = sift_config,    orig_dataloader=DataLoader(self.train, self.batch_size, shuffle=True),    loss_impl=SiftBertLoss(),    model=self.model)......# использование train_dataloader в остальной части логики обучения.

Заключение

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

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