H2O не работает параллельно

Я создал DF и хочу преобразовать его в кадр H2O.

Для этого я делаю:

library(h2o)
h2o.init(nthreads=-1)
df<-data.table(matrix(0,ncol=46,nrow=30000))
df<-as.h2o(df)

Когда я делаю htop в командной строке, я вижу, что работает только один процессор из 4 доступных. Не возможно сделать по-другому?

Спасибо!

1 ответ

Здесь работают два фактора.

1) во-первых, вы используете as.h2o(), который является не очень эффективным методом "push" (когда клиент отправляет данные на сервер) приема данных.

Это предназначено для небольших данных и для удобства (что хорошо для этого случая, потому что вы создали набор данных с 30000 строк, который является маленькими данными).

Если вы хотите, чтобы H2O эффективно загружал данные, вам нужно использовать метод "pull", при котором H2O извлекает данные из хранилища данных в память H2O. В R это будет h2o.importFile(),

2) Вторым фактором является то, что H2O использует фрагментирование данных (смежные строки в наборе данных) для получения параллелизма данных. Количество чанков на столбец напрямую влияет на количество потоков, которые работают параллельно. После считывания набора данных, если он содержит только 1 блок на столбец, он сможет использовать только 1 поток (и, следовательно, 1 ядро). Вы можете увидеть количество блоков в столбце, посмотрев, как данные были проанализированы в веб-интерфейсе Flow H2O.

Я запустил вашу программу выше; Посмотрите, как Сводка распределения кадров для результирующего кадра H2O показывает, что количество порций в столбце равно 1:

Сводка распределения кадров для 30 000 строк

Повторное выполнение той же программы с 3 000 000 строк дает 66 блоков на столбец:

Сводка распределения кадров для 3 000 000 строк

Это намного лучше, потому что теперь, когда вы попытаетесь поработать с данными в H2O (например, обучить модель), вы получите до 66 потоков, работающих параллельно в распределенном кластере.

[Обратите внимание на более крупный случай, сам прием данных занял несколько минут на моем ноутбуке и все еще был медленным и однопоточным, потому что он использует неэффективный as.h2o() "толчок" подход. Если вы записали набор данных в файл CSV, и H2O проанализировала его с h2o.importFile() "тянуть" подход, это было бы намного быстрее. ]

Другие вопросы по тегам