Однако одна операция обычно не может максимально использовать вычислительные ресурсы кластеров. Данные должны распределяться по кластеру, а многие операции требуют последовательного выполнения задач, которые, даже если они реализованы распределенным образом, следуют друг за другом и требуют обмена данными. Эти и многие другие более мелкие факторы, если их суммировать, могут привести к значительным накладным расходам.
Одной из областей интересов является процесс обучения модели машинного обучения. Алгоритм машинного обучения строит модель значительно дольше. И в зависимости от самого алгоритма, есть недостатки, которые можно найти. Поэтому введение параллелизма в обучение модели может улучшить использование ресурсов кластера, в основном процессоров и / или графических процессоров.
Вы также можете прочитать:
Машинное обучение с H2O — практическое руководство для ученых-данных
Одной из областей, где строится множество моделей, является поиск по сетке . Grid Search «проходит» через пространство гиперпараметров и строит соответствующие модели. Стратегия ходьбы может отличаться, но все они имеют одну и ту же проблему — нужно построить много моделей. Как правило, процесс сборки ограничен временем. И чем больше моделей построено, тем лучше.
До сих пор H2O, как и другие платформы машинного обучения, обучала одну модель за раз. Начиная с версии H2O 3.28.0.1
, мы предоставили нашим пользователям способ построения моделей с использованием параллельного поиска по сетке. Это фактически означает, что n > 1
в кластере могут обучаться модели. В то время как одна модель ожидает или выполняет менее оптимизируемые вычисления, другие модели могут использовать ресурсы кластера. Это приводит к большему количеству моделей, построенных за меньшее время .
Как использовать параллельный поиск по сетке
По умолчанию параллельное построение модели для поиска по сетке отключено. Это может измениться в ближайшем будущем. Мы ввели новый параметр, названный parallelism
для поиска по сетке. Такой параметр, доступный в Flow, Python и R, установлен parallelism = 1
по умолчанию. Это означает, что модели строятся последовательно при выполнении поиска по сетке. Чтобы строить модели параллельно, используя поиск по сетке, у пользователей есть два варианта:
- Установите
parallelism = n
гдеn > 1
, - Set
parallelism = 0
.
Установка parallelism
аргумента на любое число, большее, чем 1
предписывает H2O сохранять ровно столько моделей, которые строятся одновременно, до тех пор, пока не будут достигнуты другие ограничения (время, максимальное количество моделей и т. Д.). Тем не менее, если задать для него значение 0
H2O, можно свободно использовать внутреннюю эвристику, чтобы определить наилучшее количество моделей для обучения за один раз. Мы называем это адаптивным режимом .
В настоящее время адаптивный режим не имеет строгого контракта, и внутренняя эвристика может измениться. Адаптивный режим предполагает, что весь кластер состоит из машин с равными доступными ресурсами и просто обучает вдвое больше моделей, чем число процессоров, доступных на узел. Учитывая кластер n
узлов, где каждый узел имеет c
количество процессоров, количество моделей будет 2 * c
. Количество узлов или общее количество доступных процессоров не играет никакой роли.
питон
Параллельный поиск Сетки может быть включен путем простого добавления parallelism = n
в H2OGridSearch
аргументы конструктора, где n = 0
для адаптивного режима или n > 1
для точного контроля параллельности. Указание n = 1
означает секвенциальный режим.
Джава
xxxxxxxxxx
1
data = h2o.import_file(path="https://0xdata-public.s3.amazonaws.com/parallel-gs-benchmark/airlines_small.csv")
2
hyper_parameters = OrderedDict()
3
hyper_parameters["ntrees"] = [1, 5, 50, 100]
4
hyper_parameters["max_depth"] = [5, 10, 15]
5
6
grid = H2OGridSearch(H2OGradientBoostingEstimator, hyper_params=hyper_parameters, parallelism=16) # parallelism = 16 means 16 models are built at a time
7
grid.train(x=list(range(4)), y=4, training_frame=data)
р
Параллельный поиск по сетке можно включить, просто добавив parallelism = n
к h2o.grid
аргументам функции, где n = 0
для адаптивного режима или n > 1
для точного управления параллелизмом. Указание n = 1
означает секвенциальный режим.
Джава
xxxxxxxxxx
1
data <- h2o.importFile(path = "https://0xdata-public.s3.amazonaws.com/parallel-gs-benchmark/airlines_small.csv")
2
3
hyper_parameters = list(ntrees = c(1, 5, 50, 100), learn_rate = c(5, 10, 15))
4
grid <- h2o.grid("gbm", grid_id="gbm_grid_test",
5
x=1:4, y=5,
6
training_frame=data,
7
hyper_params = hyper_parameters,
8
parallelism = 16) # parallelism = 16 means 16 models are built at a time
эталонный тест
На GitHub доступен бенчмарк поиска параллельной сетки H2O . Он содержит описание эксперимента, а также сценарий для воспроизводимости.
Ограничения и заключительные мысли
Создание большого количества моделей в памяти происходит за счет затрат памяти. Каждый алгоритм машинного обучения требует определенного объема оперативной памяти для работы. Построение нескольких моделей подразумевает линейный или почти линейный рост потребления памяти. По нашим наблюдениям, в том числе в тестах , обучение нескольких моделей за один раз почти всегда дает значительный прирост производительности. Это определенно не медленнее.
Чем меньше (относительно ресурсов кластера) моделей и чем быстрее создаются модели, тем эффективнее поиск в параллельных сетках. Для сверхтяжелых моделей (опять же, это относится к ресурсам кластера), где даже обучение по одной модели за раз едва умещается в памяти, использование по умолчанию parallelism = 1
может быть единственным способом обучения модели. Во всех других случаях использование параллельного поиска по сетке дает потенциально значительное преимущество.
Даже использование по крайней мере parallelism = 2
может принести значительные ускорения. Память это ограничение. Однако слишком большое количество моделей может привести к большим издержкам переключения контекста, что также нежелательно. Текущее правило для адаптивного режима, которое порождается 2 * number of leader node's CPUs
, эмпирически установлено для большого пространства гиперпараметров, где фаза обучения модели является относительно короткой. Ожидается, что пользователи будут экспериментировать с этим номером. Одним из запланированных улучшений является создание надежного адаптивного режима, который может на лету управлять / адаптироваться к ресурсам кластера. Будьте на связи!
Следующие люди также были вовлечены в параллельный поиск по сетке и заслуживают доверия: Михал Кёрка , Ян Штерба , Себастьян Пуарье . H 2 O.ai является открытым исходным кодом и может быть найден на GitHub .
Дальнейшее чтение
Обнаружение аномалий в лесах изоляции с использованием H2O
Построение модели GBM в H2O с помощью сетки поиска и гиперпараметров в Scala