Keras cinsinden çoklu GPU


33

Keras kütüphanesinde (veya tensorflow) çoklu GPU'larda bölüm eğitimini nasıl programlayabilirsiniz? 8 GPU'lu bir Amazon ec2 örneğinde olduğunuzu ve hepsini daha hızlı eğitmek için kullanmak istediğinizi varsayalım, ancak kodunuz yalnızca tek bir CPU veya GPU için.


3
tensorflow belgesini kontrol ettin mi?
n1tk

@ sb0709: Bu sabah okumaya başladım ama keras içinde bunu nasıl merak
Hector BLANDIN

1
keraslarda bilmiyorum ama tensorflow için: tf CPU için olsa bile hesaplama için GPU'yu kullanacak (eğer destekli GPU varsa). yani sadece bir döngü için: "['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]: 'de ve" "tf.device (d)" tüm örnek GPU kaynaklarınızı içermelidir. Yani tf.device () aslında kullanılacak.
n1tk

Bunun gibi ?? d için ['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]: tf.device (d) ve bu? Öyle deneyeceğim :)
Hector Blandin 19:17

1
bildiğim kadarıyla evet, farklı cihazlarda herhangi bir görevi yapabilirsiniz.
n1tk

Yanıtlar:


37

Keras SSS'den:

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

Aşağıda 'veri paralelliğini' sağlamak için kopya ile yapıştırılmış kod bulunmaktadır. Yani, GPU'larınızın her birinin verilerinizin farklı bir alt kümesini bağımsız olarak işlemesini sağlamak.

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)

Bunun sadece yazım sırasındaki Tensorflow arka ucu için geçerli göründüğünü unutmayın.

Güncelleme (Şubat 2018) :

Keras artık multi_gpu_model kullanarak otomatik gpu seçimini kabul ediyor, bu nedenle artık gpus sayısını sabitlemek zorunda değilsiniz. Bu Çekme Talebindeki Ayrıntılar . Başka bir deyişle, bu şuna benzeyen kodu etkinleştirir:

try:
    model = multi_gpu_model(model)
except:
    pass

Ancak, daha açık olmak için , şöyle bir şeye bağlı kalabilirsiniz:

parallel_model = multi_gpu_model(model, gpus=None)

Bonus :

Tüm GPU'larınızı, özellikle NVIDIA'larını gerçekten kullanıp kullanmadığınızı kontrol etmek için terminaldeki kullanımınızı aşağıdakileri kullanarak izleyebilirsiniz:

watch -n0.5 nvidia-smi

Referanslar:


multi_gpu_model(model, gpus=None)Sadece 1 GPU olduğu durumda iş yapıyor mu ? Mevcut GPU sayısına otomatik olarak adapte olsaydı harika olurdu.
CMCDragonkai

Evet, bu 1 GPU ile çalışır düşünüyorum bkz github.com/keras-team/keras/pull/9226#issuecomment-361692460 , ancak kod basit bir model yerine bir multi_gpu_model üzerinde çalışacak şekilde adapte olduğunu dikkatli olmak gerekebilir . Çoğu durumda, muhtemelen önemli olmaz, ancak bazı ara katmanın çıktısını almak gibi bir şey yapacaksanız, buna göre kodlamanız gerekir.
weiji14 6:18

Çok gpu model farklılıklarına referansınız var mı?
CMCDragonkai


Bu referans @ wejiji14 harikaydı. Ancak bunun nasıl bir sonuç çıkarmaya çalıştığıyla da ilgileniyorum. Keras, bir şekilde grupları eşit olarak mı yoksa mevcut model kopyalarında yuvarlak robin zamanlamasını bölüyor mu?
CMCDragonkai

4
  1. TensorFlow için:

GPU'ları Kullanarak TensorFlow

İşte nasıl kullanılacağına dair örnek kod, bu yüzden her görev için cihaz / cihaz listesi belirtildi :

# 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 CPU için olsa bile hesaplama için GPU'yu kullanır (eğer destekli GPU varsa). yani sadece bir döngü için: "['/ gpu: 1', '/ gpu: 2', '/ gpu: 3' ... '/ gpu: 8',]: 'de ve" "tf.device (d)" tüm örnek GPU kaynaklarınızı içermelidir. Yani tf.device () aslında kullanılacak.

Ölçekli Keras Modeli Eğitimini Birden Çok GPU'ya

  1. keras

Kex'ler için args.num_gpus yerine Mxnet kullanarak , num_gpus sizin gerekli GPU'larınızın listesidir.

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

Son zamanlarda Uber’in son zamanlarda Horovod kaynaklı olduğunu düşünüyorum ve bence harika:

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

Temel olarak, aşağıdaki örneğin bir örneğini alabilirsiniz. İhtiyacınız olan tek şey, kerasları aldıktan sonra cpu ve gpu tüketim değerlerini belirlemektir.

import keras

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

Ondan sonra, modele uyacaktın.

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

Son olarak, işin üstündeki sınır değerlerde değil tüketim değerlerini azaltabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.