- PVSM.RU - https://www.pvsm.ru -
Параллельные или распределенные вычисления — вещь сама по себе весьма нетривиальная. И среда разработки должна поддерживать, и DS специалист должен обладать навыками проведения параллельных вычислений, да и задача должна быть приведена к разделяемому на части виду, если таковой существует. Но при грамотном подходе можно весьма ускорить решение задачи однопоточным R, если у вас под руками есть хотя бы многоядерный процессор (а он есть сейчас почти у всех), с поправкой на теоретическую границу ускорения, определяемую законом Амдала [1]. Однако, в ряде случаев даже его можно обойти.
Является продолжением предыдущих публикаций [2].
Как правило, когда аналитик (DS специалист, разрработчик или выберите себе любое подходящее название) пытается ускорить в рамках одного компьютера задачу и начинает двигаться от однопоточного режима к многопоточному, делает он это шаблонным образом. parApply, doreach%dopar%, etc. Компактно и доходчиво можно поглядеть, например, здесь: «Parallelism in R» [3]. 3 шага:
core-1поток, foreach, Для типичных вычислительных задач, занимающих 100% CPU и не требующих передачи большого объема входной информации, это правильный подход. Основной момент, требующий внимания — обеспечить логирование в рамках потоков, чтобы иметь возможность контроля процесса. Без логирования полет пойдет даже без приборов.
В случае «enterprise» задач при их распараллеливании возникает множество дополнительных методологических сложностей, значительно снижающих эффект от приведенного выше прямолинейного подхода:
Это совершенно типичный сценарий, когда в рамках процесса надо получить на вход объемное задание, прочитать данные с диска, забрать большой кусок из БД, поспрашивать внешние системы и дождаться от них ответа (классика — REST API запрос), а потом вернуть в родительский процесс N мегабайт в качестве результата.
Map-reduce по пользователям, локациям, документам, ip- адресам, датам, … (дополните сами). В самых печальных случаях параллельное исполнение может оказаться более длительным, чем однопоточное. Также могут наблюдаться проблемы с нехваткой памяти. Все пропало? Вовсе нет.
Рассмотрим тезисно способ радикального улучшения ситуации. При этом не забываем, что мы живем в рамках полного зоопарка. Продуктивный контур на *nix, DS ноутбуки на Win*nixMacOS, а надо, чтобы везде работало единообразно.
10^6.future [4] и универсального адаптера doFuture [5].doFuture позволяет в одну строчку перейти от разбиения по потокам к разбиению по отдельным процессам (можно в *nix в htop поглядеть параметры запуска).Результат — исходная задача выполняется в разы быстрее. Ускорение может быть даже больше числа доступных ядер.
Кода нет сознательно, поскольку основная задача публикации — поделиться подходом и отличным семейством пакетов future.
Есть еще несколько маленьких нюансов за которыми тоже надо проследить:
doFuture использует «магию» для автоматического определения состава передаваемых в процесс переменных и пакетов, но пускать все на самотек не стоит, лучше проверить.gc и явное удаление переменных с помощью rm не помешает.plan(sequential). Это закроет все процессы и освободит занимаемую ими память.Предыдущая публикация — «Бизнес-процессы в enterprise компаниях: домыслы и реальность. Проливаем свет с помощью R» [6].
Автор: Илья Шутов
Источник [7]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/data-mining/326018
Ссылки в тексте:
[1] законом Амдала: https://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%BA%D0%BE%D0%BD_%D0%90%D0%BC%D0%B4%D0%B0%D0%BB%D0%B0
[2] предыдущих публикаций: https://habrahabr.ru/users/i_shutov/posts/
[3] «Parallelism in R»: http://www.trutschnig.net/r_parallel.html
[4] future: https://github.com/HenrikBengtsson/future
[5] doFuture: https://github.com/HenrikBengtsson/doFuture
[6] «Бизнес-процессы в enterprise компаниях: домыслы и реальность. Проливаем свет с помощью R»: https://habr.com/ru/post/461463/
[7] Источник: https://habr.com/ru/post/462469/?utm_source=habrahabr&utm_medium=rss&utm_campaign=462469
Нажмите здесь для печати.