-
Я завтра буду защищать докторскую диссертацию.У меня есть только карта 12G б/у.Я должен провести сегодня всю ночь 10 модельных экспериментов.
-
Я вырыл слот и внезапно нашел модель T9 Thunderbolt, но я не мог загрузить свою подержанную карту 12G.Я чувствовал, что пропущу награду за лучшую бумагу в этом году.
Вышеупомянутая проблема в основном в том, что машины не хватает и памяти не хватает. Во время обучения глубокому обучению размер пакета данных ограничен памятью графического процессора, и размер пакета будет влиять на окончательную точность модели и производительность процесса обучения. Когда память графического процессора остается неизменной, модель становится все больше и больше, а это означает, что размер пакета данных разумно уменьшается.В это время накопление градиента (Gradient Accumulation) можно использовать как простое решение для решения этой проблемы. .
Оранжевая часть ЗДЕСЬ на рисунке ниже - это приблизительное положение алгоритма накопления градиента в системе ИИ, Как правило, он находится в слое выражения структуры ИИ/системы ИИ и тесно интегрирован с алгоритмом .
Роль размера партии
Размер пакета обучающих данных оказывает ключевое влияние на сходимость процесса обучения и окончательную точность обученной модели. Как правило, существует оптимальное значение или диапазон значений для размера пакета каждой нейронной сети и набора данных.
Разные нейронные сети и разные наборы данных могут иметь разные оптимальные размеры пакетов.
Есть два основных вопроса, которые следует учитывать при выборе размера партии:
обобщаемость: Большие размеры партии могут застревать в локальных минимумах. Застревание в локальном минимуме означает, что нейронная сеть будет хорошо работать на выборках за пределами обучающей выборки. Этот процесс называется обобщением. Следовательно, обобщение обычно указывает на переоснащение.
скорость сходимости: Небольшой размер пакета может привести к медленной сходимости алгоритмов обучения. Обновление сетевой модели в каждом пакете будет определять начальную точку обновления следующего пакета. Каждая партия будет обучать набор данных и случайным образом выбирать обучающие выборки, поэтому результирующий градиент является оценкой, основанной на части шума данных. Чем меньше образцов используется в одной партии, тем менее точной будет оценка градиента. Другими словами, меньший размер пакета может сделать процесс обучения более изменчивым, существенно увеличивая время, необходимое для сходимости алгоритма.
Принимая во внимание две указанные выше основные проблемы, перед тренировкой необходимо выбрать подходящий размер партии.
Влияние размера пакета на память
Хотя традиционные компьютеры имеют доступ к большому объему ОЗУ на ЦП, твердотельные накопители также можно использовать для кэша L2 или механизма виртуального кэша. Но на чипах с ускорением ИИ, таких как графические процессоры, памяти гораздо меньше. В настоящее время размер пакета обучающих данных оказывает большое влияние на память графического процессора.
Чтобы понять это дальше, давайте сначала исследуем содержимое памяти в памяти ИИ-чипа во время обучения:
- Параметры модели: Весовые параметры и смещения, которые должна использовать сетевая модель.
- переменная оптимизатора: переменные, требуемые алгоритмом оптимизатора, такие как импульс импульса.
- Промежуточные вычисляемые переменные: Промежуточные значения, полученные в результате расчетов сетевой модели, которые временно сохраняются в памяти чипа ускорения ИИ, например, результат активации каждого уровня.
- Рабочее пространство: Реализация ядра чипа ускорения ИИ представляет собой локальную переменную, которую необходимо использовать, и сгенерированную ею временную память, например локальную переменную, сгенерированную при вычислении B/C в операторе D=A+B/ С.
Следовательно, чем больше размер пакета, тем больше выборок требуется для обучения нейронной сети, что приводит к всплеску переменных, которые необходимо хранить в памяти ИИ-чипа. Во многих случаях памяти микросхемы ускорения AI недостаточно, а размер пакета установлен слишком большим, и возникает ошибка OOM (Out Off Memory).
Методы использования большого размера партии
Один из способов решить проблему ограничения памяти, связанную с чипами ускорения искусственного интеллекта, и запустить пакет большого размера — разделить пакет выборки данных на более мелкие пакеты, называемые мини-пакетами. Эти небольшие мини-пакеты могут работать независимо и усреднять или суммировать градиенты во время обучения сетевой модели. Есть два основных способа добиться этого.
1)параллелизм данных: Используйте несколько чипов ускорения ИИ для параллельного обучения всех мини-пакетов, все данные находятся на одном чипе ускорения ИИ. Градиенты всех мини-пакетов накапливаются, и результат используется для суммирования и обновления параметров сети в конце каждой эпохи.
2)Накопление градиента: Последовательное выполнение мини-пакета и одновременное накопление градиентов.Накопленные результаты усредняются для обновления переменных модели после последнего расчета мини-пакета.
Хотя эти две технологии очень похожи, проблема, которую необходимо решить, заключается в том, что память не может выполнять больший размер пакета, но накопление градиента может быть выполнено с помощью одного чипа ускорения ИИ, а для параллелизма данных требуется несколько чипов ускорения ИИ, поэтому под рукой Студенты, у которых есть только подержанная карта 12G, поторопитесьНакопление градиентаиспользуй это.
Принцип накопления градиента
Накопление градиента — это метод, при котором выборка данных для обучения нейронной сети разбивается на несколько небольших пакетов по партиям, а затем последовательно вычисляется.
Прежде чем обсуждать дальнейшее накопление градиента, давайте посмотрим на вычислительный процесс нейронной сети.
Модель глубокого обучения состоит из множества взаимосвязанных блоков нейронной сети, а выборочные данные непрерывно распространяются вперед по всем слоям нейронной сети. После прохождения всех слоев сетевая модель выводит предсказанное значение выборки, проходит через функцию потерь и вычисляет значение потерь (ошибку) для каждой выборки. Нейронная сеть использует обратное распространение для расчета градиента значения потерь относительно параметров модели. Наконец, информация о градиенте используется для обновления параметров сетевой модели.
Математическая формула, используемая оптимизатором для обновления параметров веса модели сетевой модели. В качестве примера возьмем простой алгоритм стохастического градиентного спуска (SGD).
Предположим, что формула функции функции потерь:
При построении модели оптимизатор используется для расчета алгоритма, минимизирующего потери. Здесь алгоритм SGD использует функцию Loss для обновления параметров веса Формула:
где theta — обучаемый параметр (вес или смещение) в сетевой модели, lr — скорость обучения, а grad — потеря относительно параметров сетевой модели.
Накопление градиента только вычисляет модель нейронной сети, но не обновляет параметры сетевой модели во времени.В то же время информация о градиенте, полученная во время расчета, накапливается во время расчета, и, наконец, накопленный градиент используется для обновления параметры.
Когда переменные модели не обновляются, исходный пакет данных фактически делится на несколько небольших мини-пакетов, а выборки, используемые на каждом этапе, фактически представляют собой меньшие наборы данных.
Переменные не обновляются в течение N шагов, поэтому все мини-пакеты используют одни и те же переменные модели для расчета градиента, чтобы гарантировать получение одинаковой информации о градиенте и весе.Алгоритмически это эквивалентно использованию исходного размера пакета без сегментации. . который:
В конечном итоге накопление градиентов на вышеуказанных шагах дает сумму градиентов того же размера, что и при использовании глобального размера пакета.
Конечно, в реальном проектировании есть два момента, на которые следует обратить внимание в отношении настройки параметров и алгоритмов:
скорость обучения:При определенных условиях, чем больше размер партии, тем лучше эффект обучения.Накопление градиента имитирует эффект увеличения размера партии.Если шагов накопления 4, размер партии увеличивается в 4 раза.По опыту ZOMI, используется накопление градиента, необходимо соответствующим образом увеличить скорость обучения.
Нормализованная норма партии: Когда количество шагов накопления равно 4, размер партии используется для имитации эффекта усиления. По сравнению с реальным размером партии распределение данных не совсем то же самое. Среднее значение и дисперсия, рассчитанные BN с 4-кратным размером партии, не являются такие же, как фактическое среднее значение данных и дисперсия. , поэтому в некоторых реализациях вместо пакетной нормы используется групповая норма.
Реализация накопления градиента
Псевдокод для обычного обучения партии:
for i, (images, labels) in enumerate(train_data):
# 1. forwared 前向计算
outputs = model(images)
loss = criterion(outputs, labels)
# 2. backward 反向传播计算梯度
optimizer.zero_grad()
loss.backward()
optimizer.step()
-
model(images)
Ввод изображения и метки, прямой расчет. -
criterion(outputs, labels)
Прогнозируемое значение получается путем прямого расчета и вычисляется функция потерь. -
ptimizer.zero_grad()
Очистить информацию о градиенте в истории. -
loss.backward()
Обратное распространение выполняется для вычисления градиента текущей партии. -
optimizer.step()
По градиенту, полученному обратным распространением, обновляются параметры сети.
То есть введите пакет данных в сеть, один раз рассчитайте градиент и один раз обновите сеть.
После использования накопления градиента:
# 梯度累加参数
accumulation_steps = 4
for i, (images, labels) in enumerate(train_data):
# 1. forwared 前向计算
outputs = model(imgaes)
loss = criterion(outputs, labels)
# 2.1 loss regularization loss正则化
loss += loss / accumulation_steps
# 2.2 backward propagation 反向传播计算梯度
loss.backward()
# 3. update parameters of net
if ((i+1) % accumulation)==0:
# optimizer the net
optimizer.step()
optimizer.zero_grad() # reset grdient
-
model(images)
Ввод изображения и метки, прямой расчет. -
criterion(outputs, labels)
Прогнозируемое значение получается путем прямого расчета и вычисляется функция потерь. -
loss / accumulation_steps
Потеря обновляется каждый раз, поэтому каждый раз она делится на шаги и накапливается до исходного градиента. -
loss.backward()
Обратное распространение выполняется для вычисления градиента текущей партии. - Повторите шаги 1-2 псевдокода несколько раз, не очищая градиент, чтобы градиент накапливался на историческом градиенте.
-
optimizer.step()
После накопления градиента определенное количество раз параметры сети обновляются в соответствии с накопленным градиентом. -
optimizer.zero_grad()
Очистите исторический градиент и подготовьтесь к следующему накоплению градиента.
Накопление градиента означает, что каждый раз получается один пакет данных, а градиент вычисляется один раз.В это время градиент не очищается, а накапливается непрерывно.После накопления определенное количество раз параметры сети обновляются в соответствии с накопленными градиент, после чего вся информация о градиенте очищается, и выполняется следующий цикл.
использованная литература
- [1] Херманс, Джоэри Р., Герасимос Спанакис и Рико Мёккель, «Нормализация накопленного градиента», Азиатская конференция по машинному обучению, PMLR, 2017.
- [2] Lin, Yujun, et al. "Deep gradient compression: Reducing the communication bandwidth for distributed training." arXiv preprint arXiv:1712.01887 (2017).
- [3] how-to-break-gpu-memory-boundaries-even-with-large-batch-sizes
- [4] what-is-gradient-accumulation-in-deep-learning