keras中的多GPU


33

如何在keras库(或tensorflow)中进行编程,以在多个GPU上划分训练?假设您位于具有8个GPU的Amazon ec2实例中,并且希望使用它们全部进行训练,但是您的代码仅适用于单个CPU或GPU。


3
您是否检查过tensorflow文档?
n1tk

@ sb0709:我今天早上开始阅读,但是我想知道如何在喀拉拉邦读书
Hector Blandin

1
在keras中不知道,但对于tensorflow:即使在CPU中,tf默认情况下也会使用GPU进行计算(如果存在,则支持GPU)。因此您可以执行一个for循环:“在['/ gpu:1','/ gpu:2','/ gpu:3'...'/ gpu:8',]:中为d” “ tf.device(d)”应包括所有实例GPU资源。因此,实际上将使用tf.device()。
n1tk

像这样 ??对于[[/ gpu:1','/ gpu:2','/ gpu:3'...'/ gpu:8',]中的d:tf.device(d),那是?我会这样尝试:)
赫克托·布兰丁

1
据我所知,您可以在不同的设备上执行任何任务。
n1tk

Answers:


37

从Keras常见问题解答:

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

以下是启用“数据并行性”的复制粘贴代码。即让每个GPU独立处理数据的不同子集。

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年2月)

Keras现在接受使用multi_gpu_model进行自动gpu选择,因此您不必再对gpu的数量进行硬编码。此Pull Request中的详细信息。换句话说,这将启用如下所示的代码:

try:
    model = multi_gpu_model(model)
except:
    pass

但更明确地说,您可以坚持使用类似以下内容:

parallel_model = multi_gpu_model(model, gpus=None)

奖金

要检查您是否真的在使用所有GPU,特别是NVIDIA GPU,可以使用以下命令监控终端的使用情况:

watch -n0.5 nvidia-smi

参考文献:


请问multi_gpu_model(model, gpus=None)在那里是只有1个GPU的情况下工作?如果它能够自动适应可用GPU的数量,那就太酷了。
CMCDragonkai '18年

是的,我认为它可以与1个GPU一起使用,请参阅github.com/keras-team/keras/pull/9226#issuecomment-361692460,但是您可能需要注意,您的代码适合在multi_gpu_model而不是简单模型上运行。在大多数情况下,这可能无关紧要,但是如果您要进行一些中间层的输出等操作,则需要进行相应的编码。
weiji14'9

您是否有关于多个GPU模型差异的参考?
CMCDragonkai


那个引用很棒@ weiji14。但是,我也对推理的工作方式感兴趣。keras是否会在可用模型副本上以均等方式拆分批次或轮循计划?
CMCDragonkai

4
  1. 对于TensorFlow:

使用GPU的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))

即使是用于CPU,tf也会默认使用GPU进行计算(如果存在,则支持GPU)。因此您可以执行一个for循环:“在['/ gpu:1','/ gpu:2','/ gpu:3'...'/ gpu:8',]:中为d” “ tf.device(d)”应包括所有实例GPU资源。因此,实际上将使用tf.device()。

将Keras模型训练扩展到多个GPU

  1. 凯拉斯

对于使用Mxnet而不是args.num_gpus的Keras,其中num_gpus是所需GPU的列表。

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最近开源了Horovod,我认为这很棒:

霍罗沃德

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

基本上,您可以以以下示例为例。您只需要在导入keras之后指定cpu和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))

最后,您可以降低消耗值而不是上限。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.