PEFT 文件
可訓練詞元 (Trainable Tokens)
並獲得增強的文件體驗
開始使用
可訓練詞元 (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’。其他示例目標是embedding
、encoder.embeddings
或decoder.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 )
merge_and_unload
< 源 >( progressbar: bool = False safe_merge: bool = False adapter_names: Optional[list[str]] = None )
此方法將訓練過的詞元合併到基礎模型的目標嵌入層中。如果有人想將基礎模型用作獨立模型,則需要這樣做。
設定活動的介面卡。
此外,此函式將把指定的介面卡設定為可訓練的(即 requires_grad=True)。如果不希望如此,請使用以下程式碼。
透過移除所有可訓練詞元模組來恢復基礎模型,而不進行合併。