PEFT documentation
رموز قابلة للتدريب
رموز قابلة للتدريب
توفر طريقة الرموز القابلة للتدريب (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
< source >( 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
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None )