في حالات ارتفاع ضغط الذاكرة ، يعد ما يلي أمرًا شائعًا:
بسبب ضغط الذاكرة ، فإن الحل الشائع هو القيام أولاً بما يلي:
s = torch.load('my_file.pt', map_location=lambda storage, loc: storage)
ثم قم بتحميل s
إلى model
.
هذا سيناريو شائع جدًا يجب أن نكون قادرين على تجنبه ، وقد يكون لهذا السيناريو بعض المزالق: ما يحدث في نماذج وحدة معالجة الرسومات الجزئية ، وما يحدث في نماذج وحدة معالجة الرسومات المتعددة ...
إذا أخذ load_state_dict اسم ملف مباشرةً ، فيمكنه حذف مخازن المعلمات الموجودة وتعيينها على القائمة الجديدة أثناء التنقل ، وبالتالي لا تتطلب ذاكرة إضافية.
الأمر نفسه ينطبق على محسن state_dicts. بالنسبة لبعض المحسّنين مثل Adagrad ، تكون نقاط التفتيش كبيرة ، ويمكن أن يكون لدينا نفس حالة ضغط الذاكرة. لا تمتلك أدوات تحسين الأداء حتى .cuda()
، لذلك يتعين علينا أولاً تحميل state_dict يدويًا على وحدة المعالجة المركزية ، ثم نسخ الأجزاء يدويًا إلى وحدة معالجة الرسومات.
واجهت هذا أثناء مساعدة aszlam اليوم.
إذا كان load_state_dict
يأخذ اسم ملف ، فيجب أن نسمح أيضًا للمعلمة map_location
. الموقف الشائع بالنسبة لي هو حفظ نقطة تفتيش على آلة الكتلة ثم تحميلها على جهاز macbook الخاص بي (لذلك أحتاج إلى تحميل المعلمات على وحدة المعالجة المركزية)
أنا و szagoruyko معجبان بتنسيق HDF5 للنماذج المتسلسلة ، ربما إذا كان بإمكانه التوافق بشكل جيد مع هذا الاقتراح
التعليق الأكثر فائدة
إذا كان
load_state_dict
يأخذ اسم ملف ، فيجب أن نسمح أيضًا للمعلمةmap_location
. الموقف الشائع بالنسبة لي هو حفظ نقطة تفتيش على آلة الكتلة ثم تحميلها على جهاز macbook الخاص بي (لذلك أحتاج إلى تحميل المعلمات على وحدة المعالجة المركزية)