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

تبديل المحولات

الفكرة الكامنة وراء تبديل المحوّل (adapter) على النحو التالي: يمكننا بالفعل تحميل عدة محوّلات، مثل محوّلي LoRA، في الوقت نفسه. لكن في بعض الأحيان، نرغب في تحميل محوّل LoRA ثم استبدال أوزانه في مكانه بأوزان محوّل LoRA آخر. وهذا ممكن الآن عبر الدالة hotswap_adapter.

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

مثال بدون torch.compile

import torch
from transformers import AutoModelForCausalLM
from peft import PeftModel
from peft.utils.hotswap import hotswap_adapter

model_id = ...
inputs = ...
device = ...
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)

# load lora 0
model = PeftModel.from_pretrained(model, <path-adapter-0>)
with torch.inference_mode():
    output_adapter_0 = model(inputs)

# replace the "default" lora adapter with the new one
hotswap_adapter(model, <path-adapter-1>, adapter_name="default", torch_device=device)
with torch.inference_mode():
    output_adapter_1 = model(inputs).logits

مثال باستخدام torch.compile

import torch
from transformers import AutoModelForCausalLM
from peft import PeftModel
from peft.utils.hotswap import hotswap_adapter, prepare_model_for_compiled_hotswap

model_id = ...
inputs = ...
device = ...
max_rank = ...  # maximum rank among all LoRA adapters that will be used
model = AutoModelForCausalLM.from_pretrained(model_id).to(device)

# load lora 0
model = PeftModel.from_pretrained(model, <path-adapter-0>)
# Prepare the model to allow hotswapping even if ranks/scalings of 2nd adapter differ.
# You can skip this step if all ranks and scalings are identical.
prepare_model_for_compiled_hotswap(model, target_rank=max_rank)
model = torch.compile(model)
with torch.inference_mode():
    output_adapter_0 = model(inputs)

# replace the "default" lora adapter with the new one
hotswap_adapter(model, <path-adapter-1>, adapter_name="default", torch_device=device)
with torch.inference_mode():
    output_adapter_1 = model(inputs).logits

لاحظ أنه إذا كنت ترغب في تبديل الأوزان التي أُضيفت عبر target_parameters، أي تلك التي تستهدف nn.Parameter مباشرةً، فلا يمكن منع إعادة التجميع و/أو انقطاع الرسم البياني. لذلك، يُوصى بتجنب استخدام target_parameters مع النماذج المُجمّعة وتبديل الأوزان.

ملاحظات

يعمل تبديل النماذج الساخن مع نماذج transformers ونماذج diffusers. ومع ذلك، هناك بعض التحذيرات:

  • حالياً، يتم دعم LoRA بشكل صحيح فقط.
  • يعمل فقط مع نفس طريقة PEFT، لذا لا يمكن التبديل بين LoRA وLoHa، على سبيل المثال.
  • يجب أن يستهدف المُكيّف الذي يتم استبداله نفس الطبقات التي يستهدفها المُكيّف السابق أو مجموعة فرعية من تلك الطبقات. ولا يمكنه استهداف طبقات جديدة. لذلك، إن أمكن، ابدأ بالمُكيّف الذي يستهدف أكبر عدد من الطبقات.

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

peft.utils.hotswap.hotswap_adapter

< >

( model: torch.nn.Modulemodel_name_or_path: stradapter_name: strtorch_device: Optional[str] = None**kwargs )

المعاملات

  • model (~PeftModel) — نموذج PEFT مع المُكيّف المحمّل.
  • model_name_or_path (str) — اسم أو مسار النموذج الذي سيتم تحميل المُكيِّف الجديد منه.
  • adapter_name (str) — اسم المُكيّف الذي سيتم استبداله، مثل "default". سيظل الاسم كما هو بعد الاستبدال.
  • torch_device — (str، اختياري، القيمة الافتراضية هي None): الجهاز الذي سيتم تحميل المُكيّف الجديد عليه.
  • **kwargs (optional) — معلمات إضافية بالمفتاح تُستخدم لتحميل الإعدادات والأوزان.

استبدل بيانات المُكيّف القديمة ببيانات المُكيّف الجديدة، مع إبقاء الباقي كما هو.

حتى الآن، يتم دعم LoRA فقط.

تُعد هذه الدالة مفيدة عندما ترغب في استبدال المُكيّف المحمّل بمُكيّف جديد. سيبقى اسم المُكيّف كما هو، لكن الأوزان ومعظم المعلمات الأخرى ستُستبدل.

إذا كانت المُكيّفات غير متوافقة، على سبيل المثال إذا كانت تستهدف طبقات مختلفة أو كانت قيم ألفا الخاصة بها مختلفة، فسيتم رفع خطأ.

مثال:

>>> import torch
>>> from transformers import AutoModelForCausalLM
>>> from peft import PeftModel
>>> from peft.utils.hotswap import hotswap_adapter

>>> model_id = ...
>>> inputs = ...
>>> device = ...
>>> model = AutoModelForCausalLM.from_pretrained(model_id).to(device)

>>> # load lora 0
>>> model = PeftModel.from_pretrained(model, "path-adapter-0")
>>> model = torch.compile(model)  # optionally compile the model
>>> with torch.inference_mode():
...     output_adapter_0 = model(inputs)

>>> # replace the "default" lora adapter with the new one
>>> hotswap_adapter(model, "path-adapter-1", adapter_name="default", torch_device=device)
>>> with torch.inference_mode():
...     output_adapter_1 = model(inputs).logits

peft.utils.hotswap.hotswap_adapter_from_state_dict

< >

( model: torch.nn.Modulestate_dict: dict[str, torch.Tensor]adapter_name: strconfig: LoraConfigparameter_prefix: str = 'lora_' )

المعاملات

  • model (nn.Module) — النموذج مع المُكيّف المحمّل.
  • state_dict (dict[str, torch.Tensor]) — قائمة الحالة الخاصة بالمُكيّف الجديد، والتي يجب أن تكون متوافقة (تستهدف نفس الوحدات وما إلى ذلك).
  • adapter_name (str) — اسم المُكيّف الذي يجب استبداله بشكل فوري، مثل "default". سيبقى الاسم نفسه بعد الاستبدال.
  • config (LoraConfig) — إعدادات مُكيّف LoRA. تُستخدم لتحديد معامل التوسيع (scaling) والرتبة (rank) للمُكيّف.
  • parameter_prefix (str، اختياري، القيمة الافتراضية "lora_") — البادئة المستخدمة لتحديد مفاتيح المُكيّف في قاموس الحالة. في حالة LoRA، تكون هذه البادئة "lora_" (القيمة الافتراضية).

يرفع

RuntimeError

  • RuntimeError — إذا لم يكن المُكيّف القديم والمُكيّف الجديد متوافقين، يتم رفع خطأ RuntimeError.

استبدل أوزان المُكيّف في النموذج بالأوزان من state_dict.

حتى الآن، يتم دعم LoRA فقط.

This is a low-level function that assumes that the adapters have been checked for compatibility and that the state_dict has been correctly mapped to work with PEFT. For a high level function that performs this work for you, use hotswap_adapter instead.

Update on GitHub