Изменения

Перейти к: навигация, поиск

Многопоточность в машинном обучении

235 байт добавлено, 14:13, 20 апреля 2020
Нет описания правки
== Идеи используемые для ускорения вычислений в ML ==
=== Параллелизм для ускорения линейной алгебры. ===
Мы можем значительно повысить производительность, создав ядра линейной алгебры (например, умножение матриц, векторное сложение и т.д.), которые используют параллелизм для ускорения работы. Поскольку умножение матриц занимает большую часть времени обучения нейронных сетей, это может привести к значительному сквозному ускорению обучающего конвейера. В основе этого лежит параллелизм ILP, SIMD а для больших матриц также может использоваться многопоточность.
Примеры оптимизаций:
* Алгоритмы в терминах матричных операций, а не векторных операций, насколько это возможно.
* Broadcast операции, а не циклы.
* Распараллеленные реализации некоторых специальных операций (таких как свертки для [[Сверточные нейронные сети | CNN]]).
==== Параллелизм broadcast операций ====
=== Параллелизм в оптимизации гиперпараметров ===
Для параллельной [[Настройка гиперпараметров | оптимизации геперпараметров гиперпараметров]] можно использовать поиск по решётке или случайный поиск в которых мы можем оценить параметры независимо.
Такая оптимизации часто встречаются в библиотеках машинного обучения.
=== Параллелизм [[Кросс-валидация | кросс-валидации ]] ===
Полная кросс-валидация, k-fold, t×k-fold, Leave-One-Out легко распараллеливаются на несколько потоков, каждый из которых работает на своем разбиении данных
=== Параллелизм GPU ===
Типичное число потоков обработки графического процессора - десятки тысяч, что позволяет вычислять одну и ту же операцию параллельно на множестве элементов.
 
Фреймворки машинного обучения, такие как TensorFlow, PyTorch и MxNet используют эти возможности через библиотеки от компаний производителей графических ускорителей:
* cuBLAS - библиотека от Nvidia позволяющая эффективно перемножать матрицы.* CUDA - язык параллельного программирования/вычислительная платформа для вычислений общего назначения на графическом процессоре
=== Параллелизм SGD ===
Запускаем внешний цикл [[Стохастический градиентный спуск|SGD ]] параллельно в пуле потоков и используем конструкции синхронизации, такие как блокировки, чтобы предотвратить состояние гонки. Но это может работать медленно из-за накладных расходов на синхронизацию.  
Еще более интересная идея (называемая асинхронным SGD или Hogwild): Несколько потоков запускают SGD параллельно без какой-либо синхронизации. Теперь условия гонки могут возникнуть, но оказывается, что во многих случаях это хорошо, шум/ошибка в условиях гонки просто добавляет небольшое количество к шуму/ошибке, уже присутствующей в алгоритм из-за случайной выборки градиента.
7
правок

Навигация