PEFT documentation
تبديل المحولات
تبديل المحولات
الفكرة الكامنة وراء تبديل المحوّل (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
< source >( 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).logitspeft.utils.hotswap.hotswap_adapter_from_state_dict
< source >( 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.