2016-01-11 13 views
6

मैं विभिन्न थेनो मॉडल के साथ प्रयोग कर रहा हूं और लगातार बढ़ती अनुक्रम लंबाई के पाठ्यक्रम का उपयोग कर रहा हूं। GPU की स्मृति को भरने के लिए किसी भी अनुक्रम लंबाई और मॉडल के लिए बैच आकार को कितना बड़ा बनाने के लिए मैं समय से पहले भविष्यवाणी कैसे कर सकता हूं?थेनो में जीपीयू मेमोरी उपयोग की गणना कैसे करें?

मामलों को और भी खराब बनाने के लिए, अगर मैंने कभी गलती से बहुत मेमोरी का उपयोग किया है, तो मुझे एक मेमोरी त्रुटि मिलती है और जीपीयू पर स्मृति मुक्त नहीं होती है, मुझे स्मृति मुक्त करने की प्रक्रिया को पुनरारंभ करने की आवश्यकता होती है, और कोशिश करने से पहले मेरा नेटवर्क खो देता है एक नया बैच आकार। चूंकि यह त्रुटि अप्राप्य है, अपवाद तक बैच आकार को बढ़ाने और फिर पीछे हटना मुश्किल है।

उत्तर

7

मान लें कि आप GPU पर संग्रहीत तत्वों की संख्या को जानते हैं, आप आसानी से उन तत्वों को संग्रहीत करने के लिए आवश्यक स्मृति की मात्रा की गणना कर सकते हैं।

एक साधारण उदाहरण:

import numpy as np 
import theano.tensor as T 
T.config.floatX = 'float32' 
dataPoints = np.random.random((5000, 256 * 256)).astype(T.config.floatX) 
#float32 data type requires 4 bytes 
sizeinGBs = 5000 * 256 * 256 * 4/1024./1024/1024 + (some small over-head constant) 
print "Data will need %2f GBs of free memory" % sizeInGB 

से अधिक सिर निरंतर मानते हुए 0 प्रिंट होगा:

>>> Data will need 1.22 GBs of free memory 

आप एक NVIDIA ग्राफिक्स कार्ड का उपयोग कर रहे हैं, तो और फिर आपकी मशीन पर CUDA स्थापित किया है तुम कोड की निम्न पंक्ति का उपयोग करके आसानी से अपने जीपीयू पर मुफ्त मेमोरी की कुल राशि प्राप्त कर सकते हैं:

import theano.sandbox.cuda.basic_ops as sbcuda 
import numpy as np 
import theano.tensor as T 
T.config.floatX = 'float32' 
GPUFreeMemoryInBytes = sbcuda.cuda_ndarray.cuda_ndarray.mem_info()[0] 
freeGPUMemInGBs = GPUFreeMemoryInBytes/1024./1024/1024 
print "Your GPU has %s GBs of free memory" % str(freeGPUMemInGBs) 
#An operation is to be executed below 
testData = shared(np.random.random((5000, 256 * 256)).astype(T.config.floatX), borrow = True) 
print "The tasks above used %s GBs of your GPU memory. The available memory is %s GBs" % (str(freeGPUMemInGBs - GPUFreeMemoryInBytes/1024./1024/1024), str(GPUFreeMemoryInBytes/1024./1024/1024)) 

तो उत्पादन निम्नलिखित प्रारूप (मेरी मशीन के लिए यहाँ) में है:

>>> Your GPU has 11.2557678223 GBs of free memory 
>>> The tasks above used 1.22077941895 GBs of your GPU memory. The available memory is 10.0349884033 GBs 

मुक्त स्मृति की मात्रा की निगरानी और अपने मॉडल/डेटा के आकार की गणना आप बेहतर GPU स्मृति का उपयोग कर सकते हैं। हालांकि, memory fragmentation समस्या से अवगत रहें क्योंकि यह अप्रत्याशित रूप से MemoryError का कारण बन सकता है।

+1

बहुत बढ़िया उत्तर, धन्यवाद! – Will

+0

तो ऐसा लगता है कि सबसे विश्वसनीय तरीका आपके और दोनों के सुझावों को मर्ज करने जा रहा है। एक नया मॉडल चलाने से पहले, मैं विभिन्न लंबाई अनुक्रमों के लिए स्मृति उपयोग को मापूंगा और यह अनुमान लगाने के लिए उपयोग करूंगा कि अन्य अनुक्रम लंबाई के लिए कितनी मेमोरी का उपयोग किया जाएगा और इष्टतम बैच आकार निर्धारित करें। धन्यवाद –

2

ऐसा लगता है कि थानो के पास मॉडल के स्मृति आकार का अनुमान लगाने का कोई अंतर्निहित तरीका नहीं है। आपका सबसे अच्छा शर्त एक ज्ञात आकार के साथ अपने मॉडल का एक छोटा सबसेट बनाना है, और थिएनो मैनुअल में here वर्णित स्मृति अनुमान तकनीकों का उपयोग करना है।

हमें यह भी ध्यान में रखना होगा कि जीपीयू के अंदर हमारी वस्तुओं का प्रतिनिधित्व कैसे किया जाता है (उदाहरण के लिए हम float32 या float64 का उपयोग कर रहे हैं, उदाहरण के लिए, और GPU के अंदर प्रत्येक कितने बाइट्स लेते हैं)।

एक बार जब आप एक छोटे मॉडल के आकार का अनुमान लगा सकते हैं, तो आप इन अनुमानों को उचित सटीकता के साथ एक बड़े मॉडल के आकार में पेश कर सकते हैं। आपको अपना खुद का मेमोरी अनुमान फ़ंक्शन लिखने में सक्षम होना चाहिए जो पैरामीटर के रूप में कई सुविधाएं और अवलोकन, या टेंसर, या ग्राफ़ नोड्स ले सकता है और स्मृति उपयोग राशि देता है।

संबंधित मुद्दे