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

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

Разница между параллельной обработкой и распределенными вычислениями

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

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

Параллельная обработка для обучения систем машинного обучения

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

Добавление двух матриц одинакового размера

Допустим, у нас есть две матрицы, A и B, одинакового размера (M * N), то есть имеющие M строк и N столбцов. Мы хотим создать третью матрицу C, которая является суммой A и B.

Таким образом, используя параллельные вычисления, первая строка A может быть добавлена ​​к первой строке B с использованием одного ядра системы, и аналогичным образом другие строки могут быть добавлены к соответствующим строкам B, но на другом ядре. Эта концепция называется параллелизм данных. При этом каждое ядро ​​системы работает с разными подмножествами данных для получения результата. При этом мы можем вычислить матрицу C как сумму A и B, используя все ядра системы.

Почему бы не добавить столбцы вместо строк?

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

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

Первым шагом должен быть импорт всех необходимых библиотек для создания разделяемых областей памяти. Мы можем создать массив NumPy a. Объект Shared_memory используется для создания общего пространства памяти с параметром create=True и размером, равным размеру массива a.

Теперь мы можем создать другую матрицу b, используя тот же размер и форму в том же пространстве, используя параметр buffer= shm.buf. Затем мы можем скопировать содержимое A в B, а затем выполнить наш вариант добавления.

Разница в MLOps? Наглядность, воспроизводимость и сотрудничество. Узнайте больше о создании эффективных команд машинного обучения из нашей бесплатной электронной книги.

Чтобы узнать о типе a и b, а также об имени созданной общей памяти, мы можем использовать следующую команду:

Для операции сложения мы можем открыть новый терминал и добавить a и b, чтобы получить c. Точно так же мы можем использовать этот же метод для умножения, и эту концепцию можно распространить также на векторы и тензоры.

Дерева решений

Для деревьев решений на каждом уровне нам нужно принять новое решение, что означает, что на каждом уровне конкуренция не зависит друг от друга, что дает нам возможность запускать все эти разные поддеревья в разные ядра и расширять возможности параллельных вычислений. программирование. Вот пример того, как мы можем запускать разные поддеревья в разные ядра:

В случае Случайного леса, подобно дереву решений, мы можем обучать разные деревья на разных ядрах, чтобы получить результат из случайного леса. Различные ядра от C1, C2 … C6 можно использовать для обучения разных деревьев, таких как T1, T2 …… T6 и так далее.

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

Производство систем машинного обучения

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

Распараллеливание и обработка этих запросов становится очень важным, иначе это может привести к поломке системы. Например, предположим, что у нас есть веб-сайт электронной коммерции, и на этом веб-сайте у нас есть запросы от многих пользователей. Для обработки такого сценария мы можем использовать такие инструменты, как G unicorn. Gunicorn — это HTTP-сервер WSGI для UNIX, быстрых клиентов и сонных приложений.

Таким образом, этот сервер WSGI принимает все запросы от пользователей и проверяет, какой процессор простаивает в это время, и отправляет запрос этому процессору, чтобы получить ответ, а затем отправляет его обратно пользователю. Все параллельное управление запросами/ответами осуществляется с помощью этого инструмента.

Заключение

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

Если я пропустил важную деталь или вы хотите что-то добавить к этому сообщению в блоге, пожалуйста, не стесняйтесь связаться со мной. Я с нетерпением жду ваших отзывов, так мы учимся 🤗

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

Независимая от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по данным и командам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим нашим авторам и не продаем рекламу.

Если вы хотите внести свой вклад, перейдите к нашему призыву к участию. Вы также можете подписаться на получение нашего еженедельного информационного бюллетеня (Еженедельник глубокого обучения), заглянуть в блог Comet, присоединиться к нам в Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов и событий. и многое другое, что поможет вам быстрее создавать более качественные модели машинного обучения.