Code Llama هي عائلة مكونة من أحدث إصدارات Llama 2 ذات الوصول المفتوح والمتخصصة في مهام التعليمات البرمجية، ونحن متحمسون لإصدار التكامل في نظام Hugging Face البيئي! تم إصدار Code Llama بنفس ترخيص المجتمع المسموح به مثل Llama 2 وهو متاح للاستخدام التجاري.
اليوم، نحن متحمسون لإصدار:
- النماذج الموجودة على المركز مع بطاقات النماذج والترخيص الخاصة بها
- تكامل المحولات
- التكامل مع استدلال إنشاء النص لاستدلال جاهز للإنتاج سريع وفعال
- التكامل مع نقاط النهاية الاستدلالية
- التكامل مع ملحق VS Code
- معايير الكود
تعد Code LLMs تطورًا مثيرًا لمهندسي البرمجيات لأنه يمكنهم تعزيز الإنتاجية من خلال إكمال التعليمات البرمجية في IDEs، أو الاهتمام بالمهام المتكررة أو المزعجة مثل كتابة سلاسل المستندات، أو إنشاء اختبارات الوحدة.
جدول المحتويات
ما هو رمز اللاما؟
يقدم إصدار Code Llama مجموعة من النماذج المكونة من 7 و13 و34 مليار معلمة. تتم تهيئة النماذج الأساسية من Llama 2 ثم يتم تدريبها على 500 مليار رمز من بيانات التعليمات البرمجية. قامت Meta بضبط هذه النماذج الأساسية لتناسب نكهتين مختلفتين: متخصص في Python (100 مليار رمز إضافي) وإصدار تعليمات مضبوط بدقة يمكنه فهم تعليمات اللغة الطبيعية.
تُظهر النماذج أداءً متطورًا في Python وC++ وJava وPHP وC# وTypeScript وBash. تدعم متغيرات القاعدة والتعليمات 7B و13B عملية التعبئة بناءً على المحتوى المحيط، مما يجعلها مثالية للاستخدام كمساعدين للتعليمات البرمجية.
تم تدريب Code Llama على نافذة سياق بحجم 16 كيلو بايت. بالإضافة إلى ذلك، تحتوي متغيرات النماذج الثلاثة على ضبط إضافي للسياق الطويل، مما يسمح لها بإدارة نافذة سياق تصل إلى 100000 رمز مميز.
كانت زيادة نافذة سياق Llama 2 بدقة 4K إلى 16k لـ Code Llama (التي يمكن أن تستقرئ ما يصل إلى 100k) ممكنة بسبب التطورات الأخيرة في تحجيم RoPE. وجد المجتمع أن تضمينات موضع اللاما يمكن استيفاءها خطيًا أو في مجال التردد، مما يسهل الانتقال إلى نافذة سياق أكبر من خلال الضبط الدقيق. في حالة Code Llama، يتم قياس نطاق التردد بفترة ركود: طول الضبط الدقيق هو جزء صغير من الطول المُدرب مسبقًا الذي تم قياسه، مما يمنح النموذج إمكانات استقراء قوية.
تم تدريب جميع النماذج في البداية باستخدام 500 مليار رمز مميز على مجموعة بيانات شبه مكررة من التعليمات البرمجية المتاحة للجمهور. تحتوي مجموعة البيانات أيضًا على بعض مجموعات بيانات اللغة الطبيعية، مثل المناقشات حول التعليمات البرمجية ومقتطفات التعليمات البرمجية. لسوء الحظ، ليس هناك المزيد من المعلومات حول مجموعة البيانات.
بالنسبة لنموذج التعليمات، استخدموا مجموعتي بيانات: مجموعة بيانات ضبط التعليمات التي تم جمعها لـ Llama 2 Chat ومجموعة بيانات التعليمات الذاتية. تم إنشاء مجموعة بيانات التوجيه الذاتي باستخدام Llama 2 لإنشاء أسئلة برمجة المقابلة ثم استخدام Code Llama لإنشاء اختبارات الوحدة وحلولها، والتي يتم تقييمها لاحقًا من خلال تنفيذ الاختبارات.
كيفية استخدام كود اللاما؟
يتوفر Code Llama في نظام Hugging Face البيئي، بدءًا من transformers الإصدار 4.33.
تجريبي
يمكنك بسهولة تجربة نموذج Code Llama (13 مليار معلمة!) هذه المساحة أو في الملعب المضمن أدناه:
تحت الغطاء، يستخدم هذا الملعب استدلال إنشاء النص الخاص بـ Hugging Face، وهي نفس التقنية التي تعمل على تشغيل HuggingChat، وسنشارك المزيد في الأقسام التالية.
إذا كنت ترغب في تجربة الطراز 34B الأكبر الذي تم ضبطه حسب التعليمات، فهو متوفر الآن على HuggingChat! يمكنك تجربتها هنا: hf.co/chat. تأكد من تحديد نموذج Code Llama. يمكنك أيضًا التحقق من هذا العرض التوضيحي القائم على الدردشة ونسخه لاستخدامك – فهو قائم بذاته، حتى تتمكن من فحص كود المصدر وتكييفه كما يحلو لك!
محولات
بدءا من transformers 4.33، يمكنك استخدام Code Llama والاستفادة من جميع الأدوات الموجودة في النظام البيئي HF، مثل:
- البرامج النصية للتدريب والاستدلال والأمثلة
- تنسيق الملف الآمن (
safetensors) - التكامل مع أدوات مثل
bitsandbytes(تكميم 4 بت) وPEFT (ضبط كفاءة المعلمة) - المرافق والمساعدين لتشغيل الجيل مع النموذج
- آليات لتصدير النماذج للنشر
!pip install --upgrade transformers
ملاحظة على dtypes
عند استخدام نماذج مثل Code Llama، من المهم إلقاء نظرة على أنواع البيانات الخاصة بالنماذج.
- نقطة عائمة 32 بت (
float32): اتفاقية PyTorch الخاصة بتهيئة النموذج هي تحميل النماذج فيهاfloat32بغض النظر عن الدقة التي تم بها تخزين أوزان النماذج.transformersيتبع أيضًا هذه الاتفاقية للتوافق مع PyTorch. - النقطة العائمة للدماغ 16 بت (
bfloat16): تم تدريب Code Llama بهذه الدقة، لذا نوصي باستخدامه لمزيد من التدريب أو الضبط الدقيق. - نقطة عائمة 16 بت (
float16): نوصي بتشغيل الاستدلال باستخدام هذه الدقة، لأنه عادة ما يكون أسرع منbfloat16، ولا تظهر مقاييس التقييم أي تدهور ملحوظ فيما يتعلقbfloat16. يمكنك أيضًا تشغيل الاستدلال باستخدامbfloat16، ونوصيك بالتحقق من نتائج الاستدلال مع كليهماfloat16وbfloat16بعد الضبط الدقيق.
كما ذكر أعلاه، transformers تحميل الأوزان باستخدام float32 (بغض النظر عن دقة تخزين النماذج)، لذلك من المهم تحديد المطلوب dtype عند تحميل النماذج إذا كنت تريد ضبط Code Llama، فمن المستحسن استخدامه bfloat16، كما تستخدم float16 يمكن أن يؤدي إلى الفيضانات وNaNs. إذا قمت بتشغيل الاستدلال، نوصي باستخدام float16 لأن bfloat16 يمكن أن يكون أبطأ.
إكمال الكود
يمكن استخدام الطرازين 7B و13B لإكمال النص/الرمز أو ملئه. يستخدم مقتطف التعليمات البرمجية التالي pipeline واجهة لإظهار إكمال النص. يتم تشغيله على الطبقة المجانية من Colab، طالما قمت بتحديد وقت تشغيل GPU.
from transformers import AutoTokenizer
import transformers
import torch
tokenizer = AutoTokenizer.from_pretrained("codellama/CodeLlama-7b-hf")
pipeline = transformers.pipeline(
"text-generation",
model="codellama/CodeLlama-7b-hf",
torch_dtype=torch.float16,
device_map="auto",
)
sequences = pipeline(
'def fibonacci(',
do_sample=True,
temperature=0.2,
top_p=0.9,
num_return_sequences=1,
eos_token_id=tokenizer.eos_token_id,
max_length=100,
)
for seq in sequences:
print(f"Result: {seq['generated_text']}")
قد ينتج عن ذلك مخرجات مثل ما يلي:
Result: def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
def fibonacci_memo(n, memo={}):
if n == 0:
return 0
elif n == 1:
return
إن Code Llama متخصص في فهم التعليمات البرمجية، ولكنه نموذج لغة في حد ذاته. يمكنك استخدام نفس استراتيجية الإنشاء للإكمال التلقائي للتعليقات أو النص العام.
تعبئة الكود
هذه مهمة متخصصة خاصة بنماذج التعليمات البرمجية. يتم تدريب النموذج على إنشاء التعليمات البرمجية (بما في ذلك التعليقات) التي تتطابق بشكل أفضل مع البادئة واللاحقة الموجودة. هذه هي الإستراتيجية التي يستخدمها عادةً مساعدو التعليمات البرمجية: حيث يُطلب منهم ملء موضع المؤشر الحالي، مع الأخذ في الاعتبار المحتويات التي تظهر قبله وبعده.
هذه المهمة متوفرة في قاعدة و تعليمات المتغيرات من نماذج 7B و13B. إنها لا متاح لأي من نماذج 34B أو إصدارات Python.
لاستخدام هذه الميزة بنجاح، يجب عليك الانتباه جيدًا إلى التنسيق المستخدم لتدريب النموذج على هذه المهمة، حيث يستخدم فواصل خاصة لتحديد الأجزاء المختلفة للموجه. ولحسن الحظ فإن المحولات CodeLlamaTokenizer يجعل هذا الأمر سهلاً للغاية، كما هو موضح أدناه:
from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch
model_id = "codellama/CodeLlama-7b-hf"
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
torch_dtype=torch.float16
).to("cuda")
prompt = '''def remove_non_ascii(s: str) -> str:
""" <FILL_ME>
return result
'''
input_ids = tokenizer(prompt, return_tensors="pt")["input_ids"].to("cuda")
output = model.generate(
input_ids,
max_new_tokens=200,
)
output = output[0].to("cpu")
filling = tokenizer.decode(output[input_ids.shape[1]:], skip_special_tokens=True)
print(prompt.replace("<FILL_ME>", filling))
def remove_non_ascii(s: str) -> str:
""" Remove non-ASCII characters from a string.
Args:
s: The string to remove non-ASCII characters from.
Returns:
The string with non-ASCII characters removed.
"""
result = ""
for c in s:
if ord(c) < 128:
result += c
return result
تحت الغطاء، ينقسم الرمز المميز تلقائيًا <FILL_ME> لإنشاء سلسلة إدخال منسقة تتبع نمط التدريب الأصلي. يعد هذا أكثر قوة من إعداد النموذج بنفسك: فهو يتجنب المخاطر، مثل اللصق الرمزي، الذي يصعب تصحيح الأخطاء فيه.
تعليمات المحادثة
يمكن استخدام النموذج الأساسي لكل من الإكمال والملء، كما هو موضح. يتضمن إصدار Code Llama أيضًا نموذج تعليمات مضبوطًا يمكن استخدامه في واجهات المحادثة.
لإعداد المدخلات لهذه المهمة، يتعين علينا استخدام قالب موجه مثل ذلك الموضح في منشور مدونة Llama 2، والذي نعيد إنتاجه مرة أخرى هنا:
<s>[INST] <<SYS>>
{{ system_prompt }}
<</SYS>>
{{ user_msg_1 }} [/INST] {{ model_answer_1 }} </s><s>[INST] {{ user_msg_2 }} [/INST]
لاحظ أن موجه النظام اختياري – سيعمل النموذج بدونه، ولكن يمكنك استخدامه لتكوين سلوكه أو نمطه بشكل أكبر. على سبيل المثال، إذا كنت ترغب دائمًا في الحصول على إجابات بلغة JavaScript، فيمكنك ذكر ذلك هنا. بعد مطالبة النظام، يجب عليك تقديم جميع التفاعلات السابقة في المحادثة: ما سأله المستخدم وما أجاب عليه النموذج. كما هو الحال في حالة التعبئة، عليك الانتباه إلى المحددات المستخدمة. يجب أن يكون المكون الأخير للإدخال دائمًا عبارة عن تعليمات مستخدم جديدة، والتي ستكون بمثابة إشارة للنموذج لتقديم إجابة.
توضح مقتطفات التعليمات البرمجية التالية كيفية عمل القالب عمليًا.
- استعلام المستخدم الأول، لا يوجد مطالبة النظام
user = 'In Bash, how do I list all text files in the current directory (excluding subdirectories) that have been modified in the last month?'
prompt = f"<s>[INST] {user.strip()} [/INST]"
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
- استعلام المستخدم الأول مع موجه النظام
system = "Provide answers in JavaScript"
user = "Write a function that computes the set of sums of all contiguous sublists of a given list."
prompt = f"<s>[INST] <<SYS>>\\n{system}\\n<</SYS>>\\n\\n{user}[/INST]"
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
- محادثة مستمرة مع الإجابات السابقة
العملية هي نفسها كما في Llama 2. لم نستخدم حلقات أو قمنا بتعميم رمز المثال هذا لتحقيق أقصى قدر من الوضوح:
system = "System prompt"
user_1 = "user_prompt_1"
answer_1 = "answer_1"
user_2 = "user_prompt_2"
answer_2 = "answer_2"
user_3 = "user_prompt_3"
prompt = f"<<SYS>>\n{system}\n<</SYS>>\n\n{user_1}"
prompt = f"<s>[INST] {prompt.strip()} [/INST] {answer_1.strip()} </s>"
prompt += f"<s>[INST] {user_2.strip()} [/INST] {answer_2.strip()} </s>"
prompt += f"<s>[INST] {user_3.strip()} [/INST]"
inputs = tokenizer(prompt, return_tensors="pt", add_special_tokens=False).to("cuda")
تحميل 4 بت
إن دمج Code Llama في Transformers يعني أنك تحصل على دعم فوري للميزات المتقدمة مثل التحميل 4 بت. يتيح لك هذا تشغيل نماذج المعلمات الكبيرة 32B على وحدات معالجة الرسومات الاستهلاكية مثل بطاقات nvidia 3090!
إليك كيفية تشغيل الاستدلال في وضع 4 بت:
from transformers import AutoTokenizer, AutoModelForCausalLM, BitsAndBytesConfig
import torch
model_id = "codellama/CodeLlama-34b-hf"
quantization_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_compute_dtype=torch.float16
)
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
quantization_config=quantization_config,
device_map="auto",
)
prompt = 'def remove_non_ascii(s: str) -> str:\n """ '
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
output = model.generate(
inputs["input_ids"],
max_new_tokens=200,
do_sample=True,
top_p=0.9,
temperature=0.1,
)
output = output[0].to("cpu")
print(tokenizer.decode(output))
استخدام استنتاج إنشاء النص ونقاط نهاية الاستدلال
إن استدلال إنشاء النص عبارة عن حاوية استدلال جاهزة للإنتاج تم تطويرها بواسطة Hugging Face لتمكين النشر السهل لنماذج اللغات الكبيرة. إنه يحتوي على ميزات مثل التجميع المستمر، وتدفق الرموز المميزة، وتوازي الموتر للاستدلال السريع على وحدات معالجة الرسومات المتعددة، والتسجيل والتتبع الجاهزين للإنتاج.
يمكنك تجربة استدلال إنشاء النص على البنية الأساسية الخاصة بك، أو يمكنك استخدام نقاط نهاية الاستدلال الخاصة بـ Hugging Face. لنشر نموذج Codellama 2، انتقل إلى صفحة النموذج وانقر على عنصر واجهة المستخدم Deploy -> Inference Endpoints.
- بالنسبة لنماذج 7B، ننصحك بتحديد “GPU [medium] – 1 × نفيديا A10G.
- بالنسبة لنماذج 13B، ننصحك بتحديد “GPU [xlarge] – 1x نفيديا A100”.
- بالنسبة لطرز 34B، ننصحك بتحديد “GPU [1xlarge] – 1x نفيديا A100 مع
bitsandbytesتم تمكين التكميم أو “GPU [2xlarge] – 2x نفيديا A100”
ملاحظة: قد تحتاج إلى طلب ترقية الحصة عبر البريد الإلكتروني إلى api-enterprise@huggingface.co للوصول إلى A100s
يمكنك معرفة المزيد حول كيفية نشر LLMs باستخدام Hugging Face Inference Endpoints في مدونتنا. تتضمن المدونة معلومات حول المعلمات الفائقة المدعومة وكيفية بث استجابتك باستخدام Python وJavascript.
باستخدام ملحق VS Code
يعد الإكمال التلقائي لرمز HF امتدادًا لرمز VS لاختبار نماذج إكمال التعليمات البرمجية مفتوحة المصدر. تم تطوير الامتداد كجزء من مشروع StarCoder وتم تحديثه لدعم النموذج الأساسي متوسط الحجم، Code Llama 13B. تعرف على المزيد هنا حول كيفية تثبيت الامتداد وتشغيله باستخدام Code Llama.

تقييم
عادةً ما يتم قياس نماذج اللغة للتعليمات البرمجية على مجموعات بيانات مثل HumanEval. وهو يتألف من تحديات برمجية حيث يتم تقديم النموذج مع توقيع دالة وسلسلة مستندات ويتم تكليفه بإكمال نص الوظيفة. يتم بعد ذلك التحقق من الحل المقترح عن طريق تشغيل مجموعة من اختبارات الوحدة المحددة مسبقًا. وأخيرًا، يتم الإبلاغ عن معدل النجاح الذي يصف عدد الحلول التي اجتازت جميع الاختبارات. يصف معدل pass@1 عدد المرات التي ينشئ فيها النموذج حلاً ناجحًا عند الحصول على طلقة واحدة بينما يصف pass@10 عدد المرات التي يمرر فيها حل واحد على الأقل من بين 10 مرشحين مقترحين.
في حين أن HumanEval هو معيار Python، فقد بذلت جهود كبيرة لترجمته إلى المزيد من لغات البرمجة وبالتالي تمكين إجراء تقييم أكثر شمولاً. أحد هذه الأساليب هو MultiPL-E الذي يترجم HumanEval إلى أكثر من اثنتي عشرة لغة. نحن نستضيف لوحة صدارة للأكواد متعددة اللغات بناءً عليها للسماح للمجتمع بمقارنة النماذج عبر اللغات المختلفة لتقييم النموذج الذي يناسب حالة الاستخدام بشكل أفضل.
| نموذج | رخصة | مجموعة البيانات معروفة | الاستخدام التجاري؟ | طول ما قبل التدريب [tokens] | بايثون | جافا سكريبت | المتصدرين متوسط النتيجة |
|---|---|---|---|---|---|---|---|
| كود لاما-34B | رخصة لاما 2 | ❌ | ✅ | 2500 ب | 45.11 | 41.66 | 33.89 |
| كود لاما-13B | رخصة لاما 2 | ❌ | ✅ | 2500 ب | 35.07 | 38.26 | 28.35 |
| كود لاما-7B | رخصة لاما 2 | ❌ | ✅ | 2500 ب | 29.98 | 31.8 | 24.36 |
| CodeLlaMa-34B-بايثون | رخصة لاما 2 | ❌ | ✅ | 2620 ب | 53.29 | 44.72 | 33.87 |
| CodeLlaMa-13B-Python | رخصة لاما 2 | ❌ | ✅ | 2620 ب | 42.89 | 40.66 | 28.67 |
| CodeLlaMa-7B-بايثون | رخصة لاما 2 | ❌ | ✅ | 2620 ب | 40.48 | 36.34 | 23.5 |
| CodeLlaMa-34B-Instruct | رخصة لاما 2 | ❌ | ✅ | 2620 ب | 50.79 | 45.85 | 35.09 |
| CodeLlaMa-13B-Instruct | رخصة لاما 2 | ❌ | ✅ | 2620 ب | 50.6 | 40.91 | 31.29 |
| CodeLlaMa-7B-Instruct | رخصة لاما 2 | ❌ | ✅ | 2620 ب | 45.65 | 33.11 | 26.45 |
| ستاركودر-15ب | BigCode-OpenRail-M | ✅ | ✅ | 1,035 ب | 33.57 | 30.79 | 22.74 |
| ستاركودربيس-15B | BigCode-OpenRail-M | ✅ | ✅ | 1000 ب | 30.35 | 31.7 | 22.4 |
| ويزاردكودر-15B | BigCode-OpenRail-M | ❌ | ✅ | 1,035 ب | 58.12 | 41.91 | 32.07 |
| أوكتوكودر-15B | BigCode-OpenRail-M | ✅ | ✅ | 1000 ب | 45.3 | 32.8 | 24.01 |
| كود جي إكس-2-6ب | ترخيص CodeGeeX | ❌ | ❌ | 2000 ب | 33.49 | 29.9 | 21.23 |
| CodeGen-2.5-7B-مونو | أباتشي-2.0 | ✅ | ✅ | 1400 ق | 45.65 | 23.22 | 12.1 |
| CodeGen-2.5-7B-متعدد | أباتشي-2.0 | ✅ | ✅ | 1400 ق | 28.7 | 26.27 | 20.04 |
ملحوظة: تم الحصول على النتائج الواردة في الجدول أعلاه من لوحة صدارة الكود الخاصة بنا في وقت النشر. تتغير النتائج مع إصدار نماذج جديدة، لأنه تتم مقارنة النماذج ببعضها البعض. لمزيد من التفاصيل، يرجى الرجوع إلى المتصدرين.
موارد إضافية