PEFT documentation
MiSS
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
< 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 = 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
< 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 (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モデルの設定。