PEFT documentation
LayerNormのチューニング
LayerNormのチューニング
LayerNorm Tuning(LN Tuning)は、モデル内の LayerNorm レイヤーのパラメータのみをファインチューニングする PEFT の手法です。
論文では、この手法の性能を大規模言語モデルで検証し、学習可能なパラメータ数と GPU メモリ使用量を大幅に削減しながらも高い性能を達成できることを示しています。
ただし、この手法は言語モデルに限定されず、LayerNorm レイヤーを使用するあらゆるモデルに適用できます。
この実装では、デフォルトでモデル内のすべての LayerNorm レイヤーがファインチューニングの対象となりますが、MLP や Attention レイヤーなどの他のレイヤータイプを対象とすることも可能です。これは LNTuningConfig で target_modules を指定することで行えます。
論文の抄録は以下の通りです:
本論文では、大規模言語モデル(LLM)をマルチモーダル大規模言語モデル(MLLM)に変換するための効率的な戦略を提案します。この変換をドメイン適応プロセス、すなわちテキスト理解からマルチモーダルへの対応への移行として捉えることで、各アテンションブロック内において、LayerNormのチューニングのみで高い性能を達成できるという興味深い事実が明らかになりました。さらに、全パラメータファインチューニングやLoRAなどの他のチューニング手法と比較した場合、その効率性における利点は非常に大きいです。例えば、13Bモデル規模でLoRAと比較した場合、5つのマルチモーダルタスク全体で平均20%以上の性能向上が見られ、同時に学習可能パラメータが41.9%削減され、GPUメモリ使用量が17.6%減少します。このLayerNorm戦略に加え、対話データのみを選択的に使用してチューニングすることで、さらに効率性を向上させることも示しました。これらの実証結果に加え、LLMをマルチモーダルドメインに適応させ、モデルの表現力を高める上でLayerNormが果たす役割を探る包括的な分析を提供します。
ベンチマーク概要
API
LNTuningConfig
クラス peft.LNTuningConfig
< 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 = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[Union[list[str], str]] = None )
パラメータ
- target_modules (Optional[Union[List[str], str]]) — LNTuning に置き換えるモジュール名のリスト、またはモジュール名の正規表現です。例えば、‘.decoder.’ や ‘.encoder.’ などです。指定しない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、対象モジュールを手動で指定する必要があります。
- exclude_modules (Optional[Union[List[str], str]]) — アダプタを適用しないモジュールの名前。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。
- modules_to_save (Optional[Union[List[str], str]]) — 最終チェックポイントで学習可能に設定され、保存されるモジュールのリストです。例えば、Sequence Classification や Token Classification のタスクでは、最終層の classifier/score がランダムに初期化されるため、学習可能に設定し、保存する必要があります。
これは、LNTuningModelの設定を保存するための設定クラスです。
LNTuningModel
クラス peft.LNTuningModel
< 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 (
torch.nn.Module) — 適応させる対象のモデル。 - config (LNTuningConfig) — LNチューニングモデルの設定です。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — このオプションはLNチューニングには影響しませんが、他のPEFT手法との整合性を保つために存在します。
戻り値
‘torch.nn.Module’
LayerNormを有効化して調整した適応モデル。
事前学習済みtransformerモデルからLayerNormチューニングを作成します。
この手法の詳細は、https://huggingface.co/papers/2312.11420に記載されています。
例:
>>> from transformers import AutoModelForCausalLM
>>> from peft import get_peft_model, TaskType, LNTuningConfig
>>> peft_config = LNTuningConfig(
... task_type=TaskType.CAUSAL_LM,
... )
>>> model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
>>> model = get_peft_model(model, peft_config)
>>> model.print_trainable_parameters()属性:
- model (PreTrainedModel) — 適応させる対象のモデル。
- peft_config (LNTuningConfig): LNチューニングモデルの設定です。