Изменения

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

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

6294 байта добавлено, 14:01, 20 апреля 2020
Статья, первый вид
Следует выделить следующие виды параллелизма:
* Параллелизм на уровне инструкций (ILP): запускать несколько инструкций одновременно.
* Параллелизм одна инструкция множество данных(SIMD): одна инструкция работает с вектором чисел
* Многопоточный параллелизм: несколько независимых рабочих потоков взаимодействуют через абстракцию совместно используемой памяти.
* Распределенные вычисления: несколько независимых рабочих компьютеров взаимодействуют по сети. (MLlib на Spark, Mahout на Hadoop)

== Идеи используемые для ускорения вычислений в ML ==
=== Параллелизм для ускорения линейной алгебры. ===
Мы можем значительно повысить производительность, создав ядра линейной алгебры (например, умножение матриц, векторное сложение и т.д.), которые используют параллелизм для ускорения работы. Поскольку умножение матриц занимает большую часть обучения нейронных сетей, это может привести к значительному сквозному ускорению обучающего конвейера. В основе этого лежит параллелизм ILP, SIMD а для больших матриц также может использоваться многопоточность.

Примеры оптимизаций:
* Высоко оптимизированные тензорные библиотеки для арифметики.
* Алгоритмы в терминах матричных операций, а не векторных операций, насколько это возможно.
* Broadcast операции, а не циклы.
* Распараллеленные реализации некоторых специальных операций (таких как свертки для CNN).

==== Параллелизм broadcast операций ====
Просмотрите код наивной реализации поэлементное произведение двух векторов на Python

def elementwise_product(x, y):
assert(len(x) == len(y))
z = numpy.zeros(len(x))
for i in range(len(x)):
z[i] = x[i] * y[i]
return z

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

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

=== Параллелизм кросс-валидации ===
Полная кросс-валидация, k-fold, t×k-fold, Leave-One-Out легко распараллеливаются на несколько потоков, каждый из которых работает на своем разбиении данных

[[Файл:ParallelCrossValidation.png|500px]]

=== Параллелизм GPU ===
Типичное число потоков обработки графического процессора - десятки тысяч, что позволяет вычислять одну и ту же операцию параллельно на множестве элементов.
Фреймворки машинного обучения, такие как TensorFlow, PyTorch и MxNet используют эти возможности через библиотеки от компаний производителей графических ускорителей:
cuBLAS - библиотека от Nvidia позволяющая эффективно перемножать матрицы.
CUDA - язык параллельного программирования/вычислительная платформа для вычислений общего назначения на графическом процессоре

=== Параллелизм SGD ===
Запускаем внешний цикл SGD параллельно в пуле потоков и используем конструкции синхронизации, такие как блокировки, чтобы предотвратить состояние гонки. Но это может работать медленно из-за накладных расходов на синхронизацию.
Еще более интересная идея (называемая асинхронным SGD или Hogwild): Несколько потоков запускают SGD параллельно без какой-либо синхронизации. Теперь условия гонки могут возникнуть, но оказывается, что во многих случаях это хорошо, шум/ошибка в условиях гонки просто добавляет небольшое количество к шуму/ошибке, уже присутствующей в алгоритм из-за случайной выборки градиента.

== Источники информации ==
# [http://www.cs.cornell.edu/courses/cs4787/2019sp/notes/lecture1.pdf Principles of Large-Scale Machine Learning]

[[Категория: Машинное обучение]]
7
правок

Навигация