PEFT 文件

可訓練詞元 (Trainable Tokens)

Hugging Face's logo
加入 Hugging Face 社群

並獲得增強的文件體驗

開始使用

可訓練詞元 (Trainable Tokens)

可訓練詞元 (Trainable Tokens) 方法提供了一種針對特定詞元嵌入進行微調的方式,而無需訓練整個嵌入矩陣或在嵌入矩陣上使用介面卡。它基於此處的初始實現

該方法只針對特定的詞元,並選擇性地訓練您指定的詞元索引。因此,所需的記憶體 (RAM) 會更低,磁碟儲存空間也顯著低於儲存完整的微調嵌入矩陣。

透過此指令碼獲取的一些初步基準測試表明,對於 gemma-2-2b(它有一個相當大的嵌入矩陣),使用可訓練詞元 (Trainable Tokens) 比完全微調嵌入矩陣可以節省約 4 GiB 的視訊記憶體。雖然 LoRA 會使用相當數量的視訊記憶體,但它也可能針對您不希望更改的詞元。請注意,這些只是指示性資料,不同的嵌入矩陣大小可能會使這些數字有所偏差。

請注意,此方法不會為您新增詞元,您必須自己將詞元新增到分詞器 (tokenizer) 中,並相應地調整模型的嵌入矩陣大小。此方法只會重新訓練您指定的詞元的嵌入。此方法也可以與 LoRA 層結合使用!請參閱 LoRA 開發者指南

在使用 save_pretrained() 儲存模型或使用 get_peft_model_state_dict() 檢索狀態字典時,如果添加了新詞元,可能會儲存完整的嵌入矩陣而不是僅儲存差異,這是一種預防措施,因為嵌入矩陣的大小已更改。為節省空間,您可以在呼叫 save_pretrained 時透過設定 save_embedding_layers=False 來停用此行為。只要您不同時透過其他方式修改嵌入矩陣,這樣做是安全的,因為此類更改不會被可訓練詞元追蹤到。

TrainableTokensConfig

class peft.TrainableTokensConfig

< >

( task_type: typing.Union[str, peft.utils.peft_types.TaskType, NoneType] = None peft_type: typing.Union[str, peft.utils.peft_types.PeftType, NoneType] = None auto_mapping: typing.Optional[dict] = None base_model_name_or_path: typing.Optional[str] = None revision: typing.Optional[str] = None inference_mode: bool = False token_indices: list[int] = <factory> target_modules: Optional[Union[list[str], str]] = None init_weights: bool = True )

引數

  • token_indices (list[int]) — 整數列表,表示您希望可訓練的詞元的索引。要查詢詞元的索引,您可以使用分詞器對字串進行分詞,並檢視返回的 input_ids。索引數量越接近詞元總數,此方法的效率就越低。
  • target_modules (Optional[Union[list[str], str]]) — 要替換為我們的 TrainableTokensLayer 的模組名稱列表或模組名稱的正則表示式。如果未定義,它將嘗試獲取模型的輸入嵌入層(如果模型有 get_input_embeddings 方法,transformer 模型通常有),如果失敗,則預設為 ‘embed_tokens’。其他示例目標是 embeddingencoder.embeddingsdecoder.embeddings
  • init_weights (bool) — 預設情況下,新詞元的權重初始化為與相應詞元嵌入相同。這使得 TrainableTokens 在未訓練時是無操作的。如果設定為 False,權重將是隨機值。除非您確切知道自己在做什麼,否則不要更改此設定。

TrainableTokens 方法的配置。

允許訓練新詞元(並重新訓練現有詞元)而無需訓練完整的嵌入矩陣。透過將少數選定的詞元(透過其索引識別)標記為可訓練,並保持其餘部分不變,此方法可用於新增新詞元或更改現有詞元的嵌入,同時節省記憶體。與完全訓練嵌入矩陣相比,儲存和工作記憶體的使用都減少了。

請注意,使用 FSDP/DeepSpeed 進行訓練可能尚未完全支援。

TrainableTokensModel

class peft.TrainableTokensModel

< >

( model peft_config: Union[PeftConfig, dict[str, PeftConfig]] adapter_name: str low_cpu_mem_usage: bool = False state_dict: Optional[dict[str, torch.Tensor]] = None )

disable_adapter_layers

< >

( )

停用所有介面卡。

停用所有介面卡後,模型輸出對應於基礎模型的輸出。

enable_adapter_layers

< >

( )

啟用所有介面卡。

如果您之前停用了所有介面卡並希望重新啟用它們,請呼叫此函式。

merge_and_unload

< >

( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )

引數

  • progressbar (bool) — 是否顯示指示解除安裝和合並過程的進度條
  • safe_merge (bool) — 是否啟用安全合併檢查,以檢查介面卡權重中是否存在潛在的 Nan 值
  • adapter_names (List[str], 可選) — 應該合併的介面卡名稱列表。如果為 None,則將合併所有活動的介面卡。預設為 None

此方法將訓練過的詞元合併到基礎模型的目標嵌入層中。如果有人想將基礎模型用作獨立模型,則需要這樣做。

set_adapter

< >

( adapter_name: str | list[str] )

引數

  • adapter_name (strlist[str]) — 要啟用的介面卡的名稱。

設定活動的介面卡。

此外,此函式將把指定的介面卡設定為可訓練的(即 requires_grad=True)。如果不希望如此,請使用以下程式碼。

>>> for name, param in model_peft.named_parameters():
...     if ...:  # some check on name (ex. if 'lora' in name)
...         param.requires_grad = False

unload

< >

( )

透過移除所有可訓練詞元模組來恢復基礎模型,而不進行合併。

< > 在 GitHub 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.