مُلَخَّص
تُمَثِّل نماذج اللغة الكبيرة للبرمجة نقطة تحول رئيسية في الذكاء الاصطناعي. تم تصميمها خصيصًا لفهم وتوليد لغات البرمجة، مما يعزز بشكل كبير كفاءة سير عمل تطوير البرمجيات. في هذا التقرير الفني، نقدم CodeShell-Base، نموذجًا أساسيًا بسبعة مليارات معلمة وطول سياق 8K، والذي يُظهر كفاءة استثنائية في فهم الكود. من خلال دمج انتباه الاستعلام المجمع وترميز الموضع الدوار في GPT-2، يجمع CodeShell-Base بين المزايا الهيكلية لـ Starcoder و CodeLlama ويتميز بتصميم معماري فريد. بعد ذلك، أنشأنا عملية معالجة بيانات شاملة بعناية، تشمل إزالة التكرار للبيانات المتشابهة، وتصفية البيانات بناءً على الحيرة، وتصفية البيانات بناءً على النموذج. من خلال هذه العملية، جمعنا 100 مليار رمز تدريب مسبق عالية الجودة من GitHub. وبفضل هذه البيانات، يتفوق CodeShell-Base على CodeLlama في Humaneval بعد التدريب على 500 مليار رمز فقط (5 حقب). أجرينا تجارب واسعة النطاق عبر مجموعات بيانات متعددة اللغات، بما في ذلك Python، Java، و C++، وتشير النتائج إلى أن نموذجنا يمتلك قدرات أساسية قوية في فهم وتوليد الكود.
مُقَدِّمَة
نماذج اللغة الكبيرة للبرمجة مثل CodeGen (codegen)، CodeLlama (codellama)، وStarCoder (starcoder) أحدثت ثورة في تطوير البرمجيات من خلال أتمتة المهام، تقليل الأخطاء، وتحسين الكفاءة (gpt4report). بالاستفادة من التعلم العميق ومجموعات البيانات الضخمة للكود (codegen,thestack)، تعزز هذه النماذج إنتاجية المطورين وتجعل تطوير البرمجيات أكثر سهولة لجمهور أوسع.
يمكن تقسيم نماذج اللغة الكبيرة للبرمجة الحالية إلى ثلاث فئات رئيسية: التدريب المسبق من الصفر (starcoder)، التدريب المسبق انطلاقًا من نموذج لغة كبير موجود (codex,codellama)، والتعديل التوجيهي (wizardcoder). النماذج التي يتم تدريبها مسبقًا من الصفر تتطلب حجمًا كبيرًا من البيانات ووقتًا طويلاً (starcoder,llama2). من ناحية أخرى، يوفر الاستفادة من نموذج لغة موجود كأساس مزايا تقليل أوقات التدريب وتحسين الكفاءة ببيانات أقل (codex,codellama). التعديل التوجيهي يتضمن تعديل نموذج كبير باستخدام بيانات توجيهية لتحسين الأداء (codellama,wizardcoder). ومع ذلك، يبقى التحدي الأكبر أن النماذج الكبيرة القائمة تم تدريبها على مجموعات بيانات ضخمة من الكود دون حوكمة دقيقة، مما قد يؤدي إلى إنتاج أكواد منخفضة الجودة. رغم بعض استراتيجيات اختيار الكود (phi1)، لا يزال خطر إنتاج كود ذو جودة منخفضة مصدر قلق.
في هذا التقرير الفني، نقدم نموذجًا جديدًا للكود الكبير يُسمى CodeShell. يدمج CodeShell ترميز الموقع الدوار (rope) وانتباه الاستعلام المجمع (gqa) في بنية GPT-2 (gpt2)، لبناء تصميم معياري وفعال يدعم سياقات أطول. ثم طورنا خط أنابيب لاختيار الكود عالي الجودة، مما أدى إلى الحصول على 100 مليار رمز من كود عالي الجودة. استنادًا إلى هذا الأساس، تم تدريب CodeShell على مدى خمس حقب. تظهر تجاربنا أن التدريب فقط على 100 مليار رمز فريد يتيح لـCodeShell أداءً يعادل أو يتفوق على النماذج الكبيرة القائمة، التي تم تدريبها على 250 مليار رمز فريد مثل StarCoder وCodeLlama. ونظرًا لشح الكود عالي الجودة في المصادر المفتوحة، تظل عملية اختيار الأكواد عالية الجودة محورًا أساسيًا لتطوير نموذج فعّال. إليكم مساهماتنا الرئيسية:
أصدرنا CodeShell-7B، نموذجًا أساسيًا جديدًا تم تدريبه من الصفر بتصميم معماري فريد. أظهر أداءً تنافسيًا عبر معايير متنوعة ولغات برمجة متعددة.
لتقليل تكاليف التدريب، أنشأنا خط أنابيب فعالًا لمعالجة البيانات يختار الأكواد عالية الجودة من مجموعات ضخمة. النتائج التجريبية تشير إلى أن نموذجنا، المدرب على 500B رمز فقط، يتفوق على StarCoder المدرب على 1 تريليون رمز.
لمعالجة مهام برمجية أكثر تعقيدًا، قمنا بتمديد طول السياق إلى 8K، مما يحسن قدرة النموذج على التعامل مع مقاطع الكود الطويلة دون المساس بكفاءته على المقاطع الأقصر.
قِشْرَة الكود
البَيانات
لمزيد من التفاصيل حول بناء مجموعة بيانات تدريب CodeShell وعملية التصفية والتحسين، دعونا نستعرض كل خطوة بمزيد من التفصيل:
جمع البيانات: كان مصدرنا الأساسي GitHub (gharchive)، حيث زحفنا على نحو 15 تيرابايت من المستودعات لضمان مجموعة بيانات واسعة ومتنوعة. كما أدمجنا مجموعات بيانات Stack (thestack) وStarCoder لإثراء المادة التدريبية بأمثلة أكواد ومناقشات برمجية.
تصفية اللغات: استبعدنا اللغات التي تقل بياناتها عن 100 ميغابايت وركزنا على 7 مجموعات رئيسية تتضمن Markdown للتوثيق، وgit-commits لممارسات التطوير، وGitHub-issues لمناقشات حل المشكلات، لتعزيز فهم النموذج لأنماط البرمجة المختلفة.
القواعد الأولية للتصفية: صممنا قواعد لاستبعاد الأكواد ذات الأسطر الطويلة جدًا أو المحتوى النصي المفرط مقارنة بالرموز، لاستبعاد البيانات غير النمطية والتركيز على الأمثلة الأكثر معيارية وقابلة للقراءة.
إزالة التكرار: استخدمنا تجزئة MD5 للتعرف على النصوص المكررة وإزالتها، وتقنيات MinHash (minihash) للكشف عن المحتويات المماثلة جدًا وتنقيتها، مما عزز تنوع وجودة البيانات.
تصفية الحيرة: اعتمدنا درجات الحيرة (pplf) كمقياس لجودة الأكواد. من خلال استبعاد الأكواد ذات درجات الحيرة العالية، قمنا برفع مستوى جودة الأمثلة في مجموعة البيانات.
التصفية القاعدية: وظفنا نظام تحليل وقواعد مخصّصة لانتقاء الأكواد عالية الجودة، بحساب مقاييس مثل عدد الأسطر، ووجود التعليقات ومدى تغطيتها، ومتوسط طول السطر. كما فضلنا الأكواد التي تستخدم مكتبات طرف ثالث معروفة، والتي تعكس ممارسات تطوير متقدمة. وتحققنا من مستوى التعقيد المنطقي عبر تحليل الشجرة المجردة وتدفق التحكم، لضمان أن الأمثلة ليست وظيفية فحسب بل متطورة أيضًا، مع الالتزام بمعايير البرمجة المعتمدة كأفضل ممارسات.
css | 30.09 | 5292.28 | 2.38% | 0.13 | 23.58 | 0.28% |
[tab:data_overview_1]
النموذج
مُحلل الرموز
لتعزيز قدرة النموذج على التعامل مع المحتوى الصيني في البرمجة، قمنا بإثراء مفردات StarCoder عن طريق إضافة عدد كبير من المفردات الصينية. على وجه التحديد، جمعنا مليون ملف برمجي صيني وبيانات الأسئلة والأجوبة البرمجية باللغة الصينية. باستخدام مكتبة Tokenizer من Hugging Face، حددنا 40,000 مفردة صينية عالية التكرار، و30,000 مفردة إنجليزية من مفردات StarCoder، ودمجناهما معًا لتكوين مفردات CodeShell الشاملة. تظهر النتائج التجريبية تفوق مفردات CodeShell في كفاءة تحليل الأسئلة والأجوبة البرمجية الصينية مقارنة بمفردات StarCoder الأصلية.
الهندسة المعمارية
يستفيد CodeShell من بنية GPT-2 (gpt2) كأساس، ويستخدم تقنيتين متقدمتين: انتباه الاستعلام المجمع (gqa) وترميز المواقع الدوار (rope). تعمل آلية انتباه الاستعلام المجمع على تجميع الاستعلامات المتشابهة لتحسين الكفاءة الحسابية وتقليل التكرار. في المقابل، يوفر ترميز المواقع الدوار تمثيلًا ديناميكيًا لمواقع العناصر في تسلسل الكود، مما يساعد النموذج على فهم البنية والترتيب بدقة أكبر.
التدريب
التحسين
اعتمدنا AdamW كمحسن، مع ضبط معاملات \(\beta_1\) و\(\beta_2\) عند 0.9 و0.95 على التوالي. استخدمنا جدولًا زمنيًا للتعلم يبدأ بتسخين لمدة 1000 خطوة، ثم يخفض معدل التعلم من 3 \times 10^{-4} إلى 3 \times 10^{-5} خلال 127k تحديث. قمنا بمعالجة دفعات بحجم 4 ملايين رمز، مقسمة إلى تسلسلات بطول 2048 أو 8192 رمز لكل منها.
مرحلة التدريب المسبق
للموازنة بين الكفاءة والحاجة إلى سياق أطول، بدأنا بطول سياق 2048 للأحقاب الأولى. بعد تدريب على نحو 450 مليار رمز، زدنا طول السياق إلى 8192. تراجع معدل المعالجة على الوحدة الرسومية من 3200 رمز/ثانية إلى 2600 رمز/ثانية. رغم التغيير، حافظ النموذج على استقراره أو تحسن أداءه قليلًا، مع انخفاض ملحوظ في الخسارة بفضل السياق الأطول، دون أي تراجع في مقاييس التقييم.
النتائج
في هذا القسم نستعرض أداء CodeShell مقارنة بالنماذج الرائدة:
StarCoder-7B وStarCoder-15B (starcoder)، بنموذجين بحجم 7 و15 مليار معلمة، متاحين علنًا ويتفوقان في مهام برمجية متنوعة، معتمدين على جزء مختار بعناية من مجموعة بيانات Stack التي تغطي 86 لغة برمجة.
CodeLlama (codellama)، عائلة نماذج برمجية مشتقة من LLaMA2 (llama2)، مُحسّنة بالتدريب المستمر على نحو 500 مليار رمز باستخدام بنية LLaMA2 الأساسية.
توليد الشيفرة
توليد كود بايثون
في هذا القسم نقارن أداء CodeShell في بايثون مع النماذج المفتوحة والمغلقة. نبدأ بنتائج HumanEval (codex) وMBPP (mbpp). تتألف مجموعة HumanEval من 164 مهمة بايثون مصممة يدويًا مع حالات اختبار لتقييم الأداء دون أمثلة سابقة (الصفر شوت). أما معيار MBPP فيتضمن 500 تحدٍّ مع أمثلة قليلة (few-shot).
النتائج التجريبية تظهر أن CodeShell-7B حقق دقة متوسطة تبلغ 34.3% على HumanEval و38.7% على MBPP، وهو ما يضعه في صدارة نماذجه المماثلة الحجم ويتفوق على Code-LLaMA-7B وStarCoder-Base-7B. كما يتفوق CodeShell-7B على نماذج أكبر عددًا من المعلمات.
يرجى ملاحظة أن اختيار البيانات عالي الجودة والتدريب المتكرر سمحا لـCodeShell بأداء استثنائي في المهام الأساسية مثل HumanEval. ومع ذلك، قد يحتاج الأداء على مهمات أكثر تعقيدًا مثل CoderUJB إلى تحسين إضافي لعملية اختيار البيانات وتكييفها مع متطلبات الهيكل المنطقي المعقد.
توليد الكود متعدد اللغات
قمنا أيضًا بتقييم نموذجنا عبر مجموعة لغات أوسع باستخدام معيار multiple (Casano et al., 2022). النتائج لمختلف اللغات، بما في ذلك جافا سكريبت، جافا، سويفت، بي إتش بي وغيرها، موضحة في الجدول [tb:results_multiple].
لوحظ أن CodeShell حقق نتائج أفضل في لغات رئيسية مثل جافا سكريبت، جافا، وسي++ مقارنة بـCodeLlama-7B وStarCoder-7B/15B. أما في لغات أصغر مثل دي، جوليا، ولووا فكان الأداء أقل، مما يعكس توفر بيانات عالية الجودة للغات الرئيسية. الجدير بالذكر أن أداء CodeShell في بعض اللغات كان منافسًا لستاركودر-15B، مما يشير إلى فعالية التصميم المعياري للنموذج الأصغر.
اكتمال الكود
أثناء التدريب المسبق، استخدمنا تقنية Fill-In-the-Middle (fim) بنسبة 0.5 لتعزيز قدرة النموذج على ملءِ الفجوات في الكود بناءً على السياق المحيط. هذه التقنية أثبتت جدواها في اكتمال الكود، كما يظهر في نماذج مثل StarCoder-15B وCodeLlama-7B. وفقًا لـsantacoder، نخفي سطرًا واحدًا داخل دالة ونطلب من النموذج ملؤه، ثم نقيس المطابقة الدقيقة (incoder) عبر معيار multiple لثلاث لغات برمجة.
النتائج في الجدول [tab:results_code_completion] تظهر أن CodeShell-7B يتفوق على StarCoder وCodeLlama في هذا الاختبار، مما يؤكد أهمية البيانات عالية الجودة وتركيبة التدريب المسبق التي تبدأ بطول سياق 2048 ثم تمتد إلى 8192 دون خسارة في الكفاءة النهائية.
الانتباه متعدد الاستعلامات مقابل الانتباه المجمع للاستعلامات
لتقييم تأثير كل من انتباه متعدد الاستعلامات (MQA) والانتباه المجمع للاستعلامات (GQA) على أداء النموذج، طورنا نسخة “codeshell-small” بـ 24 طبقة، حجم خفي 2048، وإجمالي 1 مليار معلمة. نفذنا كل نوع انتباه كوحدة مستقلة، وأطلقنا عليهما codeshell-small-mqa وcodeshell-small-gqa. تشير النتائج إلى أنه في البداية كان الأداء متقاربًا، لكن مع زيادة حجم بيانات التدريب تدريجيًا، تفوق codeshell-small-gqa على codeshell-small-mqa في مقياس الاختبار@1.
استبعادات البيانات
لاختبار فعالية آلية تصفية الأكواد عالية الجودة، أعددنا مجموعتين: مجموعة عشوائية أخذنا منها 2 مليار رمز من البيانات غير المكررة، ومجموعة مصفّاة أخذنا منها 2 مليار رمز الأعلى تقييمًا من حيث الجودة. استخدمنا نموذج “codeshell-small” لتدريب كل مجموعة، وبيّنت النتائج في الشكل المقابل تفوق النموذج المصفى باستمرار بنسبة تقارب 100% مقارنة بالأخرى، مما يؤكد الدور الحاسم لجودة البيانات.
الخلاصة
قدمنا في هذا التقرير نموذج الشيفرة الكبير CodeShell. استعرضنا تأثير التصميم المعماري واستراتيجيات تصفية البيانات على الأداء، وأظهرنا أن جودة البيانات تبقى العامل الأهم. بفضل اختيار بيانات عالية الجودة، حقق CodeShell أداءً متميزًا عبر لغات برمجة متعددة. بالإضافة إلى ذلك، أظهرت طريقة التصفية التي اقترحناها تحسينًا بنسبة ~100% مقارنة بالاختيار العشوائي، مما يؤكد فعالية نهجنا في تدريب النماذج الكبيرة.