একটি জিপিইউ ব্যবহার করুন

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub-এ উৎস দেখুন নোটবুক ডাউনলোড করুন

TensorFlow কোড, এবং tf.keras মডেলগুলি স্বচ্ছভাবে একটি একক GPU-তে চলবে কোনো কোড পরিবর্তনের প্রয়োজন নেই৷

এক বা একাধিক মেশিনে একাধিক GPU-তে চালানোর সবচেয়ে সহজ উপায় হল ডিস্ট্রিবিউশন স্ট্র্যাটেজি ব্যবহার করা।

এই নির্দেশিকাটি সেই ব্যবহারকারীদের জন্য যারা এই পদ্ধতিগুলি চেষ্টা করেছেন এবং দেখেছেন যে তাদের টেনসরফ্লো কীভাবে GPU ব্যবহার করে তার সূক্ষ্ম নিয়ন্ত্রণের প্রয়োজন। একক এবং মাল্টি-জিপিইউ পরিস্থিতিগুলির জন্য পারফরম্যান্সের সমস্যাগুলি কীভাবে ডিবাগ করতে হয় তা শিখতে, অপ্টিমাইজ টেনসরফ্লো জিপিইউ পারফরম্যান্স গাইডটি দেখুন।

সেটআপ

আপনার লেটেস্ট TensorFlow gpu রিলিজ ইনস্টল করা আছে তা নিশ্চিত করুন।

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
Num GPUs Available:  1

ওভারভিউ

TensorFlow CPU এবং GPU সহ বিভিন্ন ধরণের ডিভাইসে চলমান গণনা সমর্থন করে। সেগুলিকে স্ট্রিং শনাক্তকারী দিয়ে উপস্থাপন করা হয় উদাহরণস্বরূপ:

  • "/device:CPU:0" : আপনার মেশিনের CPU।
  • "/GPU:0" : আপনার মেশিনের প্রথম GPU-এর জন্য শর্ট-হ্যান্ড নোটেশন যা TensorFlow-এ দৃশ্যমান।
  • "/job:localhost/replica:0/task:0/device:GPU:1" : আপনার মেশিনের দ্বিতীয় GPU-এর সম্পূর্ণ যোগ্য নাম যা TensorFlow-এ দৃশ্যমান।

যদি একটি TensorFlow অপারেশনে CPU এবং GPU উভয়ই বাস্তবায়ন থাকে, ডিফল্টরূপে, অপারেশনটি বরাদ্দ করা হলে GPU ডিভাইসটিকে অগ্রাধিকার দেওয়া হয়। উদাহরণস্বরূপ, tf.matmul এর CPU এবং GPU কার্নেল উভয়ই রয়েছে এবং CPU:0 এবং GPU:0 ডিভাইস সহ একটি সিস্টেমে, GPU:0 ডিভাইসটিকে tf.matmul চালানোর জন্য নির্বাচিত করা হয়েছে যদি না আপনি এটিকে অন্য ডিভাইসে চালানোর জন্য স্পষ্টভাবে অনুরোধ করেন।

যদি একটি TensorFlow অপারেশনে কোন সংশ্লিষ্ট GPU বাস্তবায়ন না থাকে, তাহলে অপারেশনটি CPU ডিভাইসে ফিরে আসে। উদাহরণস্বরূপ, যেহেতু tf.cast এর শুধুমাত্র একটি CPU কার্নেল রয়েছে, CPU:0 এবং GPU:0 ডিভাইস সহ একটি সিস্টেমে, CPU:0 ডিভাইসটি tf.cast চালানোর জন্য নির্বাচন করা হয়েছে, এমনকি যদি GPU:0 ডিভাইসে চালানোর অনুরোধ করা হয় .

লগিং ডিভাইস বসানো

আপনার অপারেশন এবং টেনসরগুলি কোন ডিভাইসে বরাদ্দ করা হয়েছে তা খুঁজে বের করতে, আপনার প্রোগ্রামের প্রথম বিবৃতি হিসাবে tf.debugging.set_log_device_placement(True) । ডিভাইস বসানো লগিং সক্ষম করার ফলে কোনো টেনসর বরাদ্দ বা অপারেশন প্রিন্ট করা হয়।

tf.debugging.set_log_device_placement(True)

# Create some tensors
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)

print(c)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

উপরের কোডটি একটি ইঙ্গিত মুদ্রণ করবে যে MatMul opটি GPU:0 0-তে সম্পাদিত হয়েছিল।

ম্যানুয়াল ডিভাইস বসানো

আপনার জন্য স্বয়ংক্রিয়ভাবে যা নির্বাচিত হয়েছে তার পরিবর্তে আপনি যদি আপনার পছন্দের একটি ডিভাইসে একটি নির্দিষ্ট অপারেশন চালাতে চান তবে আপনি একটি ডিভাইসের প্রসঙ্গ তৈরি করতে with tf.device ব্যবহার করতে পারেন এবং সেই প্রসঙ্গের মধ্যে থাকা সমস্ত ক্রিয়াকলাপ একই মনোনীত ডিভাইসে চলবে .

tf.debugging.set_log_device_placement(True)

# Place tensors on the CPU
with tf.device('/CPU:0'):
  a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
  b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])

# Run on the GPU
c = tf.matmul(a, b)
print(c)
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

আপনি দেখতে পাবেন যে এখন a এবং b CPU:0 এ বরাদ্দ করা হয়েছে। যেহেতু MatMul অপারেশনের জন্য একটি ডিভাইস স্পষ্টভাবে নির্দিষ্ট করা হয়নি, তাই TensorFlow রানটাইম অপারেশন এবং উপলব্ধ ডিভাইসগুলির উপর ভিত্তি করে একটি বেছে নেবে (এই উদাহরণে GPU:0 ) এবং প্রয়োজনে ডিভাইসগুলির মধ্যে স্বয়ংক্রিয়ভাবে টেনসর কপি করবে।

GPU মেমরি বৃদ্ধি সীমিত করা

ডিফল্টরূপে, টেনসরফ্লো প্রক্রিয়াটি দৃশ্যমান সমস্ত GPU-এর ( CUDA_VISIBLE_DEVICES ) প্রায় সমস্ত GPU মেমরিকে ম্যাপ করে৷ মেমরি ফ্র্যাগমেন্টেশন কমিয়ে ডিভাইসে তুলনামূলকভাবে মূল্যবান GPU মেমরি রিসোর্সগুলিকে আরও দক্ষতার সাথে ব্যবহার করার জন্য এটি করা হয়। TensorFlow কে GPU-এর নির্দিষ্ট সেটে সীমাবদ্ধ করতে, tf.config.set_visible_devices পদ্ধতি ব্যবহার করুন।

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only use the first GPU
  try:
    tf.config.set_visible_devices(gpus[0], 'GPU')
    logical_gpus = tf.config.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
  except RuntimeError as e:
    # Visible devices must be set before GPUs have been initialized
    print(e)
1 Physical GPUs, 1 Logical GPU

কিছু ক্ষেত্রে প্রক্রিয়াটির জন্য শুধুমাত্র উপলব্ধ মেমরির একটি উপসেট বরাদ্দ করা বা প্রক্রিয়াটির প্রয়োজন অনুসারে মেমরির ব্যবহার বৃদ্ধি করা বাঞ্ছনীয়। TensorFlow এটি নিয়ন্ত্রণ করার জন্য দুটি পদ্ধতি প্রদান করে।

প্রথম বিকল্পটি হল tf.config.experimental.set_memory_growth এ কল করে মেমরি বৃদ্ধি চালু করা, যা রানটাইম বরাদ্দের জন্য যতটা প্রয়োজন ততটা GPU মেমরি বরাদ্দ করার চেষ্টা করে: এটি খুব কম মেমরি বরাদ্দ করা শুরু করে, এবং প্রোগ্রাম চালানোর সাথে সাথে আরও জিপিইউ মেমরি প্রয়োজন, টেনসরফ্লো প্রক্রিয়ার জন্য জিপিইউ মেমরি অঞ্চল প্রসারিত করা হয়েছে। মেমরি রিলিজ হয় না কারণ এটি মেমরি ফ্র্যাগমেন্টেশন হতে পারে। একটি নির্দিষ্ট GPU-এর জন্য মেমরি বৃদ্ধি চালু করতে, যেকোনো টেনসর বরাদ্দ করার আগে বা কোনো অপারেশন চালানোর আগে নিম্নলিখিত কোডটি ব্যবহার করুন।

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  try:
    # Currently, memory growth needs to be the same across GPUs
    for gpu in gpus:
      tf.config.experimental.set_memory_growth(gpu, True)
    logical_gpus = tf.config.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Memory growth must be set before GPUs have been initialized
    print(e)
Physical devices cannot be modified after being initialized

এই বিকল্পটি সক্রিয় করার আরেকটি উপায় হল পরিবেশগত পরিবর্তনশীল TF_FORCE_GPU_ALLOW_GROWTH কে true সেট করা। এই কনফিগারেশন প্ল্যাটফর্ম নির্দিষ্ট.

দ্বিতীয় পদ্ধতিটি হল tf.config.set_logical_device_configuration সহ একটি ভার্চুয়াল GPU ডিভাইস কনফিগার করা এবং GPU-তে বরাদ্দ করার জন্য মোট মেমরির একটি হার্ড লিমিট সেট করা।

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Restrict TensorFlow to only allocate 1GB of memory on the first GPU
  try:
    tf.config.set_logical_device_configuration(
        gpus[0],
        [tf.config.LogicalDeviceConfiguration(memory_limit=1024)])
    logical_gpus = tf.config.list_logical_devices('GPU')
    print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Virtual devices must be set before GPUs have been initialized
    print(e)
Virtual devices cannot be modified after being initialized

আপনি যদি TensorFlow প্রক্রিয়ায় উপলব্ধ GPU মেমরির পরিমাণ সত্যিকার অর্থে আবদ্ধ করতে চান তবে এটি কার্যকর। এটি স্থানীয় উন্নয়নের জন্য সাধারণ অভ্যাস যখন GPU অন্যান্য অ্যাপ্লিকেশন যেমন একটি ওয়ার্কস্টেশন GUI এর সাথে ভাগ করা হয়।

মাল্টি-জিপিইউ সিস্টেমে একটি একক GPU ব্যবহার করা

আপনার সিস্টেমে একাধিক GPU থাকলে, সর্বনিম্ন ID সহ GPU ডিফল্টরূপে নির্বাচন করা হবে। আপনি যদি একটি ভিন্ন GPU তে চালাতে চান, তাহলে আপনাকে স্পষ্টভাবে পছন্দ উল্লেখ করতে হবে:

tf.debugging.set_log_device_placement(True)

try:
  # Specify an invalid GPU device
  with tf.device('/device:GPU:2'):
    a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
    b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
    c = tf.matmul(a, b)
except RuntimeError as e:
  print(e)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0

আপনার নির্দিষ্ট করা ডিভাইসটি বিদ্যমান না থাকলে, আপনি একটি RuntimeError : .../device:GPU:2 unknown device পাবেন।

আপনি যদি চান যে TensorFlow স্বয়ংক্রিয়ভাবে একটি বিদ্যমান এবং সমর্থিত ডিভাইস বেছে নেবে যাতে নির্দিষ্ট করা না থাকে, তাহলে আপনি কল করতে পারেন tf.config.set_soft_device_placement(True)

tf.config.set_soft_device_placement(True)
tf.debugging.set_log_device_placement(True)

# Creates some tensors
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
c = tf.matmul(a, b)

print(c)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)

একাধিক GPU ব্যবহার করা

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

gpus = tf.config.list_physical_devices('GPU')
if gpus:
  # Create 2 virtual GPUs with 1GB memory each
  try:
    tf.config.set_logical_device_configuration(
        gpus[0],
        [tf.config.LogicalDeviceConfiguration(memory_limit=1024),
         tf.config.LogicalDeviceConfiguration(memory_limit=1024)])
    logical_gpus = tf.config.list_logical_devices('GPU')
    print(len(gpus), "Physical GPU,", len(logical_gpus), "Logical GPUs")
  except RuntimeError as e:
    # Virtual devices must be set before GPUs have been initialized
    print(e)
Virtual devices cannot be modified after being initialized

রানটাইমের জন্য একাধিক লজিক্যাল GPU পাওয়া গেলে, আপনি tf.distribute.Strategy বা ম্যানুয়াল প্লেসমেন্ট সহ একাধিক GPU ব্যবহার করতে পারেন।

tf.distribute.Strategy সহ

একাধিক GPU ব্যবহার করার জন্য সর্বোত্তম অনুশীলন হল tf.distribute.Strategy ব্যবহার করা। এখানে একটি সহজ উদাহরণ:

tf.debugging.set_log_device_placement(True)
gpus = tf.config.list_logical_devices('GPU')
strategy = tf.distribute.MirroredStrategy(gpus)
with strategy.scope():
  inputs = tf.keras.layers.Input(shape=(1,))
  predictions = tf.keras.layers.Dense(1)(inputs)
  model = tf.keras.models.Model(inputs=inputs, outputs=predictions)
  model.compile(loss='mse',
                optimizer=tf.keras.optimizers.SGD(learning_rate=0.2))
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Using MirroredStrategy with devices ('/job:localhost/replica:0/task:0/device:GPU:0',)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op RandomUniform in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Sub in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Mul in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AddV2 in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Fill in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Fill in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:CPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:CPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Fill in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:CPU:0
INFO:tensorflow:Reduce to /job:localhost/replica:0/task:0/device:CPU:0 then broadcast to ('/job:localhost/replica:0/task:0/device:CPU:0',).
Executing op ReadVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op Identity in device /job:localhost/replica:0/task:0/device:CPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op VarHandleOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op AssignVariableOp in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op NoOp in device /job:localhost/replica:0/task:0/device:GPU:0

এই প্রোগ্রামটি প্রতিটি GPU-তে আপনার মডেলের একটি অনুলিপি চালাবে, তাদের মধ্যে ইনপুট ডেটা বিভক্ত করবে, যা " ডেটা সমান্তরালতা " নামেও পরিচিত।

বিতরণ কৌশল সম্পর্কে আরও তথ্যের জন্য, এখানে গাইডটি দেখুন।

ম্যানুয়াল বসানো

tf.distribute.Strategy ডিভাইস জুড়ে গণনার প্রতিলিপি করে হুডের অধীনে কাজ করে। আপনি প্রতিটি GPU-তে আপনার মডেল তৈরি করে ম্যানুয়ালি প্রতিলিপি বাস্তবায়ন করতে পারেন। উদাহরণ স্বরূপ:

tf.debugging.set_log_device_placement(True)

gpus = tf.config.list_logical_devices('GPU')
if gpus:
  # Replicate your computation on multiple GPUs
  c = []
  for gpu in gpus:
    with tf.device(gpu.name):
      a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
      b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
      c.append(tf.matmul(a, b))

  with tf.device('/CPU:0'):
    matmul_sum = tf.add_n(c)

  print(matmul_sum)
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op _EagerConst in device /job:localhost/replica:0/task:0/device:GPU:0
Executing op MatMul in device /job:localhost/replica:0/task:0/device:GPU:0
tf.Tensor(
[[22. 28.]
 [49. 64.]], shape=(2, 2), dtype=float32)