GPU का उपयोग करें

TensorFlow.org पर देखें Google Colab में चलाएं GitHub पर स्रोत देखें नोटबुक डाउनलोड करें

TensorFlow कोड, और tf.keras मॉडल पारदर्शी रूप से एकल GPU पर चलेंगे, जिसमें किसी कोड परिवर्तन की आवश्यकता नहीं होगी।

एक या कई मशीनों पर कई GPU पर चलने का सबसे आसान तरीका, वितरण रणनीतियों का उपयोग करना है।

यह मार्गदर्शिका उन उपयोगकर्ताओं के लिए है, जिन्होंने इन तरीकों को आजमाया है और पाया है कि उन्हें इस बात पर बारीक नियंत्रण की आवश्यकता है कि TensorFlow GPU का उपयोग कैसे करता है। एकल और बहु-GPU परिदृश्यों के लिए प्रदर्शन समस्याओं को डीबग करने का तरीका जानने के लिए, ऑप्टिमाइज़ TensorFlow 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" : आपकी मशीन का सीपीयू।
  • "/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 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 पर निष्पादित किया गया था।

मैनुअल डिवाइस प्लेसमेंट

यदि आप चाहते हैं कि आपके लिए स्वचालित रूप से चयनित डिवाइस के बजाय आपकी पसंद के डिवाइस पर कोई विशेष ऑपरेशन चलाया जाए, तो आप डिवाइस संदर्भ बनाने के लिए 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 मेमोरी ग्रोथ को सीमित करना

डिफ़ॉल्ट रूप से, TensorFlow प्रक्रिया के लिए दृश्यमान सभी 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 मेमोरी की आवश्यकता होती है, GPU मेमोरी क्षेत्र को TensorFlow प्रक्रिया के लिए बढ़ाया जाता है। मेमोरी रिलीज़ नहीं होती है क्योंकि इससे मेमोरी फ़्रेग्मेंटेशन हो सकती है। किसी विशिष्ट 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 पर सेट करना है। यह कॉन्फ़िगरेशन प्लेटफ़ॉर्म विशिष्ट है।

दूसरी विधि वर्चुअल GPU डिवाइस को tf.config.set_logical_device_configuration के साथ कॉन्फ़िगर करना है और 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 का उपयोग करना

यदि आपके सिस्टम में एक से अधिक 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

एक बार रनटाइम के लिए कई लॉजिकल जीपीयू उपलब्ध हो जाने के बाद, आप tf.distribute.Strategy या मैन्युअल प्लेसमेंट के साथ कई GPU का उपयोग कर सकते हैं।

tf. 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)
प्लेसहोल्डर22