Torchfix هي أداة تحليل ثابت رمز Python - مخطط مع إمكانيات Autofix - لمستخدمي Pytorch. يمكن استخدامه للعثور على مشكلات مثل استخدام وظائف Pytorch المنهكة والرموز غير العامة ، وتبني أفضل الممارسات Pytorch بشكل عام.
تم بناء Torchfix على https://github.com/instagram/libcst - مكتبة لمعالجة أشجار بناء الجملة الخرسانية. يتيح LIBCST "Codemods" (AutoFixes) بالإضافة إلى مشكلات الإبلاغ.
يمكن استخدام Torchfix كمساعد Flake8 (linting فقط) أو كبرنامج مستقل (مع Autofix متاح لمجموعة فرعية من انتهاكات LINT).
تحذير
حاليًا Torchfix في مرحلة إصدار بيتا ، لذلك لا يزال هناك الكثير من الحواف القاسية ويمكن أن تتغير العديد من الأشياء.
لتثبيت أحدث التعليمات البرمجية من GitHub ، clone/download https://github.com/pytorch-labs/torchfix وتركيب pip install . داخل الدليل.
لتثبيت إصدار إصدار من PYPI ، قم بتشغيل pip install torchfix .
بعد التثبيت ، سيكون Torchfix متاحًا كمساعد Flake8 ، لذلك سيقوم تشغيل Flake8 عادة بتشغيل Torchfix Linter.
لرؤية تحذيرات Torchfix فقط بدون بقية بياضات Flake8 ، يمكنك تشغيل flake8 --isolated --select=TOR0,TOR1,TOR2
يمكن أيضًا تشغيل Torchfix كبرنامج مستقل: torchfix . إضافة-المعلمة --fix لمحاولة تلقائي تلقائيًا بعض المشكلات (سيتم الكتابة فوق الملفات!) لمعرفة بعض معلومات التصحيح الإضافية ، إضافة-معلمة --show-stderr .
حذر
يرجى مراعاة أن Autofix هي آلية أفضل للجهد. بالنظر إلى الطبيعة الديناميكية لـ Python ، وخاصة حالة إصدار Beta لـ Torchfix ، من الصعب للغاية أن يكون لديك اليقين عند إجراء تغييرات على التعليمات البرمجية ، حتى بالنسبة للإصلاحات التافهة على ما يبدو.
يتم تمكين تحذيرات للقضايا المتعلقة بالرموز التي تبدأ بـ TOR0 و TOR1 و TOR2 بشكل افتراضي. قد تكون التحذيرات مع الرموز الأخرى صاخبة للغاية ، لذلك لم يتم تمكينها افتراضيًا. لتمكينهم ، استخدم خيارات تكوين Flake8 القياسية لوضع المكون الإضافي أو استخدام torchfix --select=ALL . لوضع مستقل.
إذا واجهت خطأ أو مشكلة أخرى مع Torchfix ، فيرجى تقديم مشكلة على https://github.com/pytorch-labs/torchfix/issues.
يتم تعيين رموز القواعد الجديدة بشكل تدريجي عبر الفئات التالية:
torch للأغراض العامة.pytorch/pytorch Repo ، يجب على المستخدمين الآخرين عدم استخدامها.يتم تمكين Tor0 و Tor1 و Tor2 بشكل افتراضي.
تم إهمال هذه الوظيفة منذ الإصدار 1.9 Pytorch ويتم إزالته الآن.
يتم إهمال torch.solve لصالح torch.linalg.solve . torch.linalg.solve solve قد عكس حججها ولا تُرجع معامل LU.
للحصول على عامل LU ، انظر torch.lu ، والذي يمكن استخدامه مع torch.lu_solve أو torch.lu_unpack .
X = torch.solve(B, A).solution يجب استبدال الحل بـ X = torch.linalg.solve(A, B) .
تم إهمال هذه الوظيفة منذ الإصدار 1.9 Pytorch ويتم إزالته الآن.
torch.symeig تم إهماله لصالح torch.linalg.eigh .
لقد تغير السلوك الافتراضي من استخدام الجزء الثلاثي العلوي من المصفوفة افتراضيًا لاستخدام الجزء الثلاثي السفلي.
L , _ = torch . symeig ( A , upper = upper )يجب استبداله بـ
L = torch . linalg . eigvalsh ( A , UPLO = 'U' if upper else 'L' )و
L , V = torch . symeig ( A , eigenvectors = True )يجب استبداله بـ
L , V = torch . linalg . eigh ( A , UPLO = 'U' if upper else 'L' )require_grad في المهمة. هل تقصد requires_grad ؟هذا هو خطأ إملائي شائع يمكن أن يؤدي إلى مشكلات في الأداء الصامت.
use_reentrant بشكل صريح إلى checkpoint القيمة الافتراضية لمعلمة use_reentrant في torch.utils.checkpoint يتم تغييرها من True إلى False . في غضون ذلك ، يجب تمرير القيمة بشكل صريح.
انظر هذا المنتدى منشور للحصول على التفاصيل.
انظر TOR001 .
تم إهمال هذه الوظيفة. استخدم torch.nn.utils.parametrizations.weight_norm الذي يستخدم واجهة برمجة تطبيقات المعلمة الحديثة. يتوافق weight_norm الجديد مع state_dict الناتج عن weight_norm القديم.
دليل الهجرة:
يتم الآن التعبير عن الحجم ( weight_g ) والاتجاه ( weight_v parametrizations.weight.original1 parametrizations.weight.original0 .
لإزالة تعيد التطبيع للوزن ، استخدم torch.nn.utils.parametrize.remove_parametrizations .
لم يعد يتم إعادة حساب الوزن مرة واحدة في الوحدة النمطية للأمام ؛ بدلاً من ذلك ، سيتم إعادة حسابه على كل وصول. لاستعادة السلوك القديم ، استخدم torch.nn.utils.parametrize.cached قبل استدعاء الوحدة النمطية المعنية.
تم إهمال هذه الوظيفة. استخدم torch.nn.attention.sdpa_kernel Manager بدلاً من ذلك.
دليل الترحيل: كل معلمة إدخال منطقية (تتخلف عن صواب ما لم يتم تحديدها) من sdp_kernel تتوافق مع SDPBackened . إذا كانت معلمة الإدخال صحيحة ، فيجب إضافة الواجهة الخلفية المقابلة إلى قائمة إدخال sdpa_kernel .
يتم إهمال هذه الوظيفة لصالح torch.linalg.multi_dot .
دليل الترحيل: يقبل multi_dot قائمة من اثنين أو أكثر من الموترات ، بينما قبلت chain_matmul توترات متعددة كوسائط إدخال. للترحيل ، قم بتحويل Tensors المتعددة في وسيطة chain_matmul إلى قائمة من اثنين أو أكثر من الموترات لمجموعة multi_dot .
مثال: استبدل torch.chain_matmul(a, b, c) مع torch.linalg.multi_dot([a, b, c]) .
تم إهمال torch.cholesky() لصالح torch.linalg.cholesky() .
دليل الهجرة:
L = torch.cholesky(A) يجب استبدال L = torch.linalg.cholesky(A) .L = torch.cholesky(A, upper=True) يجب استبدال L = torch.linalg.cholesky(A).mH تم إهمال torch.qr() لصالح torch.linalg.qr() .
دليل الهجرة:
Q, R = torch.qr(A) بـ Q, R = torch.linalg.qr(A) .some torch.qr mode معلمة سلسلة في torch.linalg.qr . التغيير المقابل في الاستخدام هو من Q, R = torch.qr(A, some=False) إلى Q, R = torch.linalg.qr(A, mode="complete") . يتم إهمال الوظيفة torch.range() لأن استخدامها غير متوافق مع نطاق Python المبني. بدلاً من ذلك ، استخدم torch.arange() لأنه ينتج قيمًا في [start, end) .
دليل الهجرة:
torch.range(start, end) ينتج قيمًا في نطاق [start, end] . لكن torch.arange(start, end) ينتج قيمًا في [start, end) . لحجم الخطوة 1 ، ترحيل الاستخدام من torch.range(start, end, 1) إلى torch.arange(start, end+1, 1) .torch.load بدون weights_only المعلمة غير آمنة. قم بتعيين weights_only بشكل صريح على خطأ فقط إذا كنت تثق في البيانات التي تقوم بتحميلها وتحتاج إلى وظائف المخلل الكاملة ، وإلا فإن ضبط weights_only=True .
انظر TOR101 .
Torchfix هو ترخيص BSD مرخص ، كما هو موجود في ملف الترخيص.