Принцип ускорения обучения GPU «Технология разработки» (с навыками обучения KerasGPU)

искусственный интеллект глубокое обучение

0. Глубокое понимание принципа ускорения обучения GPU

Мы все знаем, что использование графического процессора может ускорить обучение нейронной сети (по сравнению с процессором).Для сравнения конкретных скоростей, пожалуйста, обратитесь к моему предыдущему сообщению в блоге о сравнении скоростей:[Глубокое приложение] · Сравнение скорости основного оборудования для глубокого обучения (CPU, GPU, TPU)

Как ускоряется GPU?

Я намерен ответить двумя способами:

  • Один GPU быстрее, чем CPU:

В обучающей сети много вычислительных ресурсов фактически потребляется при численном расчете.Большая часть процесса обучения сети состоит из 1. Рассчитать потери, 2. Найти градиент в соответствии с потерями и 3. Обновить параметры в соответствии с градиентом. (принцип градиентного спуска). Независимо от GPU или CPU, 123 шага повторяются непрерывно. Но потому, что ЦП — это вычислительная единица общего назначения (не подходит для числовых операций), а специализация графического процессора — обработка изображений (численные вычисления). Поэтому GPU больше подходит для обучения сети, тем самым ускоряя эффект.

  • Ускорение нескольких GPU по сравнению с одним GPU:

Как правило, при обучении на GPU в том же GPU размер_batch_size определяет скорость обучения. Чем меньше размер_пакета, тем больше количество шагов (data_len/batch_size), необходимых для одного раунда обучения, что занимает больше времени.

Ниже описан принцип использования параллельного ускорения данных с несколькими GPU:

Предположим, что на машине имеется k графических процессоров. Учитывая обучаемую модель, каждый графический процессор и соответствующая ему видеопамять будут независимо поддерживать полный набор параметров модели. В любой итерации обучения модели для случайной мини-партии мы делим выборки в партии на k частей и назначаем по одной в видеопамять каждой видеокарты. Затем каждый GPU будет вычислять локальный градиент параметров модели в соответствии с подмножеством мини-пакетов, которому выделена соответствующая видеопамять, и поддерживаемыми параметрами модели. Далее мы добавляем локальные градиенты в видеопамять k видеокарт, чтобы получить текущий мини-пакетный стохастический градиент. После этого каждый графический процессор использует этот мини-пакетный стохастический градиент для обновления полных параметров модели, поддерживаемых соответствующей видеопамятью. На рисунке ниже показано вычисление мини-пакетных стохастических градиентов с параллелизмом данных с использованием 2 графических процессоров.

Вычисление мини-пакетных стохастических градиентов с параллелизмом данных с использованием 2 GPU

Вспоминаем процесс градиентного спуска, 1. Рассчитываем потери, 2. Находим градиент по потерям и 3. Обновляем параметры по градиенту.

Используя вышеупомянутый метод параллельных данных с несколькими графическими процессорами, можно понять, что размер_пакета увеличивается в k раз, так что общее время сокращается до 1/k, и реализуется обучение вычислениям с несколькими графическими процессорами.

На самом деле параметры сети на каждом GPU одинаковые, потому что все они обновляются с одной и той же потери.


1. Как запустить Keras на графическом процессоре?

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

Если вы работаете с серверной частью Theano, вы можете использовать один из следующих методов:

метод 1: Используйте флаги Theano.

THEANO_FLAGS=device=gpu,floatX=float32 python my_keras_script.py

«GPU», возможно, необходимо изменять в соответствии с идентификаторами вашего устройства (например, GPU0, GPU1 и т. Д.).

Способ 2: Создайте.theanorcРуководство

Способ 3: устанавливается вручную в начале кодаtheano.config.devicetheano.config.floatX:

import theano
theano.config.device = 'gpu'
theano.config.floatX = 'float32'

 

2. Как запустить модель Keras на нескольких графических процессорах?

Мы рекомендуем использовать для этой задачи бэкенд TensorFlow. Существует два способа запуска одной модели на нескольких графических процессорах:параллелизм данныхипараллелизм устройств.

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

параллелизм данных

Параллелизм данных включает однократную репликацию целевой модели на каждое устройство и использование каждой копии модели для обработки другой части входных данных. Keras имеет встроенную служебную функциюkeras.utils.multi_gpu_model, который может генерировать параллельную по данным версию любой модели с квазилинейным ускорением на 8 графических процессорах.

Для получения дополнительной информации см.multi_gpu_modelдокументация. Вот краткий пример:

from keras.utils import multi_gpu_model

# 将 `model` 复制到 8 个 GPU 上。
# 假定你的机器有 8 个可用的 GPU。
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
                       optimizer='rmsprop')

# 这个 `fit` 调用将分布在 8 个 GPU 上。
# 由于 batch size 为 256,每个 GPU 将处理 32 个样本。
parallel_model.fit(x, y, epochs=20, batch_size=256)

параллелизм устройств

Параллелизм устройств предполагает выполнение разных частей одной и той же модели на разных устройствах. Это подходит для моделей с параллельной архитектурой, например, с двумя ветвями.

Этот параллелизм может быть достигнут с помощью областей устройства TensorFlow. Вот простой пример:

# 模型中共享的 LSTM 用于并行编码两个不同的序列
input_a = keras.Input(shape=(140, 256))
input_b = keras.Input(shape=(140, 256))

shared_lstm = keras.layers.LSTM(64)

# 在一个 GPU 上处理第一个序列
with tf.device_scope('/gpu:0'):
    encoded_a = shared_lstm(tweet_a)
# 在另一个 GPU上 处理下一个序列
with tf.device_scope('/gpu:1'):
    encoded_b = shared_lstm(tweet_b)

# 在 CPU 上连接结果
with tf.device_scope('/cpu:0'):
    merged_vector = keras.layers.concatenate([encoded_a, encoded_b],
                                             axis=-1)

3. Ссылка

1.2 из this.love/chapter_com…

2.Доступно на ras.io/this/getting-…