PEFT documentation

رموز قابلة للتدريب

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

رموز قابلة للتدريب

توفر طريقة الرموز القابلة للتدريب (Trainable Tokens) وسيلةً لاستهداف تضمينات رموز محددة أثناء الضبط الدقيق دون الحاجة إلى تدريب مصفوفة التضمين الكاملة أو استخدام مُكيّف (adapter) على مصفوفة التضمين. وهي مبنية على التنفيذ الأولي المتاح هنا.

يستهدف هذا الأسلوب الرموز المحددة فقط ويدرب بشكل انتقائي فهارس الرموز التي تحددها. ونتيجة لذلك، ستكون ذاكرة الوصول العشوائي المطلوبة أقل، كما أن مساحة التخزين على القرص أقل بكثير من تخزين مصفوفة التضمين المُحسَّنة بالكامل.

تُشير بعض النتائج الأولية المُستخلصة باستخدام هذا السكربت إلى أنه بالنسبة إلى gemma-2-2b (الذي يحتوي على مصفوفة تضمين كبيرة نسبياً) يمكنك توفير حوالي 4 GiB من ذاكرة VRAM باستخدام Trainable Tokens بدلاً من ضبط مصفوفة التضمين بالكامل. بينما سيستهلك LoRA كميات مماثلة من ذاكرة VRAM، فقد يستهدف أيضاً رموزاً لا ترغب في تغييرها. لاحظ أن هذه مجرد مؤشرات، وقد تُسبب اختلافات حجم مصفوفة التضمين انحرافاً طفيفاً في هذه الأرقام.

لاحظ أن هذه الطريقة لا تضيف الرموز (tokens) نيابةً عنك، بل عليك إضافة الرموز إلى مُجزّئ النص (tokenizer) بنفسك وتغيير حجم مصفوفة التضمين (embedding matrix) للنموذج وفقًا لذلك. ستقوم هذه الطريقة بإعادة تدريب التضمينات للرموز التي تحددها فقط. يمكن أيضًا استخدام هذه الطريقة بالتزامن مع طبقات LoRA! راجع توثيق LoRA.

قد يؤدي حفظ النموذج باستخدام save_pretrained() أو استرداد قاموس الحالة باستخدام get_peft_model_state_dict() عند إضافة رموز جديدة إلى حفظ مصفوفة التضمين الكاملة بدلاً من الفرق فقط، كإجراء احترازي لأن مصفوفة التضمين تم تغيير حجمها. لحفظ المساحة، يمكنك تعطيل هذا السلوك عن طريق تعيين save_embedding_layers=False عند استدعاء save_pretrained. وهذا آمن ما لم تقم بتعديل مصفوفة التضمين بوسائل أخرى أيضاً، لأن مثل هذه التغييرات لن يتم تتبعها بواسطة الرموز القابلة للتدريب.

نظرة عامة على الاختبارات

واجهة برمجة التطبيقات

TrainableTokensConfig

فئة peft.TrainableTokensConfig

< >

( task_type: Optional[Union[str, TaskType]] = Nonepeft_type: Optional[Union[str, PeftType]] = Noneauto_mapping: Optional[dict] = Nonepeft_version: Optional[str] = Nonebase_model_name_or_path: Optional[str] = Nonerevision: Optional[str] = Noneinference_mode: bool = Falsetoken_indices: list[int] = <factory>target_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool = True )

المعاملات

  • token_indices (list[int]) — قائمة من الأعداد الصحيحة، تدل على فهارس الرموز التي تريد أن تكون قابلة للتدريب. للعثور على فهرس رمز معين باستخدام مُجزِّئ الرموز (tokenizer)، يمكنك تجزئة النص ثم الاطلاع على input_ids المُعاد. كلما اقترب عدد الفهارس من إجمالي عدد الرموز، قلّت كفاءة هذه الطريقة.
  • target_modules (Optional[Union[list[str], str]]) — قائمة بأسماء الوحدات أو تعبير نمطي (regex) لأسماء الوحدات التي سيتم استبدالها بطبقة TrainableTokensLayer الخاصة بنا. إذا لم يتم تعريفها، فسيحاول الحصول على طبقة التضمين المدخلة للنموذج إذا كان للنموذج طريقة get_input_embeddings (عادةً ما تمتلك نماذج التحويل هذه الطريقة)، وإذا فشلت هذه المحاولة فإن القيمة الافتراضية هي ‘embed_tokens’. من أمثلة الأهداف الأخرى embedding، encoder.embeddings أو decoder.embeddings.
  • init_weights (bool) — بشكل افتراضي، يتم تهيئة أوزان الرمز الجديد لتكون مطابقة لتضمينات الرمز المقابلة. وهذا يجعل TrainableTokens إجراءً لا يؤثر على النموذج عندما لا يتم تدريبه. إذا تم ضبطه على False فستكون الأوزان قيمًا عشوائية. لا تغيّر هذا الإعداد ما لم تكن على دراية تامة بما تفعله.

إعدادات طريقة TrainableTokens.

يتيح تدريب رموز جديدة (إعادة تدريب الرموز الموجودة) دون تدريب مصفوفة التضمين بالكامل. من خلال تحديد عدد قليل من الرموز المختارة (المعرّفة بمؤشراتها) لتكون قابلة للتدريب وترك الباقي دون تغيير، يمكن استخدام هذه الطريقة لإضافة رموز جديدة أو تغيير تضمين الرموز الموجودة مع توفير في الذاكرة. يتم تقليل كل من مساحة التخزين واستخدام الذاكرة العاملة مقارنةً بتدريب مصفوفة التضمين بالكامل.

لاحظ أن التدريب باستخدام FSDP/DeepSpeed قد لا يكون مدعوماً بالكامل بعد.

TrainableTokensModel

فئة peft.TrainableTokensModel

< >

( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )

Update on GitHub