تقرير فني CodeShell

Rui Xie, Zhengran Zeng, Zhuohao Yu, Chang Gao, Shikun Zhang, Wei Ye
National Engineering Research Center for Software Engineering, Peking University, China
{ruixie, wye}@pku.edu.cn
https://github.com/WisdomShell/codeshell

مُلَخَّص

تُمثّل نماذج اللغة الكبيرة المتخصصة في البرمجة نقطة تحول رئيسية في مجال الذكاء الاصطناعي. فهي مُصمَّمة لفهم وتوليد لغات البرمجة، مما يُعزّز كفاءة سير عمل تطوير البرمجيات بشكل كبير. في هذا التقرير الفني، نقدّم نموذج CodeShell-Base الأساسِي المكوَّن من سبعة مليارات معلمة، وطول سياق يصل إلى 8K، والذي يُظهر قدرات استثنائية في فهم الكود. من خلال دمج آلية الانتباه المجمع للاستعلامات (GQA) والـترميز الدوراني للموقع (RoPE) في بنية GPT-2، يجمع CodeShell-Base بين المزايا الهيكلية لـStarcoder وCodeLlama مع تصميم معماري فريد. بعدها، اعتمدنا خط أنابيب شامل لمعالجة البيانات يتضمن إزالة التكرار، والتصفية بناءً على معيار الحيرة، والتصفية القاعدية. من خلال هذه العملية، جمعنا أكثر من 100 مليار رمز تدريبي عالي الجودة من GitHub. وبفضل هذه المجموعة من البيانات، يتفوّق CodeShell-Base على CodeLlama في معيار HumanEval بعد تدريبه على 500 مليار رمز فقط (خمس حقب). كذلك أجرينا تجارب شاملة على لغات متعددة، بينها Python وJava وC++، وأظهرت النتائج قوة النموذج في فهم وإنشاء الشيفرة.

مُقَدِّمَة

أحدثت نماذج اللغة الكبيرة المخصصة للبرمجة مثل CodeGen وCodeLlama وStarCoder ثورة في مجال تطوير البرمجيات من خلال أتمتة المهام، وتقليل الأخطاء، وتحسين الكفاءة (gpt4report). بالاستفادة من التعلم العميق ومجموعات البيانات الضخمة المخصصة للكود (codegen,thestack), رفعت هذه النماذج إنتاجية المطورين ووسّعت دائرة المستخدمين القادرين على إنشاء البرمجيات.

يمكن تصنيف نماذج اللغة الكبيرة للبرمجة الحالية إلى ثلاث فئات رئيسية: التدريب المسبق من الصفر (starcoder), والتدريب المسبق انطلاقًا من نموذج لغة كبير موجود مسبقًا (codex,codellama), والتعديل التوجيهي (wizardcoder). تتطلب النماذج التي تُدرب من الصفر كميات ضخمة من البيانات ووقتًا طويلًا (starcoder,llama2). من ناحية أخرى، يتيح الاستفادة من نموذج موجود تقليل زمن التدريب وتحقيق كفاءة أعلى بكمية بيانات أقل (codex,codellama). أمّا التعديل التوجيهي فيتضمن ضبط نموذج كبير باستخدام بيانات توجيهية لتحسين الأداء (codellama,wizardcoder). ومع ذلك، يبقى التحدي الأكبر أن العديد من النماذج الكبيرة تُدرّب على مجموعات بيانات ضخمة للكود دون رقابة دقيقة، ما قد يؤدي إلى إنتاج شيفرات منخفضة الجودة. ورغم بعض الاستراتيجيات لاختيار الشيفرة (phi1), فإن خطر خروج شيفرات دون المستوى مازال قائمًا.

في هذا التقرير الفني نقدّم نموذجًا جديدًا يُسمّى CodeShell. يدمج CodeShell الترميز الدوراني للموقع (rope) وآلية الانتباه المجمع للاستعلامات (gqa) ضمن بنية GPT-2 لبناء تصميم معياري وفعّال يدعم سياقات أطول. ثم طورنا خط أنابيب لاختيار الشيفرات عالية الجودة، مما أتاحت لنا حزمة بيانات تضم أكثر من 100 مليار رمز. استنادًا إلى هذه المجموعة، تدرب CodeShell على مدى خمس حقب، وأظهرت تجاربنا أنّه يستطيع مع 100 مليار رمز فريد أن يضاهي أو يتفوّق على نماذج كبيرة مثل StarCoder وCodeLlama التي دُرِّبت على 250 مليار رمز فريد. ومما يؤكد أهمية اختيار البيانات العالية الجودة، تبقى هذه العمليّة محورًا أساسيًا في تطوير نموذج فعّال. فيما يلي أبرز مساهماتنا الرئيسية:

قِشْرَة الكود

البَيانات

للاطّلاع على تفاصيل بناء مجموعة بيانات تدريب CodeShell وعمليّات التصفية والتحسين، نوضّح فيما يلي كلّ خطوة:

جمع البيانات: استند عملنا إلى أرشيف GitHub (gharchive)، حيث قمنا بجمع نحو 15 تيرابايت من المستودعات لضمان اتساع وتنوّع المجموعة. أضفنا كذلك بيانات من Stack (thestack) وStarCoder لإثراء المادة بأمثلة شيفرة ومناقشات برمجية.

تصفية اللغات: استبعدنا اللغات التي يقل حجم بياناتها عن 100 ميغابايت، وركزنا على سبع مجموعات رئيسية تشمل 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 كأساس، ويستفيد من تقنيتين متقدمتين: آلية الانتباه المجمع للاستعلامات (GQA) والـRoPE (الترميز الدوراني للموقع). تساعد آلية GQA في تجميع الاستعلامات المتشابهة لتحسين الكفاءة الحسابية وتقليل التكرار، بينما يوفّر الـRoPE تمثيلًا ديناميكيًا لمواقع الرموز في تسلسل الشيفرة، مما يعزّز فهم النموذج للبنية والترتيب.

التدريب

التحسين

اعتمدنا محسّن AdamW مع ضبط معاملات \(\beta_1\) و\(\beta_2\) عند 0.9 و0.95 على التوالي. استخدمنا جدولًا زمنيًا للتعلم يبدأ بفترة تسخين مدتها 1000 خطوة، ثم يخفض معدل التعلم من 3e-4 إلى 3e-5 خلال 127k تحديثًا. عالجنا دفعات بحجم 4 ملايين رمز، مقسمة إلى تسلسلات بطول 2048 أو 8192 رموز لكل دفعة.

مرحلة التدريب المسبق

للموازنة بين الكفاءة والحاجة إلى سياق أطول، بدأنا بطول سياق 2048 للأحقاب الأولى. بعد تدريب على نحو 450 مليار رمز، زدنا طول السياق إلى 8192. نتج عن ذلك انخفاض في معدل المعالجة على وحدة المعالجة الرسومية من 3200 رمز/ثانية إلى 2600 رمز/ثانية. ومع ذلك، حافظ النموذج على استقراره أو شهد تحسنًا طفيفًا في الأداء، مع انخفاض ملحوظ في الخسارة بفضل السياق الأطول، دون أي تراجع في مقاييس التقييم.

النتائج

في هذا القسم نستعرض أداء CodeShell مقارنةً بالنماذج الرائدة:

توليد الشيفرة

توليد كود بايثون

نقارن في هذا القسم أداء CodeShell-7B في بايثون مع نماذج مفتوحة ومغلقة. نستخدم نتائج معيار HumanEval (codex) وMBPP. تضم مجموعة HumanEval 164 مهمة بايثون مُصممة يدويًا مع حالات اختبار لتقييم الأداء في الوضع الصفر-شوت، بينما يتضمن معيار MBPP 500 تحديًا مع أمثلة قليلة (few-shot).

أظهرت النتائج أن CodeShell-7B حقق دقة متوسطة تبلغ 34.3% على HumanEval و38.7% على MBPP، ما يضعه في صدارة النماذج ذات الحجم المماثل، ويتفوّق على Code-LLaMA-7B وStarCoder-Base-7B، بل وعلى نماذج أكبر عددًا من المعلمات أيضًا.

لا بد من الإشارة إلى أن اختيار البيانات عالية الجودة والتدريب المتكرر ساعدا CodeShell على تحقيق نتائج استثنائية في المهام الأساسية مثل HumanEval. ومع ذلك، قد يحتاج أداؤه في مهام أكثر تعقيدًا مثل CoderUJB إلى مزيد من التحسين لعملية اختيار البيانات والتكيف مع متطلبات الهيكل المنطقي المعقد.

توليد الكود متعدد اللغات

قيّمنا نموذجنا كذلك عبر عدة لغات باستخدام معيار multiple (Casano et al., 2022). أظهرت النتائج تفوّق CodeShell في لغات رئيسية مثل جافا سكربت، جافا، وسي++ مقارنة بـCodeLlama-7B وStarCoder-7B/15B. أما في لغات أصغر مثل دي، جوليا، ولووا، فكان الأداء أقل نظرًا لندرة البيانات عالية الجودة لتلك اللغات. ولاحظنا أن أداء CodeShell في بعض اللغات اقترب من مستوى StarCoder-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% مقارنة بالاختيار العشوائي، مما يؤكد فعالية نهجنا في تدريب النماذج الكبيرة.