KOILA يحل
CUDA error: out of memory errorبلا مؤلم. قم بإصلاحه بسطر واحد فقط من التعليمات البرمجية ، ونسيه.

الفرع الرئيسي هو إعادة هيكل كامل للمشروع (وهو حاليًا فارغ في الغالب بسبب عدم وجود وقت كافٍ لإكماله). للاطلاع على رمز العمل ، يمكنك الخروج عن علامة v0.1.1 لإثبات المفهوم (لا يتمتع بدعم كامل على جميع العمليات وليس مناسبة للإنتاج). لاستخدامه ، تنزيل إصدار V0.1.1 هنا.
؟ يمنع CUDA error: out of memory error مع سطر واحد من التعليمات البرمجية.
⚗ يتراكم تلقائيًا التدرجات عندما تكون أحجام الدُفعات كبيرة جدًا.
؟ يقيم بتكاسل رمز Pytorch لحفظ قوة الحوسبة.
✂ ينقسم تلقائيًا على طول البعد الدُفعات إلى المزيد من أرقام GPU الصديقة (سلطات 2) لتسريع التنفيذ.
؟ الحد الأدنى من واجهة برمجة التطبيقات (لف جميع المدخلات ستكون كافية).
من قبل واجهت RuntimeError: CUDA error: out of memory ؟ كلنا نحب PyTorch بسبب سرعته وكفاءته وشفافيةه ، لكن هذا يعني أنه لا يفعل أشياء إضافية. أشياء مثل منع خطأ شائع للغاية كان يزعج العديد من المستخدمين منذ عام 2017.
تهدف هذه المكتبة إلى منع ذلك من خلال كونه غلافًا خفيفًا على PyTorch الأصلي. عندما يتم لف الموتر ، تحسب المكتبة تلقائيًا كمية ذاكرة GPU المتبقية وتستخدم حجم الدفعة المناسب ، مما يوفر للجميع من الاضطرار إلى ضبط حجم الدفعة يدويًا عند استخدام نموذج.
أيضًا ، تستخدم المكتبة تلقائيًا حجم الدُفعة الصحيح إلى GPU. هل تعلم أن استخدام دفعات أكبر لا يسرع دائمًا في المعالجة؟ يتم التعامل معها تلقائيًا في هذه المكتبة أيضًا.
نظرًا لأن كود Koila هو رمز PyTorch ، حيث يتم تشغيله PyTorch أسفل الغطاء ، يمكنك استخدام كلاهما معًا دون القلق التوافق.
أوه ، وكل ذلك في سطر 1 من الكود! ؟
Koila متاح على PYPI. للتثبيت ، قم بتشغيل الأمر التالي.
pip install koila الاستخدام ميت بسيط. على سبيل المثال ، لديك رمز PyTorch التالي (تم نسخه من البرنامج التعليمي لـ PyTorch )
تحديد الإدخال والتسمية والنموذج:
# A batch of MNIST image
input = torch . randn ( 8 , 28 , 28 )
# A batch of labels
label = torch . randn ( 0 , 10 , [ 8 ])
class NeuralNetwork ( Module ):
def __init__ ( self ):
super ( NeuralNetwork , self ). __init__ ()
self . flatten = Flatten ()
self . linear_relu_stack = Sequential (
Linear ( 28 * 28 , 512 ),
ReLU (),
Linear ( 512 , 512 ),
ReLU (),
Linear ( 512 , 10 ),
)
def forward ( self , x ):
x = self . flatten ( x )
logits = self . linear_relu_stack ( x )
return logitsتحديد وظيفة الخسارة ، وحساب الإخراج والخسائر.
loss_fn = CrossEntropyLoss ()
# Calculate losses
out = nn ( t )
loss = loss_fn ( out , label )
# Backward pass
nn . zero_grad ()
loss . backward () نعم. كيفية تكييف الكود لاستخدام ميزات Koila ؟
يمكنك إضافة سطر الكود هذا (اعتبارًا من V0.1.1):
# Wrap the input tensor and label tensor.
# If a batch argument is provided, that dimension of the tensor would be treated as the batch.
# In this case, the first dimension (dim=0) is used as batch's dimension.
( input , label ) = lazy ( input , label , batch = 0 )منتهي. لن تنفد الذاكرة مرة أخرى.
CUDA error: out of memory بشكل عام في التمرير الأمامي ، لأن المتغيرات المؤقتة ستحتاج إلى حفظها في الذاكرة.
Koila هو غلاف رفيع حول PyTorch . إنه مستوحى من التقييم الثابت/الكسول في TensorFlow. من خلال إنشاء الرسم البياني أولاً ، وتشغيل النموذج فقط عندما يكون للضرورة الوصول إلى جميع المعلومات بالضرورة لتحديد مقدار الموارد التي تحتاجها حقًا لحساب النموذج.
من حيث استخدام الذاكرة ، لا يلزم سوى أشكال المتغيرات المؤقتة لحساب استخدام الذاكرة لتلك المتغيرات المستخدمة في النموذج . على سبيل المثال ، يأخذ + في اثنين من الموترات ذات الأحجام المتساوية ، ويخرج توتر مع حجم يساوي حجم الإدخال ، ويأخذ log في موتر واحد ، ويخرج موتر آخر بنفس الشكل. البث يجعل الأمر أكثر تعقيدًا من ذلك ، لكن الأفكار العامة هي نفسها. من خلال تتبع كل هذه الأشكال ، يمكن للمرء بسهولة معرفة مقدار الذاكرة المستخدمة في تمريرة للأمام. وحدد حجم الدُفعة الأمثل وفقًا لذلك.
لا . في الواقع ، فإن حساب الأشكال وحساب الحجم واستخدام الذاكرة يبدو وكأنه الكثير من العمل. ومع ذلك ، ضع في اعتبارك أنه حتى النموذج العملاق مثل GPT-3 ، الذي يحتوي على 96 طبقة ، يحتوي على بضع مئات فقط من العقد في الرسم البياني الحاسوي. نظرًا لأن خوارزميات Koila تعمل في الوقت الخطي ، فسيتمكن أي جهاز كمبيوتر حديث من التعامل مع رسم بياني مثل هذا على الفور.
يتم إنفاق معظم الحوسبة على حساب الموتر الفردي ، ونقل الموترات عبر الأجهزة. وتضع في اعتبارك أن هذه الشيكات تحدث في الفانيليا PyTorch على أي حال. لذلك لا ، لا تبطئ على الإطلاق.
تم تسمية هذا المشروع في الأصل كوالا ، وأكثر الأنواع السهلة في العالم ، وهذا المشروع يدور حول التقييم البطيء للموتورات. ومع ذلك ، نظرًا لأن هذا الاسم يؤخذ على PYPI ، لم يكن لدي أي خيار سوى استخدام اسم آخر. Koila هي كلمة صاغها لي ، وضوحا بشكل مشابه لفويلا (إنها كلمة فرنسية) ، لذلك يبدو مثل كوالا.
إذا كنت تحب ما تراه ، فيرجى التفكير في إعطاء هذا النجم (★)!
لماذا مررت بالمشكلة وبناء هذا المشروع ، على الرغم من الكثير من المكتبات المماثلة على الإنترنت؟
البحث حجم الدُفعات ليس جديدًا. في الواقع ، فإن البرق الشعبي العظيم لديه.
تم دمج البحث في حجم الدُفعة من Lightning بعمق في نظامه الإيكولوجي الخاص. يجب عليك استخدام DataLoader الخاص به ، والفئة الفرعية من طرزها ، وتدريب النماذج الخاصة بك وفقًا لذلك. على الرغم من أن إعادة إنشاء مهام التعلم الخاضعة للإشراف لاستخدام البرق أمر سهل نسبيًا ، إلا أنه من المؤلم حقًا أن تفعل الشيء نفسه مع قاعدة رمز التعلم التعزيز ، حيث يكون التفاعل مع البيئة أمرًا لا بد منه.
بالمقارنة ، نظرًا لأن Koila عبارة عن غلاف Pytorch خفيف الوزن للغاية ، فإنه يعمل عندما يعمل Pytorch ، وبالتالي توفير أقصى قدر من المرونة والحد الأدنى من التغييرات في التعليمات البرمجية الحالية.
ومع ذلك ، لاحظ أنه في الحالة التي تكتب فيها رمزًا جديدًا ، ينصح Lightning لأنه يفرض نمطًا أفضل من نمط التعليمات البرمجية ، والذي من شأنه أن يستفيد من النموذج على المدى الطويل.
وبالمثل ، فإن تمرير موتر فارغ لإنشاء رسم بياني حسابي (ويعرف أيضًا باسم الرسم البياني الثابت ) ليس فكرة جديدة ، ولكن تم استكشافه تمامًا في مكتبة TensorFlow الشائعة ، ومكتبة PyTorch Wrapper. تعاني هذه المكتبات من حقيقة أن برامج تصحيح الأخطاء فيها معقدة بشكل غير ضروري. على سبيل المثال ، كانت TensorFlow معروفة بسهولة نشرها ولكن الألم في التطوير ، لدرجة أن المستخدمين تحولوا إلى PyTorch . أثناء تصحيح الأخطاء ، يحب الناس رؤية ما هو داخل متغير ، لمعرفة ما إذا كان يحتوي على قيمة غير صحيحة. ومع ذلك ، نظرًا لأن الرسوم البيانية الثابتة تحدد العلاقات فقط ، فإن القيم غير محسوبة ، مما يجعل تصحيح الأخطاء صعبًا.
يحل Koila ذلك عن طريق التقييم بفارغ الصبر عند تحويله إلى سلاسل أو أعداد صحيحة أو أي قيم بيثون. يمكّن ذلك تصحيح الأخطاء السلس مع الحفاظ على القدرة على أداء إدارة الذاكرة التي لا تتوفر ببساطة لبرنامج PyTorch بشكل مستقيم إلى الأمام ، والذي يخصص بشكل ديناميكي (عند الحاجة) الذاكرة وتحررها أثناء الطيران.
Tensor S و LazyTensor S). يعمل الرمز في العديد من الحالات ، لكنه لا يزال عملًا مستمرًا. هذه ليست (بعد) مكتبة متوافقة تمامًا مع PyTorch بسبب الوقت المحدود. تجنب استخدامه في بيئات الإنتاج!
تؤخذ الانفتاح والشمولية على محمل الجد. الرمز متاح بموجب ترخيص Apache. يرجى اتباع مدونة السلوك التالية.