PyTorch मॉडल [पर्याप्त GPU मेमोरी के साथ] चलाने पर मुझे CUDA को मेमोरी से बाहर क्यों निकाला जाता है?

Aug 17 2020

मैं यह सवाल इसलिए पूछ रहा हूं क्योंकि मैं 8GB VRAM के साथ लैपटॉप पर अपने GTX 2070 पर एक सेगमेंटेशन नेटवर्क को सफलतापूर्वक प्रशिक्षित कर रहा हूं और मैं अपने डेस्कटॉप पीसी पर GTX 1080TI के साथ बिल्कुल समान कोड और बिल्कुल उसी सॉफ्टवेयर लाइब्रेरी का उपयोग करता हूं और यह अभी भी बाहर है याद।

ऐसा होने पर, ऐसा क्यों होता है:

  1. वही विंडोज 10 + CUDA 10.1 + CUDNN 7.6.5.32 + Nvidia चालक 418.96 (CUDA 10.1 के साथ आता है) दोनों लैपटॉप और पीसी पर हैं।

  2. यह तथ्य कि TensorFlow 2.3 के साथ प्रशिक्षण मेरे पीसी पर GPU पर आसानी से चलता है, फिर भी यह केवल PyTorch के साथ प्रशिक्षण के लिए मेमोरी आवंटित करने में विफल रहता है।

  3. PyTorch GPU को पहचानता है (कमांड के माध्यम से GTX 1080 TI को प्रिंट करता है): print(torch.cuda.get_device_name(0))

  4. इस कमांड को चलाने पर PyTorch मेमोरी आवंटित करता है: torch.rand(20000, 20000).cuda() #allocated 1.5GB of VRAM.

इसका क्या हल है?

जवाब

5 TimbusCalin Aug 17 2020 at 17:27

अधिकांश लोग (यहां तक ​​कि नीचे के धागे में) यह सुझाव देने के लिए कूदते हैं कि बैच_साइज़ कम होने से इस समस्या का समाधान होगा। वास्तव में, यह इस मामले में नहीं है। उदाहरण के लिए, किसी नेटवर्क के लिए 8GB वीआरएएम पर प्रशिक्षित करना और फिर भी 11 जीबी वीआरएएम पर प्रशिक्षित करने में विफल होना असंभव होगा, यह देखते हुए कि सिस्टम पर 11 जीबी वीआरएएम के साथ वीडियो मेमोरी का उपभोग करने वाले अन्य अनुप्रयोग नहीं थे और ठीक उसी कॉन्फ़िगरेशन स्थापित है। उपयोग किया गया।

मेरे मामले में ऐसा होने का कारण यह था कि, DataLoaderऑब्जेक्ट का उपयोग करते समय , मैंने workersपैरामीटर के लिए बहुत अधिक (12) मान निर्धारित किया था। मेरे मामले में इस मूल्य को घटाकर 4 करने से समस्या हल हो गई।

वास्तव में, यद्यपि धागे के निचले भाग पर, यूरासिएक द्वारा प्रदान किया गया उत्तर https://github.com/pytorch/pytorch/issues/16417#issuecomment-599137646 मुझे सही दिशा में इशारा किया।

समाधान: workersPyTorch में संख्या घटाएं DataLoader। हालांकि मुझे यह ठीक से समझ नहीं आया कि यह समाधान क्यों काम करता है, मुझे लगता है कि यह डेटा लाने के लिए पर्दे के पीछे पैदा होने वाले थ्रेड्स से संबंधित है; यह मामला हो सकता है कि, कुछ प्रोसेसर पर, ऐसी त्रुटि दिखाई देती है।