TensorFlow 1.8 - Using GPUs

GPU का उपयोग करना




tensorflow

GPU का उपयोग करना

समर्थित उपकरण

एक विशिष्ट प्रणाली पर, कई कंप्यूटिंग डिवाइस हैं। TensorFlow में, समर्थित डिवाइस प्रकार CPU और GPU । उन्हें strings रूप में दर्शाया जाता है। उदाहरण के लिए:

  • "/cpu:0" : आपकी मशीन का CPU।
  • "/device:GPU:0" : यदि आपके पास एक है, तो आपके मशीन का GPU।
  • "/device:GPU:1" : आपकी मशीन का दूसरा GPU आदि।

यदि TensorFlow ऑपरेशन में CPU और GPU दोनों कार्यान्वयन हैं, तो GPU डिवाइस को प्राथमिकता दी जाएगी, जब ऑपरेशन किसी डिवाइस को सौंपा गया हो। उदाहरण के लिए, matmul में सीपीयू और जीपीयू कर्नेल दोनों हैं। डिवाइस के साथ सिस्टम पर cpu:0 और gpu:0 , gpu:0 का चयन matmul चलाने के लिए किया matmul

लॉगिंग डिवाइस प्लेसमेंट

यह पता लगाने के लिए कि आपके ऑपरेशन और टेंसर को कौन से उपकरण असाइन किए गए हैं, True सेट log_device_placement कॉन्फ़िगरेशन विकल्प के साथ सत्र बनाएं।

# Creates a graph.
a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 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(c))

आपको निम्न आउटपुट देखना चाहिए:

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus
id: 0000:05:00.0
b: /job:localhost/replica:0/task:0/device:GPU:0
a: /job:localhost/replica:0/task:0/device:GPU:0
MatMul: /job:localhost/replica:0/task:0/device:GPU:0
[[ 22.  28.]
 [ 49.  64.]]

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

यदि आप अपने लिए चुने गए उपकरण के बजाय अपनी पसंद के डिवाइस पर चलाने के लिए एक विशेष ऑपरेशन चाहते हैं, तो आप डिवाइस संदर्भ बनाने के लिए with tf.device उपयोग कर सकते हैं जैसे कि उस संदर्भ में सभी ऑपरेशनों में एक ही डिवाइस असाइनमेंट होगा।

# Creates a graph.
with tf.device('/cpu:0'):
  a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
  b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
c = tf.matmul(a, b)
# 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(c))

आप देखेंगे कि अब a और b को cpu:0 को सौंपा गया है cpu:0 । चूंकि MatMul ऑपरेशन के लिए एक उपकरण स्पष्ट रूप से निर्दिष्ट नहीं किया गया था, इसलिए TensorFlow रनटाइम ऑपरेशन और उपलब्ध उपकरणों ( gpu:0 इस उदाहरण में) के आधार पर एक का चयन करेगा और यदि आवश्यक हो तो उपकरणों के बीच स्वचालित रूप से टेनर्स की प्रतिलिपि बनाएँ।

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K40c, pci bus
id: 0000:05:00.0
b: /job:localhost/replica:0/task:0/cpu:0
a: /job:localhost/replica:0/task:0/cpu:0
MatMul: /job:localhost/replica:0/task:0/device:GPU:0
[[ 22.  28.]
 [ 49.  64.]]

जीपीयू मेमोरी वृद्धि की अनुमति

डिफ़ॉल्ट रूप से, TensorFlow प्रक्रिया में दिखाई देने वाली सभी GPU ( CUDA_VISIBLE_DEVICES अधीन) के लगभग सभी GPU मेमोरी को CUDA_VISIBLE_DEVICES करता है। यह स्मृति विखंडन को कम करके उपकरणों पर अपेक्षाकृत कीमती GPU स्मृति संसाधनों का अधिक कुशलता से उपयोग करने के लिए किया जाता है।

कुछ मामलों में यह प्रक्रिया के लिए वांछनीय है कि केवल उपलब्ध मेमोरी का एक सबसेट आवंटित करें, या केवल इस प्रक्रिया के लिए आवश्यक के रूप में मेमोरी के उपयोग को बढ़ाएं। TensorFlow इसे नियंत्रित करने के लिए सत्र पर दो कॉन्फ़िगर विकल्प प्रदान करता है।

पहला है allow_growth विकल्प, जो रनटाइम एलोकेशन के आधार पर केवल GPU मेमोरी के रूप में आवंटित करने का प्रयास करता है: यह बहुत कम मेमोरी आवंटित करना शुरू कर देता है, और जैसे ही सत्र चलता है और अधिक GPU मेमोरी की आवश्यकता होती है, हमें GPU मेमोरी क्षेत्र की आवश्यकता होती है। TensorFlow प्रक्रिया। ध्यान दें कि हम मेमोरी रिलीज़ नहीं करते हैं, क्योंकि इससे मेमोरी ख़राब हो सकती है। इस विकल्प को चालू करने के लिए, विन्यासप्रणाली में विकल्प को निम्न द्वारा सेट करें:

config = tf.ConfigProto()
config.gpu_options.allow_growth = True
session = tf.Session(config=config, ...)

दूसरी विधि per_process_gpu_memory_fraction विकल्प है, जो मेमोरी की समग्र मात्रा का अंश निर्धारित करता है कि प्रत्येक दृश्यमान GPU आवंटित किया जाना चाहिए। उदाहरण के लिए, आप बता सकते हैं कि TensorFlow द्वारा केवल प्रत्येक GPU की कुल मेमोरी का 40% आवंटित किया जा सकता है:

config = tf.ConfigProto()
config.gpu_options.per_process_gpu_memory_fraction = 0.4
session = tf.Session(config=config, ...)

यह उपयोगी है यदि आप वास्तव में TensorFlow प्रक्रिया के लिए उपलब्ध GPU मेमोरी की मात्रा को बाध्य करना चाहते हैं।

मल्टी-जीपीयू सिस्टम पर सिंगल जीपीयू का उपयोग करना

यदि आपके सिस्टम में एक से अधिक GPU हैं, तो न्यूनतम आईडी वाला GPU डिफ़ॉल्ट रूप से चुना जाएगा। यदि आप किसी भिन्न GPU पर चलना चाहते हैं, तो आपको प्राथमिकता स्पष्ट रूप से निर्दिष्ट करनी होगी:

# Creates a graph.
with tf.device('/device:GPU:2'):
  a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
  b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
  c = tf.matmul(a, b)
# 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(c))

यदि आपके द्वारा निर्दिष्ट डिवाइस मौजूद नहीं है, तो आपको InvalidArgumentError मिलेगा:

InvalidArgumentError: Invalid argument: Cannot assign a device to node 'b':
Could not satisfy explicit device specification '/device:GPU:2'
   [[Node: b = Const[dtype=DT_FLOAT, value=Tensor<type: float shape: [3,2]
   values: 1 2 3...>, _device="/device:GPU:2"]()]]

यदि आप TensorFlow को स्वचालित रूप से एक मौजूदा और समर्थित डिवाइस का चयन करना चाहते हैं, तो संचालन को चलाने के लिए जब कोई निर्दिष्ट नहीं होता है, तो आप सत्र बनाते समय कॉन्फ़िगरेशन विकल्प में allow_soft_placement True सेट कर सकते हैं।

# Creates a graph.
with tf.device('/device:GPU:2'):
  a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
  b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
  c = tf.matmul(a, b)
# Creates a session with allow_soft_placement and log_device_placement set
# to True.
sess = tf.Session(config=tf.ConfigProto(
      allow_soft_placement=True, log_device_placement=True))
# Runs the op.
print(sess.run(c))

कई GPU का उपयोग करना

यदि आप कई GPU पर TensorFlow चलाना चाहते हैं, तो आप अपने मॉडल का निर्माण एक मल्टी-टॉवर फैशन में कर सकते हैं, जहाँ प्रत्येक टॉवर को एक अलग GPU दिया जाता है। उदाहरण के लिए:

# Creates a graph.
c = []
for d in ['/device:GPU:2', '/device: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))

आपको निम्न आउटपुट दिखाई देगा।

Device mapping:
/job:localhost/replica:0/task:0/device:GPU:0 -> device: 0, name: Tesla K20m, pci bus
id: 0000:02:00.0
/job:localhost/replica:0/task:0/device:GPU:1 -> device: 1, name: Tesla K20m, pci bus
id: 0000:03:00.0
/job:localhost/replica:0/task:0/device:GPU:2 -> device: 2, name: Tesla K20m, pci bus
id: 0000:83:00.0
/job:localhost/replica:0/task:0/device:GPU:3 -> device: 3, name: Tesla K20m, pci bus
id: 0000:84:00.0
Const_3: /job:localhost/replica:0/task:0/device:GPU:3
Const_2: /job:localhost/replica:0/task:0/device:GPU:3
MatMul_1: /job:localhost/replica:0/task:0/device:GPU:3
Const_1: /job:localhost/replica:0/task:0/device:GPU:2
Const: /job:localhost/replica:0/task:0/device:GPU:2
MatMul: /job:localhost/replica:0/task:0/device:GPU:2
AddN: /job:localhost/replica:0/task:0/cpu:0
[[  44.   56.]
 [  98.  128.]]

Cifar10 ट्यूटोरियल एक अच्छा उदाहरण है जिसमें बताया गया है कि कई GPU के साथ प्रशिक्षण कैसे किया जाता है।