Параллельное распределенное обучение SageMaker
По мере того, как машинное обучение продолжает развиваться, мы видим более крупные модели со все большим количеством параметров. В то же время мы также видим невероятно большие наборы данных, в конце концов, любая модель хороша настолько, насколько хороши данные, на которых она обучена. Работа с большими моделями и наборами данных может быть дорогостоящей в вычислительном отношении и сложной для своевременного выполнения итераций или экспериментов. В этой статье мы сосредоточимся на части проблемы, связанной с большим набором данных. В частности, мы рассмотрим нечто, известное как параллельное распределение данных, с использованием Amazon SageMaker для оптимизации и сокращения времени обучения на большом реальном наборе данных.
В сегодняшнем примере мы обучим алгоритм SageMaker XGBoost на искусственно сгенерированном наборе данных объемом 1 ТБ. В этом примере мы получим более глубокое понимание того, как подготовить и структурировать источник данных для более быстрого обучения, а также понять, как начать распределенное обучение с помощью встроенной в SageMaker Библиотеки параллелизма данных.
ПРИМЕЧАНИЕ. В этой статье предполагается базовое знание специальных подфункций AWS и SageMaker, таких как SageMaker Training и взаимодействие с SageMaker и AWS в целом с помощью SageMaker Python SDK и Boto3 AWS Python SDK. Для правильного введения и обзора SageMaker Training я бы сослался на эту статью.
Что такое распределенные данные параллельно? Зачем нам это нужно?
Прежде чем мы сможем приступить к реализации, важно понять принцип обучения распределенным данным. С большими наборами данных действительно сложно оптимизировать время обучения, так как это требует больших вычислительных ресурсов. Вы должны учитывать как возможность загрузки набора данных в память, так и любое обучение и вычисления гиперпараметров, которые должна будет выполнять машина. На одной машине это возможно (при достаточной вычислительной мощности), но также неэффективно с точки зрения времени, и экспериментирование становится кошмаром.
С помощью Distributed Data Parallel вы можете работать с кластером экземпляров. Каждый из этих экземпляров может содержать несколько ЦП/ГП. Создание этой конфигурации распределенных параллельных данных с нуля может быть сложной задачей, и существует много накладных расходов, связанных с обменом данными между узлами, которые необходимо решить. Для упрощения мы можем использовать встроенную в SageMaker Параллельную библиотеку распределенных данных. Здесь абстрагируется тяжелая работа по построению и оптимизации связи между узлами, и вы можете сосредоточиться на разработке модели.
Почему источник данных важен для SageMaker?
Где и как предоставляются наши данные, важно для оптимизации времени обучения. С SageMaker де-факто службой хранения всегда была S3, и это все еще вариант. Существует обычный режим обучения, в котором вы можете загрузить свой набор данных непосредственно в S3, он называется Файловый режим. Здесь SageMaker загружает ваш набор данных в память экземпляра перед началом обучения. В сегодняшнем примере мы будем работать с оптимизированным режимом S3, известным как Fast File Mode. В режиме Fast File набор данных передается в экземпляр в режиме реального времени, поэтому мы можем избежать накладных расходов на загрузку всего набора данных. Это также приводит к вопросу, как я должен предоставить/разделить свой набор данных? В этом примере мы разделим наш набор данных на несколько файлов меньшего размера, которые в сумме составляют до 1 ТБ, это еще раз поможет с загрузкой или, в нашем случае, со временем потоковой передачи, а масштаб нашего набора данных довольно велик.
Вне S3 также есть варианты работы с Elastic File System (EFS) и FsX Lustre в SageMaker. Если ваши тренировочные данные уже находятся в EFS, их легко подключить к SageMaker. С FsX Luster вы можете масштабироваться с большей скоростью по сравнению с другими вариантами, но при настройке VPC для этого варианта возникают операционные издержки.
В конце концов, есть множество факторов, которые следует учитывать при выборе между различными вариантами обучения для источника данных с помощью SageMaker. Два основных момента, которые следует учитывать, — это размер набора данных и то, как вы можете разделить набор данных. Эти факторы в сочетании с текущим местоположением вашего набора данных помогут вам сделать правильный выбор для оптимизации времени обучения. Более подробное руководство см. в этой статье об источниках данных с SageMaker Training.
Создание набора данных
В этом примере мы будем использовать набор данных Abalone и запустим на нем алгоритм SageMaker XGBoost для регрессионной модели. Вы можете загрузить набор данных из общедоступных наборов данных Amazon.
#retreive data aws s3 cp s3://sagemaker-sample-files/datasets/tabular/uci_abalone/train_csv/abalone_dataset1_train.csv .
Сам этот набор данных имеет размер всего 100 КБ, поэтому нам нужно сделать множество его копий, чтобы создать набор данных объемом 1 ТБ. Для подготовки этого набора данных я использовал экземпляр EC2 (r6a.48xlarge) для разработки. Это экземпляр с большим объемом памяти и вычислений, который позволит быстро подготовить наш набор данных. После настройки мы запускаем следующий скрипт, чтобы превратить наш набор данных в файл размером 100 МБ. Вы можете соединить свои фактические данные по мере необходимости, это не заданный рецепт/размер, которому необходимо следовать.
import os import pandas as pd import sys #~110KB initial file df = pd.read_csv("abalone_dataset1_train.csv") print(sys.getsizeof(df)) #creates a 104MB file df_larger = pd.concat([df]*700, ignore_index=True) print(sys.getsizeof(df_larger)) df_larger.to_csv("abalone-100mb.csv")
С набором данных размером 100 МБ мы можем сделать 10 000 копий, чтобы создать наш набор данных объемом 1 ТБ. Затем мы загружаем эти 10 000 копий в S3, который является нашим источником данных для режима FastFile.
%%sh #replace with your S3 bucket to upload to s3_bucket='sagemaker-us-east-1-474422712127' for i in {0..10000} do aws s3 cp abalone-100mb.csv s3://$s3_bucket/xgboost-1TB/abalone-$i.csv done
Этот скрипт должен выполняться около 2 часов, но если вы хотите ускорить операцию, вы можете использовать некоторую форму многопроцессорного кода Python с Boto3, чтобы ускорить время загрузки.
Настройка обучения
Прежде чем мы сможем приступить к запуску обучающего задания SageMaker, нам необходимо настроить правильные клиенты и конфигурацию. Здесь мы конкретно определяем наш тип учебного экземпляра, вы можете найти обширный список параметров на следующей странице. Что касается выбора типа экземпляра, вы хотите учитывать тип модели, с которой вы имеете дело, и домен, в котором вы находитесь. В случаях использования NLP и Computer Vision, как правило, экземпляры GPU лучше подходят, в этом случае мы используйте оптимизированный для памяти экземпляр с нашим алгоритмом XGBoost.
import boto3 import sagemaker from sagemaker.estimator import Estimator boto_session = boto3.session.Session() region = boto_session.region_name sagemaker_session = sagemaker.Session() base_job_prefix = 'xgboost-example' role = sagemaker.get_execution_role() default_bucket = sagemaker_session.default_bucket() s3_prefix = base_job_prefix training_instance_type = 'ml.m5.24xlarge'
Затем мы подготавливаем наш TrainingInput, здесь мы указываем, что используем режим FastFile, в противном случае по умолчанию используется режим File. Мы также указываем дистрибутив как «ShardedByS3Key», это указывает на то, что мы хотим распространять все наши разные файлы S3 по всем экземплярам. В противном случае все файлы данных будут загружаться в каждый отдельный экземпляр, что приведет к значительному увеличению времени обучения.
from sagemaker.inputs import TrainingInput #replace with your S3 Bucket with data training_path = 's3://sagemaker-us-east-1-474422712127/xgboost-1TB/' #set distribution to ShardedByS3Key otherwise a copy of all files will be made across all instances #we also enable FastFile mode here where as the default is File mode train_input = TrainingInput(training_path, content_type="text/csv", input_mode='FastFile', distribution = "ShardedByS3Key") training_path
Затем мы готовим наш оценщик XGBoost, чтобы получить более глубокое понимание алгоритма и его доступных гиперпараметров, пожалуйста, обратитесь к этой статье. Другим ключом здесь является то, что мы указываем количество экземпляров равным 25 (обратите внимание, что вам может потребоваться запросить здесь увеличение лимита в зависимости от экземпляра). Наши 10 000 файлов данных будут распределены по этим экземплярам размером 25 мл.m5.24xlarge. Как только мы указываем число больше единицы, SageMaker делает вывод о распределенных параллельных данных для нашей модели.
model_path = f's3://{default_bucket}/{s3_prefix}/xgb_model' image_uri = sagemaker.image_uris.retrieve( framework="xgboost", region=region, version="1.0-1", py_version="py3", instance_type=training_instance_type, ) xgb_train = Estimator( image_uri=image_uri, instance_type=training_instance_type, instance_count=25, output_path=model_path, sagemaker_session=sagemaker_session, role=role, ) xgb_train.set_hyperparameters( objective="reg:linear", num_round=50, max_depth=5, eta=0.2, gamma=4, min_child_weight=6, subsample=0.7, silent=0, ) training_instance_type
Затем мы можем начать тренировочную работу, подгоняя алгоритм к входным данным обучения.
xgb_train.fit({'train': train_input})
С нашими текущими настройками эта учебная работа занимает примерно 11 часов.
Как мы можем оптимизировать дальше?
Мы можем настроить это время обучения несколькими способами. Один из вариантов — просто горизонтальное масштабирование за счет увеличения количества экземпляров. Другим вариантом является использование экземпляров графического процессора, что может потребовать меньшего количества экземпляров, но это не всегда прямая наука.
Помимо настройки оборудования для обучения, мы можем вернуться к формату источника данных, о котором мы говорили. Вы можете оценить FsX Luster, который может масштабироваться до 100 ГБ/с пропускной способности. Другой вариант — сегментировать набор данных в другом формате, чтобы попробовать различные комбинации количества файлов и их размера.
Цены
Для SageMaker Training Jobs вы можете оценить стоимость на следующей странице. По сути, задания по обучению оплачиваются по часам и типу экземпляра. С ml.m5.24xlarge это составляет 5,53 доллара в час. С 25 экземплярами и временем выполнения 11 часов это задание по обучению обойдется примерно в 1500 долларов США, поэтому имейте это в виду, если будете запускать этот пример. Опять же, вы можете дополнительно настроить это, протестировав разные экземпляры на меньших подмножествах данных, чтобы оценить приблизительное время обучения перед обучением на всем корпусе.
Кредиты/дополнительные ресурсы
- https://aws.amazon.com/blogs/machine-learning/choose-the-best-data-source-for-your-amazon-sagemaker-training-job/
- https://docs.aws.amazon.com/sagemaker/latest/dg/distributed-training.html
Заключение
Вы можете найти весь код для примера выше. SageMaker Distributed Training предлагает возможность масштабного обучения. Я также рекомендую вам изучить Model Parallel, поскольку название указывает на то, что он рассматривает параллелизм моделей в нескольких экземплярах. Я надеюсь, что эта статья была полезным введением в SageMaker Training и его распределенные возможности. Не стесняйтесь задавать любые вопросы.
Если вам понравилась эта статья, не стесняйтесь связаться со мной в LinkedIn и подписаться на мою Информационную рассылку. Если вы новичок в Medium, зарегистрируйтесь с помощью моего Реферала для участников.