PEFT documentation

MiSS

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.21.0).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

MiSS

MiSS (Matrix Shard Sharing)は、モデルの性能と計算効率のバランスを良好に実現するPEFT手法です。学習可能な行列は1つだけでよく、LoRAとは異なるシャード共有メカニズムを導入しています。

論文の抄録は以下の通りです:

パラメータ効率の良いファインチューニング(PEFT)手法、特にLow-Rank Adaptation(LoRA)は、大規模言語モデル(LLM)における学習可能なパラメータ数を効果的に削減します。しかし、モデルの規模が拡大し続けるにつれ、計算リソースへの需要は依然として大きな課題です。既存のLoRAのバリアントは、適応性(モデルの性能と収束速度)と効率性(計算オーバーヘッド、メモリ使用量、初期化時間)の間の最適なバランスを取ることにしばしば苦戦しています。本論文では、このトレードオフをシンプルなシャード共有メカニズムを通じて解決する、新しいPEFT手法であるMiSS(Matrix Shard Sharing)を導入します。MiSSは、重み行列を複数のフラグメント行列に分解し、共有される学習可能な共通フラグメントを利用することで、低ランク適応を達成できるという洞察を活用します。この手法は、これらの共有された分割シャードの複製を通じて、低ランク更新行列を構築します。また、MiSSのためのハードウェア効率が高く、広く適用可能な実装も提案します。幅広いタスクで実施された広範な実験と、計算性能の体系的な分析により、MiSSの優位性が示されました。結果は、MiSSが標準的なLoRAとその代表的なバリアントを、モデル性能の指標と計算効率(初期化速度や学習スループットを含む)の両面で大幅に上回っていることを示しています。表現力とリソース利用のバランスを効果的に取ることで、MiSSは大規模モデルを効率的に適応させるための魅力的なソリューションを提供します。

ベンチマーク概要

MiSSを使用するタイミング

MiSSが適切な選択肢となるのは、次のような場合です:

  • PiSSA、LoRA-GA、または OLoRA など、コストのかかるセットアップを使用する高度な LoRA 初期化スキームよりも、より高速な初期化とより高い学習スループットを求めている場合。
  • LoRAのドロップイン代替手段を、設定変更を最小限に抑えたい場合

効率性を多少犠牲にしてでも、より強い表現力が必要であれば、bat初期化バリアント(下記参照)を検討してください。

init_weightsモード

MiSSはinit_weightsパラメータを介して3つの初期化モードをサポートしています:

  • True(デフォルト): 標準的な MiSS 初期化。ほとんどのユースケースで最適な出発点です。
  • "bat": 異なるシャード間で非線形な更新を有効にします。標準的な MiSS よりも良い結果を生成しますが、メモリ使用量が増え、速度は約2倍遅くなります。効率よりもパフォーマンスを優先する場合に使用してください。
  • "mini": out_features 次元に沿ってより小さいランクを使用し、mini_r で制御します。これにより、学習可能なパラメータがさらに削減されます。このモードを使用する場合、mini_r を設定する必要があり、out_features は mini_r で割り切れる必要があります。

クイックスタート

import torch
from peft import MissConfig, get_peft_model
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-2-7b-hf",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer.pad_token_id = tokenizer.eos_token_id

# Standard MiSS
config = MissConfig(
    r=64,
    miss_dropout=0.01,
    task_type="CAUSAL_LM"
)

# BAT variant — better performance, more memory
# config = MissConfig(
#     r=64,
#     init_weights="bat",
#     task_type="CAUSAL_LM"
# )

# Mini variant — fewer trainable parameters
# config = MissConfig(
#     r=64,
#     init_weights="mini",
#     mini_r=8,
#     task_type="CAUSAL_LM"
# )

model = get_peft_model(model, config)
model.print_healthcheck()

学習と推論を含む完全なファインチューニングの例については、MiSSファインチューニングの例を参照してください。

API

MissConfig

class peft.MissConfig

< >

( 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 = 64miss_dropout: float = 0.0mini_r: int = 1target_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: bool | Literal['bat', 'mini'] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[str] = Nonebias: str = 'none'modules_to_save: Optional[list[str]] = None )

パラメータ

  • r (int) — 異なるレイヤーにわたるMiSSのランクです。デフォルトの初期化手法が機能しないため、‘r’は偶数に設定するのが望ましいです。MiSSのランクは、in_features次元に沿った低ランク分解に対応します。
  • miss_dropout (float) — MiSS層のドロップアウト確率です。
  • mini_r (int) — MiSS のランクは、out_features 次元に沿った低ランク分解に対応します。init_weights=mini を設定する場合は、mini_r を設定する必要があります。out_features が mini_r で割り切れることを確認してください。
  • target_modules (Optional[Union[List[str], str]]) — アダプタを適用するモジュールの名前です。このパラメータが指定されている場合、指定された名前のモジュールのみが置き換えられます。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。このパラメータが ‘all-linear’ として指定されている場合、出力層を除くすべての線形モジュールが選択されます。このパラメータが指定されていない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、ターゲットモジュールを手動で指定する必要があります。
  • exclude_modules (Optional[Union[List[str], str]]) — アダプタを適用しないモジュールの名前。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。
  • init_weights (bool | Literal[“bat”, “mini”]) — 異なる初期化は、MiSS の異なるバリアントに対応します。デフォルト (balance) では、MiSS において最も効率的で汎用的な手法が使用されます。‘bat’: このモードでは、異なるシャード間で非線形な更新を有効にできます。‘mini’: このモードでは、学習可能なパラメータを減らすためにより小さいランクを設定できますが、out_features % mini_r == 0 を満たすことをお勧めします。
  • layers_to_transform (Union[List[int], int]) — 変換対象のレイヤーのインデックスです。int のリストが渡された場合、このリストに指定されたレイヤーのインデックスにアダプターが適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに変換が適用されます。
  • layers_pattern (str) — layers_to_transform が None と異なる場合にのみ使用される、レイヤーのパターン名です。
  • bias (str) — MiSS のバイアス型。'none'、'all'、または 'MiSS_only' を指定できます。
  • modules_to_save (List[str]) — 最終チェックポイントに保存されるよう、学習可能に設定するアダプタ層以外のモジュールのリスト。

これはMissModelの設定を保存するための設定クラスです。

MissModel

class peft.MissModel

< >

( 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 (MissConfig) — MiSSモデルの設定。
  • adapter_name (str) — アダプターの名前。デフォルトは"default"です。
  • low_cpu_mem_usage (bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。

戻り値

torch.nn.Module

MiSSモデル。

事前学習済みモデルからHouseholder反射適応(MiSS)モデルを作成します。この手法はhttps://huggingface.co/papers/2409.15371に説明されています。

例:

>>> from diffusers import StableDiffusionPipeline
>>> from peft import MissModel, MissConfig

>>> config_te = MissConfig(
...     r=8,
...     target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
...     init_weights=True,
... )
>>> config_unet = MissConfig(
...     r=8,
...     target_modules=[
...         "proj_in",
...         "proj_out",
...         "to_k",
...         "to_q",
...         "to_v",
...         "to_out.0",
...         "ff.net.0.proj",
...         "ff.net.2",
...     ],
...     init_weights=True,
... )

>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = MissModel(model.text_encoder, config_te, "default")
>>> model.unet = MissModel(model.unet, config_unet, "default")

属性:

  • model (~torch.nn.Module) — 適応させる対象のモデル。
  • peft_config (MissConfig): MiSSモデルの設定。
Update on GitHub