Хосе Пачеко и Марио Кастро

Введение

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

В настоящее время высокопроизводительные вычисления сосредоточены в основном на массивно-параллельных проектах, в которых вычислительные ресурсы и ресурсы хранения распределяются в сети и обрабатываются одновременно. Переломным моментом в этих параллельных разработках стала разработка парадигмы программирования MapReduce.

MapReduce достиг высокого уровня параллелизма, разделив задачи на две независимые операции, которые можно было выполнять с данными:

  • Сопоставление, которое принимает ряд пар ключ/значение и создает меньшее количество пар ключ/значение.
  • Сокращение, которое берет выходные данные шага карты и выполняет операцию для каждого уникального ключа.

Такое разделение задач позволяет выполнять программы на нескольких процессорах и с разными источниками данных. Между отображением и уменьшением есть шаг «1,5», называемый шагом объединения. При этом результаты отображения объединяются, так что операция редукции учитывает все данные.

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

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

Машинному обучению часто приходится иметь дело с большими объемами данных, поэтому высокопроизводительные вычисления — важный инструмент, который необходимо иметь при работе над новыми проектами. Существует несколько библиотек, облегчающих работу с распределенными инфраструктурами.

В следующих разделах мы обсудим текущие стандартные отраслевые инструменты, которые имеют дело с этими концепциями.

Хадуп

Hadoop — это набор программных утилит, которые можно использовать для управления средами высокопроизводительных вычислений. Впервые он был выпущен в 2006 году и разработан на Java. Однако у него есть несколько API, позволяющих работать с разными языками программирования.

Эти программные утилиты работают через несколько демонов, которыми можно управлять с помощью общей команды интерфейса «hadoop». Эти утилиты разбиты на следующие компоненты:

Распределенная файловая система Hadoop

Этот компонент представляет собой распределенную, масштабируемую и переносимую файловую систему. Его цель — абстрагироваться от всех узлов, из которых может состоять сеть, и представить единый унифицированный интерфейс для данных.

Это позволяет приложениям, созданным на основе Hadoop, перестать беспокоиться о целостности и сохранности данных и сосредоточиться только на обработке.

Его внутренняя структура состоит из трех компонентов:

  • Namenode: это точка интерфейса между файловой системой и ее клиентами. Он управляет пространством имен, диспетчеризирует файловые операции и регулирует доступ к файлам.
  • Datanode: это сопоставление непосредственно с каждым сервером или узлом в сети. Они хранят данные, извлекают их и выполняют другие операции в соответствии с указаниями namenode.
  • Блок: так файлы данных представлены в HDFS. Размер по умолчанию — 64 МБ.

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

Вот несколько примеров команд HDFS и их назначения:

  • $ hadoop namenode -format : создает базовую файловую систему. Если данные уже были сохранены, они будут уничтожены.
  • $ hadoop fs -‹option›: fs используется для выполнения операций с файлами. Имеет несколько опций, напоминающих традиционные утилиты Linux: ls, mkdir, rm, cat, put

Hadoop YARN (еще один переговорщик ресурсов)

Как следует из названия, этот компонент отвечает за управление вычислительными ресурсами и планирование заданий на всех узлах кластера. Его основной задачей является средство отслеживания заданий, которое получает запросы на работу от всех клиентов и отправляет их средствам отслеживания задач в узлах. Внутри каждого узла этот Task Tracker отвечает за выполнение всех заданий, назначенных узлу, и сообщает об их статусе. Это отслеживание работы/задачи осуществляется с помощью следующих компонентов:

  • Мастер приложений: самый абстрактный уровень, он отслеживает каждое задание, отправленное в сеть.
  • Диспетчер ресурсов: отслеживает доступные ресурсы, планирует задания и управляет приложениями. В общем, трекер вакансий.
  • Диспетчер узла: обновляет диспетчер ресурсов статусом интересующего его узла, выполняет задания. В основном таск-трекер.

В исходной архитектуре Hadoop YARN был интегрирован в следующий компонент MapReduce. Разделение YARN на отдельные части позволило использовать Hadoop в различных приложениях, таких как Spark.

Приложениям конечного пользователя не нужно напрямую взаимодействовать с YARN. Скорее, YARN используется MapReduce, Spark и т. д. для доступа к ресурсам, управляемым Hadoop.

Hadoop MapReduce

Именно этот последний компонент позволяет приложениям конечных пользователей использовать возможности Hadoop. В различных областях он был вытеснен новыми парадигмами, такими как потоковая передача данных, но он по-прежнему играет важную роль в высокопроизводительных вычислениях.

Команда, используемая для отправки заданий с помощью MapReduce, называется «$ hadoop jar». Аргументами этой команды являются программы, используемые для операций отображения и сокращения, входные данные (адресованные внутри HDFS) и место для хранения выходных данных задания (также внутри HDFS).

Основным языком этого интерфейса для программ является Java, но он имеет несколько языковых плагинов, так что он также может принимать Python, Scala, C и целый ряд других языков.

Заключительные замечания по Hadoop

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

Hadoop не имеет прямого отношения к машинному обучению. Компоненты, которые мы увидим в следующих разделах, предоставляют более совершенные инструменты для разработки ИИ, в то же время используя преимущества лучших сред высокопроизводительных вычислений.

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

Искра

Spark — это среда кластерных вычислений для обработки в реальном времени. Он не имеет реальных компонентов управления кластером, а подключается к различным средам высокопроизводительных вычислений, таким как Hadoop, AWS, Azure и другим. В примере Spark делегирует задания YARN и HDFS при обработке данных в режиме реального времени.

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

Эта среда реального времени состоит из нескольких библиотек, каждая из которых имеет свою специализацию, и все они работают с общим ядром. Библиотеки, предоставляемые Spark, следующие:

  • Spark SQL: предоставляет инструменты для работы со структурированными данными.
  • Spark Streaming: предоставляет инструменты для выполнения преобразований пакетов данных.
  • MLlib: библиотека для выполнения алгоритмов и задач машинного обучения.
  • GraphX: распределенная графическая среда обработки

Искра общего ядра

Общее ядро ​​Spark реализует так называемые отказоустойчивые распределенные наборы данных (RDD). Эта структура данных находится в памяти и содержит данные, с которыми будут работать программы. Поскольку он находится в памяти, его можно обрабатывать намного быстрее, чем позволяют другие фреймворки.

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

Эти процессы можно разделить на две большие категории:

  • Итеративный: как и MapReduce, отдельные задания выполняются с данными до того, как они будут переданы другому процессу. Операции в памяти ускоряют работу такого рода.
  • Интерактивный: это позволяет обмениваться данными между процессами, работающими параллельно. Гораздо более гибкие, чем итерационные операции, они невозможны без средств обработки данных в памяти.

Преобразования и действия

Ядро Spark предоставляет набор инструментов для выполнения преобразований данных, хранящихся в RDD. Например:

  • dataset.map(func): применяет функцию к каждому элементу набора данных и возвращает результат.
  • dataset.flatMap(func): func может возвращать более одного элемента.
  • dataset.union(dataset): возвращает объединение двух наборов данных.

Действия отличаются от преобразований тем, что они возвращают отдельные значения. Например:

  • dataset.reduce(func): объединяет все элементы набора данных с помощью func
  • dataset.count(): возвращает количество элементов в наборе данных.
  • dataset.foreach(func): запускает функцию для каждого элемента набора данных. Ожидаются побочные эффекты.

Межпроцессного взаимодействия

Spark предоставляет два типа общих переменных для связи между процессами и обмена данными:

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

Наконец, ядро ​​Spark предоставляет средства для основных числовых операций.

Искра MLlib

Особый интерес для нас представляют способности Spark к машинному обучению, поэтому мы углубимся в эту тему.

Spark MLlib имеет API, очень похожий на более знакомые библиотеки, такие как scikit sklearn. Библиотека предоставляет возможности для извлечения функций, создания разделения тестирования/обучения, применения различных моделей к данным и т. д. Радикальная разница между ними заключается в реализации, где Spark может использовать среду HPC для ускорения вычислений.

Следя за демонстрацией в записной книжке, обратите внимание, как библиотека обрабатывает данные. Это отличается от Pandas DataFrames: данные хранятся в RDD, а алгоритмы берут имя столбца, в котором должны выполняться операции.

Заключительные заметки о Spark

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

H2O

H2O — это распределенная, быстрая и масштабируемая платформа машинного обучения и предиктивной аналитики с открытым исходным кодом, работающая в памяти, которая позволяет создавать модели машинного обучения на основе больших данных и обеспечивает простое производство этих моделей в корпоративной среде. Основной код H2O написан на Java. Внутри H2O хранилище распределенного ключа/значения используется для доступа и ссылки на данные, модели, объекты и т. д. на всех узлах и машинах. Данные считываются параллельно, распределяются по кластеру и хранятся в памяти в виде столбцов в сжатом виде.

Он имеет интерфейсы для R, Python, Scala, Java, JSON и блокнот/веб-интерфейс Flow и без проблем работает с технологиями больших данных, такими как Hadoop и Spark. Кроме того, REST API H2O позволяет получить доступ ко всем возможностям H2O из внешней программы или скрипта через JSON через HTTP.

H2O работает в существующей инфраструктуре больших данных, на «голом железе» или поверх существующих кластеров Hadoop или Spark. Он может принимать данные непосредственно из HDFS, Spark, S3, Azure Data Lake или любого другого источника данных в свое распределенное хранилище значений ключа в памяти.

Поддерживаемые облачные среды:

H2O поддерживается в ряде облачных сред, в том числе:

  • Инстансы EC2 и хранилище S3 (RedHat AMI, Amazon Linux AMI и Ubuntu AMI)
  • Амазон АВС
  • Microsoft Azure
  • Блоки данных
  • IBM DSX
  • Нимбикс Облако

Реализации алгоритма:

Алгоритмы реализованы поверх распределенной платформы H2O Map/Reduce и используют платформу Java Fork/Join для многопоточности.

H20 имеет следующие доступные алгоритмы:

  • Общий
  • квантили
  • Ранняя остановка
  • Под наблюдением
  • Пропорциональные опасности Кокса (CoxPH)
  • Глубокое обучение (нейронные сети)
  • Распределенный случайный лес (DRF)
  • Обобщенная линейная модель (GLM)
  • Машина повышения градиента (GBM)
  • Наивный байесовский классификатор
  • Составные ансамбли
  • Метод опорных векторов (SVM)
  • XGBoost
  • Без присмотра
  • Агрегатор
  • Обобщенные модели низкого ранга (GLRM)
  • Изоляция Лес
  • Кластеризация K-средних
  • Анализ главных компонентов (PCA)
  • Разное
  • Word2vec

Компоненты:

H2O из Python:

H20 можно установить как пакет Python с помощью модуля PIP.

Поток воды:

H2O Flow — это пользовательский интерфейс с открытым исходным кодом для H2O. Это интерактивная веб-среда, которая позволяет вам сочетать выполнение кода, текст, математику, графики и мультимедиа в одном документе.

Газированная вода H2O:

Sparkling Water позволяет пользователям сочетать быстрые масштабируемые алгоритмы машинного обучения H2O с возможностями Spark. С Sparkling Water пользователи могут управлять вычислениями из Scala/R/Python и использовать пользовательский интерфейс H2O Flow, предоставляя идеальную платформу машинного обучения для разработчиков приложений.