مسار البحث
بدأت الرحلة بالبحث في تطبيق تقنيات نمذجة اللغة في معالجة اللغة الطبيعية لتعلم كود بايثون. ركزنا على البرنامج النصي الحالي لإكمال 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 وشاركنا برأيك.