2016-04-29 11 views
13

में 'जीपीयू मेमोरी से बाहर चला गया' को कैसे हल कर सकता हूं, मैंने 2 सेंसर परतों और पूर्ण-पूर्ण परत के साथ टेंसरफ्लो में एमएनआईएसटी डेमो चलाया, मुझे एक संदेश मिला कि '2.5 9 जीआईबी आवंटित करने की कोशिश कर रहे मेमरी से बाहर चला गया' , लेकिन यह दिखाता है कि कुल मेमोरी 4.6 9 जीआईबी है, और फ्री मेमोरी 3.22 जीआईबी है, यह 2.5 9 जीआईबी के साथ कैसे रुक सकती है? और बड़े नेटवर्क के साथ, मैं जीपीयू मेमोरी कैसे प्रबंधित कर सकता हूं? मुझे केवल जीपीयू मेमोरी का सबसे अच्छा उपयोग करने के बारे में चिंता है और यह जानना है कि यह कैसे हुआ, स्मृतिमैं टेंसरफ्लो

+0

संभावित डुप्लिकेट: //stackoverflow.com/questions/34199233/how-to-prevent-tensorflow-from-allocating-the-totality-of-a-gpu-memory) –

+0

मैंने इसे पहले देखा, लेकिन यह पूर्व-आवंटित जीपीयू मेमोरी को संदर्भित करता है, स्मृति की कमी नहीं – Fangxin

उत्तर

7

यह पूर्व नहीं है। सबसे पहले आप देख सकते हैं कि यह आपके जीपीयू की निगरानी करके कितनी मेमोरी हो जाती है। उदाहरण के लिए यदि आपके पास nvidia gpu है तो आप इसे watch -n 1 nvidia-smi कमांड से देख सकते हैं। लेकिन ज्यादातर मामलों में यदि आपने जीपीयू मेमोरी का अधिकतम अंश सेट नहीं किया है, तो यह लगभग पूरी फ्री मेमोरी आवंटित करता है। आपकी समस्या आपके जीपीयू के लिए पर्याप्त स्मृति की कमी है। सीएनएन नेटवर्क पूरी तरह से भारी हैं। जब आप अपने नेटवर्क को खिलाने की कोशिश कर रहे हैं तो इसे अपने पूरे डेटा से न करें। कम बैच आकार में यह खिलाने की प्रक्रिया करें।

+4

मेरे पास एक बड़ा नेटवर्क (सीएनएन + एलएसटीएम) है। मेरा इनपुट डेटा आकार का है, batch_size = 5, (5x396x396) - यह एक 3 डी वॉल्यूम है। तो एक छोटे से बैच आकार। मैं जीटीएक्स 1070 पर 8 जीबी रैम के साथ चल रहा हूं, लेकिन मैं अभी भी स्मृति से बाहर हूं। क्या आपके पास कोई कामकाज है? कोई ट्यूटोरियल जो वर्कअराउंड की रूपरेखा देता है? –

+0

यह बैच आकार की वजह से नहीं हो सकता है। क्या आप इनपुट बैच बनाने के लिए किसी भी कतार का उपयोग कर रहे हैं (जैसे 'tf.train.shuffle_batch')? यदि ऐसा है तो कतार की क्षमता की जांच करें। – Nandeesh

8

मुझे जीटीएक्स 9 70 पर एक छोटे सीएनएन को प्रशिक्षित करते समय मेमोरी त्रुटियों से सामना करना पड़ रहा था। कुछ हद तक झुकाव के माध्यम से, मैंने पाया कि जीपीएसयू पर स्मृति (आवंटित करने के बजाय) की स्मृति आवंटित करने के लिए टेंसरफ्लो को बताकर मेरे सभी मुद्दों का समाधान हुआ । यह निम्नलिखित पायथन कोड का उपयोग कर पूरा किया जा सकता:

config = tf.ConfigProto() 
    config.gpu_options.allow_growth = True 
    sess = tf.Session(config = config) 

इससे पहले, TensorFlow हैं पूर्व आवंटित ~ GPU स्मृति के 90%। लेकिन, किसी अज्ञात कारण के लिए, जब मैंने नेटवर्क के आकार में वृद्धि की, तो बाद में यह स्मृति त्रुटियों से बाहर हो गया। उपर्युक्त कोड का उपयोग करके, अब मेरे पास ओओएम त्रुटियां नहीं हैं।

+0

यह मेरी स्क्रिप्ट पर काम करता है भले ही मैं कैमरे का उपयोग कर रहा हूं – Hong

2

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

टेंसरफ्लो इस पर नियंत्रण के लिए सत्र पर दो कॉन्फ़िगर विकल्प प्रदान करता है।

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

दूसरी विधि per_process_gpu_memory_fraction विकल्प है, जो कुल मात्रा के अंश का निर्धारण करती है:

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

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

[कैसे एक GPU स्मृति की समग्रता का आवंटन से tensorflow को रोकने के लिए?] (http के
संबंधित मुद्दे