بناء أول نموذج التعلم العميق IntelliCode Visual Studio الخاص بك: مسار استكشافي

منذ أن تم تقديم أول نموذج لإكمال كود IntelliCode في Visual Studio و Visual Studio Code في عام 2018 ، أصبح أداة مساعدة أساسية في الترميز لملايين المطورين حول العالم. على مدار العامين الماضيين ، عملنا باستمرار على تكييف IntelliCode مع المزيد من لغات البرمجة ، بينما نستكشف في الوقت نفسه طرقًا لتحسين دقة النموذج والتغطية لتوفير رضا أكبر للمستخدم. تتمثل إحدى جهودنا البحثية الرئيسية في إدخال أحدث التطورات في التعلم العميق لنمذجة اللغة الطبيعية إلى لغات البرمجة النمذجة. بعد استخدام تقنيات مثل Azure Machine Learning و ONNX Runtimeلقد نجحنا في تنفيذ أول نموذج تعليمي عميق لجميع مستخدمي IntelliCode Python في Visual Studio Code.







مسار البحث



بدأت الرحلة بالبحث في تطبيق تقنيات نمذجة اللغة في معالجة اللغة الطبيعية لتعلم كود بايثون. ركزنا على البرنامج النصي الحالي لإكمال IntelliCode ، كما هو موضح في الصورة أدناه.







المهمة الرئيسية هي العثور على الجزء الأكثر احتمالاً (عضو) من النوع ، مع الأخذ في الاعتبار جزء الكود الذي يسبق استدعاء الجزء (العضو). بعبارة أخرى ، بالنظر إلى مقتطف الشفرة الأصلي C ، والمفردات V ، ومجموعة جميع الطرق الممكنة M، V ، نود تعريف:





للعثور على هذه القطعة ، نحتاج إلى بناء نموذج قادر على التنبؤ باحتمالية الأجزاء المتاحة.



الأساليب الحديثة السابقة القائمة على الشبكات العصبية المتكررة ( RNN ) استخدمت فقط الطبيعة التسلسلية للشفرة المصدرية ، في محاولة لنقل تقنيات اللغة الطبيعية دون استخدام الخصائص الفريدة لبناء جملة لغة البرمجة ودلالات الكود. جعلت طبيعة مشكلة إكمال الكود مرشحًا واعدًا لاستخدام الذاكرة طويلة المدى قصيرة المدى ( LSTM). عند إعداد البيانات لتدريب النموذج ، استخدمنا شجرة بناء جملة مجردة جزئية (AST) تتوافق مع مقتطفات التعليمات البرمجية التي تحتوي على تعبيرات وصول الأعضاء (عضو) واستدعاءات وظائف الوحدة النمطية لالتقاط الدلالات التي يحملها الرمز البعيد.



يعد تدريب الشبكات العصبية العميقة مهمة كثيفة الموارد تتطلب مجموعات حوسبة عالية الأداء. استخدمنا إطار التدريب المتوازي الموزع من Horovod مع مُحسِّن آدم ، مع الاحتفاظ بنسخة من النموذج العصبي بأكمله على كل عامل ، ومعالجة مجموعات مصغرة مختلفة من مجموعة بيانات التدريب بالتوازي. استخدمنا Azure Machine Learningللتدريب على النموذج وضبط المعلمات الفائقة ، حيث سهلت خدمة مجموعة وحدة معالجة الرسومات عند الطلب من توسيع نطاق تدريبنا حسب الحاجة ، كما ساعدت في إعداد مجموعات الأجهزة الافتراضية وإدارتها ، وجدولة الوظائف ، وجمع النتائج ، ومعالجة حالات الفشل يوضح الجدول نماذج البنية التي اختبرناها ، بالإضافة إلى دقتها وحجم النموذج.





لقد اخترنا تصنيع التنفيذ التنبئي نظرًا لصغر حجم النموذج وتحسين دقة النموذج بنسبة 20٪ مقارنة بنموذج الإنتاج السابق أثناء تقييم النموذج غير المتصل ؛ حجم النموذج أمر بالغ الأهمية لعمليات نشر الإنتاج.



تظهر بنية النموذج في الشكل أدناه:





لنشر LSTM في الإنتاج ، كان علينا تحسين سرعة استنتاج النموذج وبصمة الذاكرة لتلبية متطلبات إكمال الكود أثناء التحرير. كانت ميزانية الذاكرة لدينا حوالي 50 ميغا بايت وكنا بحاجة إلى الحفاظ على متوسط ​​سرعة الإخراج أقل من 50 مللي ثانية. تم تدريب IntelliCode LSTM باستخدام TensorFlow واخترنا وقت تشغيل ONNX للاستدلال للحصول على أفضل أداء. يعمل ONNX Runtime مع أطر التعلم العميق الشائعة ويسهل الاندماج في مجموعة متنوعة من بيئات الخدمة من خلال توفير واجهات برمجة التطبيقات التي تغطي العديد من اللغات بما في ذلك Python و C و C ++ و C # و Java و JavaScript - استخدمنا C # APIs المتوافقة مع .NET Core للتكامل مع Microsoft Python Language Server .



يعد التكميم طريقة فعالة لتقليل حجم النموذج وتحسين الأداء عندما يكون الانخفاض في الدقة الناتج عن تقريب الأرقام ذات الأرقام المنخفضة مقبولًا. مع تكميم INT8 بعد التدريب المقدم من ONNX Runtime ، كان التحسن الناتج كبيرًا: تم تقليل أثر الذاكرة ووقت الاستدلال إلى حوالي ربع القيم المطلوبة مسبقًا مقارنة بالنموذج الأصلي ، مع انخفاض مقبول بنسبة 3 ٪ في دقة النموذج. يمكنك العثور على معلومات مفصلة حول تصميم بنية النموذج وضبط المعلمات الفائقة والدقة والأداء في ورقة البحث التي نشرناها في مؤتمر KDD 2019.



كانت المرحلة الأخيرة من الإصدار للإنتاج هي إجراء تجارب A / B عبر الإنترنت لمقارنة نموذج LSTM الجديد بنموذج العمل السابق. أظهرت نتائج تجربة A / B عبر الإنترنت في الجدول أدناه تحسنًا بنسبة 25٪ تقريبًا في دقة توصيات المستوى الأول (دقة عنصر الإنجاز الأول الموصى به في قائمة الإكمال) وتحسينًا بنسبة 17٪ في متوسط ​​الترتيب العكسي (MRR) ، مما أقنعنا بأن نموذج LSTM الجديد أفضل بكثير. النموذج السابق.





مطورو Python: جرب الوظائف الإضافية لـ IntelliCode وأرسل إلينا ملاحظاتك!



بفضل الجهود الكبيرة التي بذلها الفريق ، فقد أكملنا طرح نموذج التعلم العميق الأول على مراحل لجميع مستخدمي IntelliCode Python في Visual Studio Code . في أحدث إصدار من امتداد IntelliCode لـ Visual Studio Code ، قمنا أيضًا بدمج وقت تشغيل ONNX و LSTM للعمل مع امتداد Pylance الجديد ، والذي تمت كتابته بالكامل في TypeScript. إذا كنت مطور Python ، فقم بتثبيت امتداد IntelliCode وشاركنا برأيك.



All Articles