PEFT documentation
VB-LoRA: ベクトルバンクによる極端なパラメータ効率のファインチューニング
VB-LoRA: ベクトルバンクによる極端なパラメータ効率のファインチューニング
概要
VB-LoRAは、LoRAを拡張したパラメータ効率の良いファインチューニング手法です。サブベクトルレベルで細粒度のパラメータ共有スキームを学習することで、大幅に高いパラメータ効率を実現します。これにより、ストレージや伝送コストが重要なシナリオで特に有用になります。K、Q、V、FFNなどの異なるレイヤーやモジュールから得られる低ランク行列をサブベクトルに分解し、それらをベクトルバンクを通じてグローバルに共有することで機能します。
論文の抄録は以下の通りです:
大規模言語モデルの採用が拡大し、ユーザー単位やタスク単位でのモデルのカスタマイズの必要性が高まる中、低ランク適応(LoRA)とそのバリアントのようなパラメータ効率の良いファインチューニング(PEFT)手法は、膨大なストレージおよび伝送コストを発生させます。保存されるパラメータをさらに削減するために、本研究では「分割と共有」のパラダイムを導入します。このパラダイムは、ベクトルバンクを介してパラメータをグローバルに共有することで、行列次元、モジュール、レイヤーをまたぐ低ランク分解の障壁を打ち破ります。このパラダイムをLoRAに適用した具体例として、提案するVB-LoRAは、微分可能なトップk混合モジュールを用いて、共有ベクトルバンクからLoRAのすべての低ランク行列を合成します。VB-LoRAは、最先端のPEFT手法と比較して同等以上の性能を維持しながら、極端なパラメータ効率を実現します。広範な実験により、自然言語理解、自然言語生成、および指示チューニングタスクにおけるVB-LoRAの有効性が示されました。Llama2-13Bモデルのファインチューニングにおいて、VB-LoRAはLoRAの保存パラメータのわずか0.4%しか使用しませんが、より優れた結果を達成します。
使用のコツ
VB-LoRAは、共有メカニズムを学習するためにスパースなtop-kモジュールを利用します。アダプタのパラメータを保存する際、
VBLoRAConfigでsave_only_topk_weights = Trueを設定してtop-kの重みとそのインデックスのみを保存するか、Falseに設定してすべての学習可能なlogitsを保存するかのいずれかを選択できます。save_only_topk_weights = Trueを有効にすると、ストレージ容量が大幅に削減されます。例えば、Llama2-7Bでは、ストレージファイルサイズが308MBから2.5MBに減少します。なお、save_only_topk_weights = Trueで保存されたモデルは、マージまたは推論のみを目的としており、トレーニングの再開には使用できません。VB-LoRAには、ベクトルバンクのパラメータとlogitのパラメータという2つの学習パラメータセットがあります。実際には、logitのパラメータにはより高い学習率が必要であり、ベクトルバンクのパラメータにはより低い学習率が必要であることがわかりました。オプティマイザーを使用する場合、logitの典型的な学習率は0.01、ベクトルバンクのパラメータの典型的な学習率は0.001です。
ベンチマーク概要
API
VBLoRAConfig
クラス peft.VBLoRAConfig
< 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 = Falser: int = 4num_vectors: int = 256vector_length: int = 256topk: int = 2target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonesave_only_topk_weights: bool = Falsevblora_dropout: float = 0.0fan_in_fan_out: bool = Falsebias: str = 'none'modules_to_save: Optional[list[str]] = Noneinit_vector_bank_bound: float = 0.02init_logits_std: float = 0.1layers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = None )
パラメータ
- r (
int) — 増分行列のランクです。 - num_vectors (
int) — ベクトルバンク内のベクトル数。モデルサイズが大きくなる場合は、より大きな値を使用してください。 - vector_length (
int) — ベクトルバンク内のベクトルの長さです。ベクトルの長さは、モデルの隠れ次元で割り切れる必要があります。 - topk (
int) — top-K 選択における K の値です。K の値を大きくすると、保存されるモデルのサイズが大きくなります。実際には、K=2 に設定するのが、パフォーマンスとパラメータ効率の両面で最も良い結果をもたらす傾向があります。詳細については、論文内の議論を参照してください。 - target_modules (
Union[List[str], str]) — アダプタを適用するモジュールの名前です。このパラメータが指定されている場合、指定された名前のモジュールのみが置き換えられます。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。このパラメータが ‘all-linear’ として指定されている場合、出力層を除くすべての linear/Conv1D モジュールが選択されます。このパラメータが指定されていない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、ターゲットモジュールを手動で指定する必要があります。 - exclude_modules (
Optional[Union[List[str], str]]) — アダプタを適用しないモジュールの名前。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。 - save_only_topk_weights (
bool) — 上位k個の重みのみを保存するかどうか。save_only_topk_weights = Trueに設定すると、ストレージ容量を大幅に削減できます。ただし、このモードで保存されたモデルは、マージや推論には使用できますが、トレーニングの再開には使用できません。 - vblora_dropout (
float) — VBLoRA層のドロップアウト確率です。 - fan_in_fan_out (
bool) — 置き換えるレイヤーが重みを (fan_in, fan_out) の形式で保存している場合は、これを True に設定してください。例えば、gpt-2 は重みを (fan_in, fan_out) の形式で保存するConv1Dを使用しているため、これをTrueに設定する必要があります。 - bias (
str) — VBLoRA のバイアスタイプです。‘none’、‘all’、‘vblora_only’ のいずれかを指定できます。‘all’ または ‘vblora_only’ を指定した場合、対応するバイアスが学習中に更新されます。この設定により、アダプターを無効にしても、適応なしのベースモデルが生成する出力と同一の結果は得られない点にご注意ください。 - modules_to_save (
List[str]) — VBLoRA レイヤー以外で、学習可能に設定し、最終的なチェックポイントに保存するモジュールのリスト。 - init_vector_bank_bound (
float) — ベクトルバンクは、-init_vector_bank_bound と init_vector_bank_bound の間の一様分布で初期化されます。ゼロ勾配を防ぐため、ベクトルバンクをすべてゼロで初期化することは避けてください。0.02 のような小さな値が通常効果的です。大きな値で初期化すると、トレーニングが不安定になる可能性があります。 - init_logits_std (
float) — logits は、標準偏差が init_logits_std の正規分布で初期化されます。デフォルト値は 0.1 です。 - layers_to_transform (
Union[List[int],int]) — 変換対象のレイヤーのインデックスです。int のリストが渡された場合、このリストで指定されたレイヤーのインデックスにアダプターが適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに変換が適用されます。 - layers_pattern (
Optional[Union[List[str], str]]) —layers_to_transformがNoneと異なる場合にのみ使用されるレイヤーパターン名です。これはモデルのnn.ModuleListを対象とすべきで、通常は'layers'または'h'と呼ばれます。
これは、VBLoRAModelの設定を保存するための設定クラスです。
VBLoRAModel
クラス peft.VBLoRAModel
< source >( modelpeft_config: Union[PeftConfig, dict[str, PeftConfig]]adapter_name: strlow_cpu_mem_usage: bool = Falsestate_dict: Optional[dict[str, torch.Tensor]] = None ) → torch.nn.Module
パラメータ
- model (PreTrainedModel) — 適応させる対象のモデル。
- config (VBLoRAConfig) — VBLoRAモデルの設定です。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
VBLoRAモデル。
事前学習済みのTransformersモデルからVBLoRAモデルを作成します。
この手法の詳細は、https://huggingface.co/papers/2405.15179に記載されています。
例:
>>> from transformers import AutoModelForCausalLM
>>> from peft import VBLoRAConfig, get_peft_model
>>> base_model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m")
>>> config = VBLoRAConfig(
... task_type="SEQ_CLS",
... r=4,
... target_modules=["fc1", "fc2", "k_proj", "out_proj", "q_proj", "v_proj"],
... num_vectors=60,
... vector_length=256,
... save_only_topk_weights=True,
... )
>>> model = get_peft_model(base_model, config)属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (VBLoRAConfig): VBLoRAConfig モデルの設定。
保存可能なVB-LoRAパラメータおよびその他の保存可能なパラメータの数を返します。
保存可能なVB-LoRAパラメータの数と、保存可能なパラメータの総数を出力します。