কেরাসে মাল্টি জিপিইউ


33

কীভাবে আপনি একাধিক জিপিইউতে পার্টিশন প্রশিক্ষণের জন্য কেরাস লাইব্রেরিতে (বা টেনসরফ্লো) প্রোগ্রাম করতে পারেন? ধরা যাক যে আপনি একটি অ্যামাজন ই সি 2 উদাহরণে রয়েছেন যার 8 টি জিপিইউ রয়েছে এবং আপনি দ্রুত প্রশিক্ষণের জন্য সেগুলি ব্যবহার করতে চান তবে আপনার কোডটি কেবল একটি সিপিইউ বা জিপিইউর জন্য।


3
আপনি টেনসরফ্লো ডকটি পরীক্ষা করেছেন?
n1tk

@ এসবি070০৯: আমি আজ সকালে পড়তে শুরু করেছিলাম তবে ভাবছিলাম কীভাবে এটি
কেরাসে করা যায়

1
কেরাসে জানেন না তবে টেনসরফ্লো জন্য: tf সিপিইউর জন্য উপস্থিত থাকলেও জিপিইউ ডিফল্টরূপে জিপিইউ ব্যবহার করবে (যদি উপস্থিত জিপিইউ সমর্থিত থাকে)। সুতরাং আপনি কেবল লুপের জন্য একটি করতে পারেন: "ডি এর জন্য ['/ জিপিইউ: 1', '/ জিপিইউ: 2', '/ জিপিইউ: 3' ... '' / জিপিইউ: 8 ',]:" এবং "tf.device (d)" এ আপনার সমস্ত উদাহরণ জিপিইউ সংস্থান অন্তর্ভুক্ত করা উচিত। সুতরাং tf.device () আসলে ব্যবহৃত হবে।
n1tk

এটার মত ?? ডি এর জন্য ['/ জিপিইউ: 1', '/ জিপিইউ: 2', '/ জিপিইউ: 3' ... '/ জিপিইউ: 8',]: টিএফ.ডভাইস (ডি) এবং তা কি? আমি এর মতো চেষ্টা করব :)
হেক্টর ব্ল্যান্ডিন

1
যতদূর আমি হ্যাঁ জানি, আপনি বিভিন্ন ডিভাইসে কোনও কাজ করতে পারেন।
n1tk

উত্তর:


37

কেরাস এফএকিউ থেকে:

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)

মনে রাখবেন যে এটি লেখার সময় কেবল টেনসরফ্লো ব্যাকএন্ডের জন্য বৈধ বলে মনে হচ্ছে।

আপডেট (ফেব্রুয়ারী 2018) :

কেরাস এখন মাল্টি_জিপিউ_মোডেল ব্যবহার করে স্বয়ংক্রিয় জিপিইউ নির্বাচনটি গ্রহণ করে, তাই আপনাকে আর জিপিাসের সংখ্যা হার্ডকোড করতে হবে না। এই পুল অনুরোধে বিশদ । অন্য কথায়, এটি এমন কোডটিকে সক্ষম করে যা দেখতে এই রকম করে:

try:
    model = multi_gpu_model(model)
except:
    pass

তবে আরও স্পষ্ট করে বলতে গেলে আপনি এই জাতীয় কিছুতে আটকে থাকতে পারেন:

parallel_model = multi_gpu_model(model, gpus=None)

বোনাস :

আপনি যদি সত্যিই আপনার সমস্ত GPUs, বিশেষত NVIDIA- র ব্যবহার করছেন কিনা তা যাচাই করতে আপনি টার্মিনালে আপনার ব্যবহারগুলি পর্যবেক্ষণ করতে পারেন:

watch -n0.5 nvidia-smi

তথ্যসূত্র:


multi_gpu_model(model, gpus=None)কেবলমাত্র জিপিইউ রয়েছে এমন ক্ষেত্রে কি কাজ হবে? এটি জিপিইউ উপলব্ধ সংখ্যার সাথে স্বয়ংক্রিয়ভাবে মানিয়ে নিলে এটি দুর্দান্ত হবে।
সিএমসিডিগ্রাঙ্কাই

হ্যাঁ আমি মনে করি এটি 1 জিপিইউতে কাজ করে, github.com/keras-team/keras/pull/9226#issuecomment-361692460 দেখুন , তবে আপনার সতর্কতা অবলম্বন করা দরকার যে আপনার কোডটি একটি সাধারণ মডেলের পরিবর্তে মাল্টি_জিপিউ_মোডেলে চালানোর জন্য অভিযোজিত হয়েছে । বেশিরভাগ ক্ষেত্রে এটি সম্ভবত কিছু যায় আসে না, তবে আপনি যদি কিছু মধ্যবর্তী স্তরের আউটপুট নেওয়ার মতো কিছু করতে চলেছেন তবে আপনাকে সেই অনুযায়ী কোড করা দরকার।
weiji14

মাল্টি জিপিইউ মডেল পার্থক্যের কোনও রেফারেন্স আপনার কাছে রয়েছে?
সিএমসিডিগ্রাগনকাই


এই রেফারেন্সটি দুর্দান্ত ছিল @ ওয়েইজি 14। তবে আমি কীভাবে এটি অনুমানের জন্য কাজ করে তাতে আগ্রহী। কেরাস কি কোনওভাবে উপলভ্য মডেলের প্রতিরূপগুলিতে সমান বা রাউন্ড রবিনের সময়সূচী বিভক্ত করে দেয়?
সিএমসিডিগ্রাগনকাই

4
  1. টেনসরফ্লো এর জন্য:

টেনসরফ্লো জিপিইউ ব্যবহার করে

কীভাবে ব্যবহৃত হয় সে সম্পর্কে এখানে নমুনা কোড দেওয়া হয়েছে, সুতরাং প্রতিটি কাজের জন্য ডিভাইস / ডিভাইস সহ তালিকাটি নির্দিষ্ট করা হয়েছে:

# 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 সিপিইউর জন্য উপস্থিত থাকলেও জিপিইউ ডিফল্টরূপে জিপিইউ ব্যবহার করবে (যদি উপস্থিত জিপিইউ সমর্থিত থাকে)। সুতরাং আপনি কেবল লুপের জন্য একটি করতে পারেন: "ডি এর জন্য ['/ জিপিইউ: 1', '/ জিপিইউ: 2', '/ জিপিইউ: 3' ... '' / জিপিইউ: 8 ',]:" এবং "tf.device (d)" এ আপনার সমস্ত উদাহরণ জিপিইউ সংস্থান অন্তর্ভুক্ত করা উচিত। সুতরাং tf.device () আসলে ব্যবহৃত হবে।

একাধিক জিপিইউতে স্কেলিং কেরাস মডেল প্রশিক্ষণ

  1. Keras

আরগস.নাম_জিপাসের চেয়ে এমএক্সনেট ব্যবহার করে কেরাসের জন্য , যেখানে 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

সমস্ত উবারের শীর্ষে হোরভোডকে সম্প্রতি খোলা হয়েছে এবং আমি মনে করি দুর্দান্ত:

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

মূলত, আপনি নিম্নলিখিত উদাহরণটির উদাহরণ নিতে পারেন। আপনার কেবলমাত্র কেরাস আমদানির পরে সিপিইউ এবং জিপিইউ ব্যবহারের মান উল্লেখ করা দরকার।

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))

অবশেষে, আপনি উচ্চতর সীমাতে কাজ করে না তবে ব্যবহারের মান হ্রাস করতে পারেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.