Transformers documentation
CodeLlama
نُشر هذا النموذج في أوراق HF في 24 أغسطس 2023، وأُضيف إلى مكتبة Hugging Face Transformers في 25 أغسطس 2023.
CodeLlama
Code Llama هو عائلة متخصصة من نماذج اللغة الكبيرة المبنية على Llama 2 لمهام البرمجة. يتوفر بعدة أشكال: الكود العام، وكود Python تحديداً، ومتغير متبع للتعليمات، وكلها متاحة بحجم 7B و13B و34B و70B من المعاملات. يمكن لنماذج Code Llama توليد الشرح وحتى ملء الأجزاء الناقصة من الكود (يُعرف هذا بـ “infilling”). كما يمكنه التعامل مع سياقات طويلة جداً مع توليد مستقر يصل إلى 100k رمز، على الرغم من أنه تم تدريبه على تسلسلات من 16K رمز.
يمكنك العثور على جميع نقاط التفتيش الأصلية لـ Code Llama ضمن مجموعة Code Llama.
انقر على نماذج Code Llama في الشريط الجانبي الأيمن لمزيد من الأمثلة حول كيفية تطبيق Code Llama على مهام البرمجة المختلفة.
يُبيّن المثال أدناه كيفية توليد الشيفرة باستخدام Pipeline، أو AutoModel، أو من سطر الأوامر.
from transformers import pipeline
pipe = pipeline(
"text-generation",
model="meta-llama/CodeLlama-7b-hf",
device_map=0
)
# basic code generation
result = pipe("# Function to calculate the factorial of a number\ndef factorial(n):", max_new_tokens=256)
print(result[0]['generated_text'])
# infilling
infill_result = pipe("def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result", max_new_tokens=200)
print(infill_result[0]['generated_text'])from transformers import AutoModelForCausalLM, AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-7b-hf",
device_map="auto",
attn_implementation="sdpa"
)
# basic code generation
prompt = "# Function to calculate the factorial of a number\ndef factorial(n):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(
**input_ids,
max_new_tokens=256,
cache_implementation="static"
)
print(tokenizer.decode(output[0], skip_special_tokens=True))
# infilling
infill_prompt = "def remove_non_ascii(s: str) -> str:\n \"\"\" <FILL_ME>\n return result"
input_ids = tokenizer(infill_prompt, return_tensors="pt").to(model.device)
filled_output = model.generate(**input_ids, max_new_tokens=200)
filled_text = tokenizer.decode(filled_output[0], skip_special_tokens=True)
print(filled_text)تقلل عملية التكميم العبء على الذاكرة في النماذج الكبيرة من خلال تمثيل الأوزان بدقة أقل. راجع نظرة عامة على التكميم للاطلاع على المزيد من واجهات التكميم المتاحة.
يستخدم المثال أدناه bitsandbytes لاختزال الأوزان إلى 4 بتات فقط.
# pip install bitsandbytes
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig, CodeLlamaTokenizer
bnb_config = BitsAndBytesConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_quant_type="nf4", bnb_4bit_use_double_quant=True)
tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-34b-hf")
model = AutoModelForCausalLM.from_pretrained(
"meta-llama/CodeLlama-34b-hf",
device_map="auto",
quantization_config=bnb_config
)
prompt = "# Write a Python function to check if a string is a palindrome\ndef is_palindrome(s):"
input_ids = tokenizer(prompt, return_tensors="pt").to(model.device)
output = model.generate(**input_ids, max_new_tokens=200, cache_implementation="static")
print(tokenizer.decode(output[0], skip_special_tokens=True))استخدم AttentionMaskVisualizer لفهم أفضل للرموز التي يمكن للنموذج الانتباه إليها والتي لا يمكنه الانتباه إليها.
from transformers.utils.attention_visualizer import AttentionMaskVisualizer
visualizer = AttentionMaskVisualizer("meta-llama/CodeLlama-7b-hf")
visualizer("""def func(a, b):
return a + b""")
ملاحظات
يتوفر استيفاء النصوص فقط في النماذج الأساسية بحجم 7B و13B، وليس في نماذج Python أو Instruct أو 34B أو 70B.
استخدم الرمز
<FILL_ME>في المكان الذي تريد أن يُملأ فيه مدخلاتك. يقوم مُجزِّئ الرموز (tokenizer) بتقسيم هذا الرمز لإنشاء نص مدخلات منسّق يتبع نمط التدريب الأصلي. وهذا أكثر متانةً من إعداد النمط بنفسك.from transformers import LlamaForCausalLM, CodeLlamaTokenizer tokenizer = CodeLlamaTokenizer.from_pretrained("meta-llama/CodeLlama-7b-hf") model = LlamaForCausalLM.from_pretrained("meta-llama/CodeLlama-7b-hf", device_map="auto") PROMPT = '''def remove_non_ascii(s: str) -> str: """ <FILL_ME> return result ''' input_ids = tokenizer(PROMPT, return_tensors="pt").to(model.device)["input_ids"] generated_ids = model.generate(input_ids, max_new_tokens=128) filling = tokenizer.batch_decode(generated_ids[:, input_ids.shape[1]:], skip_special_tokens = True)[0] print(PROMPT.replace("<FILL_ME>", filling))استخدم
bfloat16للتدريب الإضافي أو الضبط الدقيق، وfloat16للاستدلال.لا يُستخدم حرف
BOSعند ترميز البادئة أو اللواحق لأغراض التعبئة، بل يُستخدم فقط في بداية كل موجه.المشفر هو نموذج ترميز زوج البايتات مبني على SentencePiece. أثناء فك الترميز، إذا كان الرمز الأول هو بداية الكلمة (على سبيل المثال، “Banana”)، فإن المشفر لا يضيف بادئة المسافة إلى السلسلة.
CodeLlamaTokenizer
فئة transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_token = '<unk>'bos_token = '<s>'eos_token = '</s>'prefix_token = '▁<PRE>'middle_token = '▁<MID>'suffix_token = '▁<SUF>'eot_token = '▁<EOT>'fill_token = '<FILL_ME>'additional_special_tokens = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
المعاملات
- clean_up_tokenization_spaces (
str، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب تنظيف المسافات بعد فك الترميز، ويتضمن التنظيف إزالة أي عناصر غير مرغوب فيها مثل المسافات الزائدة. - unk_token (
str، اختياري، القيمة الافتراضية"<unk>") — رمز المجهول. لا يمكن تحويل الرمز غير الموجود في المفردات إلى معرّف، لذا يُعيَّن هذا الرمز بدلاً منه. - bos_token (
str، اختياري، القيمة الافتراضية"<s>") — رمز بداية التسلسل الذي تم استخدامه أثناء التدريب المسبق. يمكن استخدامه كرمز لتصنيف التسلسل. - eos_token (
str، اختياري، القيمة الافتراضية"</s>") — رمز نهاية التسلسل. - prefix_token (
str، اختياري، القيمة الافتراضية"▁<PRE>") — رمز البادئة المستخدم للتعبئة. - middle_token (
str، اختياري، القيمة الافتراضية"▁<MID>") — الرمز الأوسط المستخدم لملء الفراغات. - suffix_token (
str، اختياري، القيمة الافتراضية"▁<SUF>") — رمز لاحقة يُستخدم لعملية الملء (infilling). - eot_token (
str، اختياري، القيمة الافتراضية"▁<EOT>") — رمز نهاية النص المستخدم لملء الفراغات. - fill_token (
str، اختياري، القيمة الافتراضية"<FILL_ME>") — الرمز المستخدم لتقسيم المدخلات بين البادئة واللاحقة. - additional_special_tokens (
list[str]، اختياري) — رموز خاصة إضافية يستخدمها مُجزّئ النص. - add_bos_token (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إضافة رمز بداية التسلسل في بداية التسلسلات. - add_eos_token (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب إضافة رمز نهاية التسلسل في نهاية التسلسلات. - use_default_system_prompt (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب استخدام موجه النظام الافتراضي لـ Llama أم لا. - add_prefix_space (
bool, اختياري) — ما إذا كان يجب إضافة مسافة أولية إلى المدخل أم لا. هذا يتيح التعامل مع الكلمة الأولى على أنها أي كلمة أخرى. - vocab (
strأوdictأوlist، اختياري) — قاموس مفردات مخصص. إذا لم يُقدَّم، يتم تحميل المفردات من vocab_file. - merges (
strأوlist، اختياري) — قائمة دمج مخصصة. إذا لم يتم تقديمها، يتم تحميل عمليات الدمج من merges_file. - vocab_file (
str، اختياري) — ملف SentencePiece (يحمل عادةً امتداد .model) يحتوي على المفردات اللازمة لإنشاء مُجزِّئ (tokenizer).
أنشئ مُرمِّز Llama. يعتمد على ترميز زوج البايت على مستوى البايت.
يستخدم هذا بشكل ملحوظ ByteFallback دون أي تطبيع.
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]إذا كنت ترغب في تغيير bos_token أو eos_token، فتأكد من تحديد قيمهما عند تهيئة النموذج، أو
استدعاء tokenizer.update_post_processor() للتأكد من أن المعالجة اللاحقة تتم بشكل صحيح (وإلا فإن
قيم الرمز الأول والرمز الأخير في التسلسل المُرمَّز لن تكون صحيحة). لمزيد من التفاصيل، راجع
توثيق [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
يرث هذا المُجزِّئ من PreTrainedTokenizerFast الذي يحتوي على معظم الطرق الرئيسية. ينبغي للمستخدمين الرجوع إلى هذه الفئة الأصلية لمزيد من المعلومات حول تلك الطرق. تتطابق التهيئة الافتراضية مع تهيئة meta-llama/CodeLlama-7b-Instruct-hf التي تدعم استكمال الأوامر.
get_special_tokens_mask
< source >( token_ids_0: list[int]token_ids_1: list[int] | None = Nonealready_has_special_tokens: bool = False ) → A list of integers in the range [0, 1]
المعاملات
- token_ids_0 — قائمة بالمعرّفات (IDs) للتسلسل (الذي قد يكون مُنسّقًا بالفعل).
- token_ids_1 — غير مستخدم عندما يكون
already_has_special_tokens=True. يجب أن يكون None في هذه الحالة. - already_has_special_tokens — ما إذا كانت التسلسلة منسّقة مسبقًا باستخدام الرموز الخاصة.
يعيد
قائمة من الأعداد الصحيحة في المدى [0, 1]
1 لرمز خاص، 0 لرمز التسلسل.
استرجاع معرّفات التسلسلات من قائمة الرموز التي لم تُضف إليها أي رموز خاصة.
للمُرمِّزات السريعة، تستدعي مُجمِّعات البيانات هذه الدالة مع already_has_special_tokens=True لبناء قناع فوق تسلسل مُنسَّق مسبقًا. في تلك الحالة، نحسب القناع عن طريق التحقق من العضوية في all_special_ids.
يحدّث المعالج اللاحق الأساسي بالرمز bos_token والرمز eos_token الحاليين.
CodeLlamaTokenizerFast
فئة transformers.CodeLlamaTokenizer
< source >( vocab: str | dict[str, int] | None = Nonemerges: str | list[str] | None = Noneclean_up_tokenization_spaces = Falseunk_token = '<unk>'bos_token = '<s>'eos_token = '</s>'prefix_token = '▁<PRE>'middle_token = '▁<MID>'suffix_token = '▁<SUF>'eot_token = '▁<EOT>'fill_token = '<FILL_ME>'additional_special_tokens = Noneuse_default_system_prompt: bool = Falseadd_prefix_space: bool | None = Trueadd_bos_token: bool = True**kwargs )
المعاملات
- clean_up_tokenization_spaces (
str، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب تنظيف المسافات بعد فك الترميز، ويتضمن التنظيف إزالة أي عناصر غير مرغوب فيها مثل المسافات الزائدة. - unk_token (
str، اختياري، القيمة الافتراضية"<unk>") — رمز المجهول. لا يمكن تحويل الرمز غير الموجود في المفردات إلى معرّف، لذا يُعيَّن هذا الرمز بدلاً منه. - bos_token (
str، اختياري، القيمة الافتراضية"<s>") — رمز بداية التسلسل الذي تم استخدامه أثناء التدريب المسبق. يمكن استخدامه كرمز لتصنيف التسلسل. - eos_token (
str، اختياري، القيمة الافتراضية"</s>") — رمز نهاية التسلسل. - prefix_token (
str، اختياري، القيمة الافتراضية"▁<PRE>") — رمز البادئة المستخدم للتعبئة. - middle_token (
str، اختياري، القيمة الافتراضية"▁<MID>") — الرمز الأوسط المستخدم لملء الفراغات. - suffix_token (
str، اختياري، القيمة الافتراضية"▁<SUF>") — رمز لاحقة يُستخدم لعملية الملء (infilling). - eot_token (
str، اختياري، القيمة الافتراضية"▁<EOT>") — رمز نهاية النص المستخدم لملء الفراغات. - fill_token (
str، اختياري، القيمة الافتراضية"<FILL_ME>") — الرمز المستخدم لتقسيم المدخلات بين البادئة واللاحقة. - additional_special_tokens (
list[str]، اختياري) — رموز خاصة إضافية يستخدمها مُجزّئ النص. - add_bos_token (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إضافة رمز بداية التسلسل في بداية التسلسلات. - add_eos_token (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب إضافة رمز نهاية التسلسل في نهاية التسلسلات. - use_default_system_prompt (
bool، اختياري، القيمة الافتراضيةFalse) — ما إذا كان يجب استخدام موجه النظام الافتراضي لـ Llama أم لا. - add_prefix_space (
bool, اختياري) — ما إذا كان يجب إضافة مسافة أولية إلى المدخل أم لا. هذا يتيح التعامل مع الكلمة الأولى على أنها أي كلمة أخرى. - vocab (
strأوdictأوlist، اختياري) — قاموس مفردات مخصص. إذا لم يُقدَّم، يتم تحميل المفردات من vocab_file. - merges (
strأوlist، اختياري) — قائمة دمج مخصصة. إذا لم يتم تقديمها، يتم تحميل عمليات الدمج من merges_file. - vocab_file (
str، اختياري) — ملف SentencePiece (يحمل عادةً امتداد .model) يحتوي على المفردات اللازمة لإنشاء مُجزِّئ (tokenizer).
أنشئ مُرمِّز Llama. يعتمد على ترميز زوج البايت على مستوى البايت.
يستخدم هذا بشكل ملحوظ ByteFallback دون أي تطبيع.
>>> from transformers import CodeLlamaTokenizer
>>> tokenizer = CodeLlamaTokenizer.from_pretrained("hf-internal-testing/llama-tokenizer")
>>> tokenizer.encode("Hello this is a test")
[1, 15043, 445, 338, 263, 1243]إذا كنت ترغب في تغيير bos_token أو eos_token، فتأكد من تحديد قيمتهما عند تهيئة النموذج، أو استدعاء tokenizer.update_post_processor() للتأكد من أن المعالجة اللاحقة تتم بشكل صحيح (وإلا فإن قيم الرمز الأول والرمز الأخير في التسلسل المُرمَّز لن تكون صحيحة). لمزيد من التفاصيل، راجع توثيق [post-processors] (https://huggingface.co/docs/tokenizers/api/post-processors).
يرث هذا المُجزِّئ من PreTrainedTokenizerFast الذي يحتوي على معظم الطرق الرئيسية. ينبغي للمستخدمين الرجوع إلى هذه الفئة الأصلية لمزيد من المعلومات حول تلك الطرق. تتطابق الإعدادات الافتراضية مع تلك الخاصة بـ meta-llama/CodeLlama-7b-Instruct-hf الذي يدعم استكمال الأوامر.
يحدّث المُطَبِّع للتأكد من احترام تنسيق الاستعلام الخاص بـ infilling. تنسيق infilling هو
ما يلي: إذا كان suffix_first
” <PRE> <SUF>{suf} <MID> {pre}”
وإلا:
” <PRE> {pre} <SUF>{suf} <MID>”
إذا تم تعيين reset إلى True، فإن normalizer وpost_processor يُعادان إلى سلوكهما "الطبيعي"، وهو إضافة مسافة بادئة للمُطَبِّع، وإضافة bos_token إلى النص المُدخل للمُعالِج اللاحق post_processor.