Multi GPU в керах


33

Як ви можете запрограмувати в бібліотеці керас (або тензорфлоу) для навчання розділів на декількох графічних процесорах? Скажімо, ви знаходитесь в екземплярі Amazon ec2, який має 8 графічних процесорів, і ви хочете використовувати їх для швидшого тренування, але ваш код призначений лише для одного процесора або GPU.


3
ви перевірили документа tensorflow?
n1tk

@ sb0709: Я почав читати сьогодні вранці, але мені було цікаво, як це зробити в керах
Гектор Бландін,

1
не знаю в керах, але для tensorflow: tf буде використовувати GPU за замовчуванням для обчислень, навіть якщо це для CPU (якщо є підтримуваний GPU). тому ви можете просто зробити цикл for: "for d in ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]:" і в "tf.device (d)" має включати всі ресурси GPU вашого примірника. Тож tf.device () буде фактично використаний.
n1tk

Подобається це ?? для d в ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]: tf.device (d), і це? Я спробую так :)
Гектор Бландін

1
наскільки я знаю, так, ви можете виконувати будь-які завдання на різних пристроях.
n1tk

Відповіді:


37

З питань поширених питань Keras:

https://keras.io/getting-started/faq/#how-can-i-run-a-keras-model-on-multiple-gpus

Нижче наведено код, вставлений для копіювання, щоб увімкнути "паралелізм даних". Тобто кожен із ваших графічних процесорів обробляє інший підмножину даних незалежно.

from keras.utils import multi_gpu_model

# Replicates `model` on 8 GPUs.
# This assumes that your machine has 8 available GPUs.
parallel_model = multi_gpu_model(model, gpus=8)
parallel_model.compile(loss='categorical_crossentropy',
                       optimizer='rmsprop')

# This `fit` call will be distributed on 8 GPUs.
# Since the batch size is 256, each GPU will process 32 samples.
parallel_model.fit(x, y, epochs=20, batch_size=256)

Зауважте, що це видається дійсним лише для бекенда Tensorflow під час написання.

Оновлення (лютий 2018 р.) :

Тепер Keras приймає автоматичний вибір gpu за допомогою multi_gpu_model, тому вам більше не доведеться жорстко кодувати кількість gpus. Деталі в цьому запиті . Іншими словами, це дозволяє код, який виглядає приблизно так:

try:
    model = multi_gpu_model(model)
except:
    pass

Але щоб бути більш чітким , ви можете дотримуватися чогось типу:

parallel_model = multi_gpu_model(model, gpus=None)

Бонус :

Щоб перевірити, чи справді ви використовуєте всі свої графічні процесори, зокрема NVIDIA, ви можете контролювати ваше використання в терміналі, використовуючи:

watch -n0.5 nvidia-smi

Список літератури:


Чи multi_gpu_model(model, gpus=None)працює в тому випадку, коли є лише 1 GPU? Було б здорово, якби він автоматично адаптувався до кількості доступних графічних процесорів.
CMCDragonkai

Так я думаю , що він працює з 1 GPU см github.com/keras-team/keras/pull/9226#issuecomment-361692460 , але ви , можливо , потрібно бути обережним , що ваш код пристосований для роботи на multi_gpu_model замість простої моделі . У більшості випадків це, мабуть, не має значення, але якщо ви збираєтеся зробити щось на кшталт того, щоб взяти вихід якогось проміжного шару, тоді вам потрібно буде кодувати відповідно.
weiji14

Чи є у вас посилання на відмінності між моделями мульти gpu?
CMCDragonkai

Ви маєте на увазі щось на кшталт github.com/rossumai/keras-multi-gpu/blob/master/blog/docs/… ?
weiji14

Ця посилання була чудовою @ weiji14. Однак мене також цікавить, як це працює для висновку. Чи кери якимось чином розділяють партії порівну або круговий графік роботи на доступних репліках моделі?
CMCDragonkai

4
  1. Для TensorFlow:

TensorFlow Використання графічних процесорів

Ось зразок коду про те, як використовується, тому для кожного завдання вказується список із пристроями / пристроєм:

# Creates a graph.
c = []
for d in ['/gpu:2', '/gpu:3']:
  with tf.device(d):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3])
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2])
    c.append(tf.matmul(a, b))
with tf.device('/cpu:0'):
  sum = tf.add_n(c)
# Creates a session with log_device_placement set to True.
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
# Runs the op.
print(sess.run(sum))

tf буде використовувати GPU за замовчуванням для обчислення, навіть якщо це для CPU (якщо є підтримуваний GPU). тому ви можете просто зробити цикл for: "for d in ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]:" і в "tf.device (d)" має включати всі ресурси GPU вашого примірника. Тож tf.device () буде фактично використаний.

Навчання масштабування моделі Keras до кількох графічних процесорів

  1. Керас

Для Keras, використовуючи Mxnet, ніж args.num_gpus , де num_gpus - список необхідних графічних процесорів.

def backend_agnostic_compile(model, loss, optimizer, metrics, args):
  if keras.backend._backend == 'mxnet':
      gpu_list = ["gpu(%d)" % i for i in range(args.num_gpus)]
      model.compile(loss=loss,
          optimizer=optimizer,
          metrics=metrics, 
          context = gpu_list)
  else:
      if args.num_gpus > 1:
          print("Warning: num_gpus > 1 but not using MxNet backend")
      model.compile(loss=loss,
          optimizer=optimizer,
          metrics=metrics)
  1. horovod.tensorflow

На додаток до нещодавно відкритого Гороводу Uber, і я думаю, що це чудово:

Горовод

import tensorflow as tf
import horovod.tensorflow as hvd

# Initialize Horovod
hvd.init()

# Pin GPU to be used to process local rank (one GPU per process)
config = tf.ConfigProto()
config.gpu_options.visible_device_list = str(hvd.local_rank())

# Build model…
loss = 
opt = tf.train.AdagradOptimizer(0.01)

# Add Horovod Distributed Optimizer
opt = hvd.DistributedOptimizer(opt)

# Add hook to broadcast variables from rank 0 to all other processes during
# initialization.
hooks = [hvd.BroadcastGlobalVariablesHook(0)]

# Make training operation
train_op = opt.minimize(loss)

# The MonitoredTrainingSession takes care of session initialization,
# restoring from a checkpoint, saving to a checkpoint, and closing when done
# or an error occurs.
with tf.train.MonitoredTrainingSession(checkpoint_dir=“/tmp/train_logs”,
                                      config=config,
                                      hooks=hooks) as mon_sess:
 while not mon_sess.should_stop():
   # Perform synchronous training.
   mon_sess.run(train_op)

2

В основному, ви можете взяти приклад з наступного прикладу. Все, що вам потрібно, це вказати значення споживання процесора та gpu після імпорту кера.

import keras

config = tf.ConfigProto( device_count = {'GPU': 1 , 'CPU': 56} )
sess = tf.Session(config=config) 
keras.backend.set_session(sess)

Після цього ви б підійшли до моделі.

model.fit(x_train, y_train, epochs=epochs, validation_data=(x_test, y_test))

Нарешті, ви можете зменшити значення споживання, не працюючи на верхніх межах.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.