PEFT documentation
LoKr
LoKr

低ランク・クロネッカー積(LoKr)は、LoRAのバリアントであり、大きな重み行列を2つの低ランク行列で近似し、クロネッカー積で結合します。LoKrは、ファインチューニング時の制御をより良くするために、任意の第3の低ランク行列も提供します。重み更新行列をクロネッカー積の分解として表現し、ブロック行列を作成することで、LoKrは元の重み行列のランクを保持できます。小さな行列のサイズは、そのrankまたはrによって決定されます。クロネッカー積のもう一つの利点は、行列の列をスタックすることでベクトル化できることです。これにより、∆Wを完全に再構築することを避けるため、処理が高速化されます。
論文の抄録は以下の通りです:
テキストから画像を生成する生成モデルは、テキストプロンプトから高忠実度の画像を生成できる能力により、多大な注目を集めています。これらのモデルの中で、Stable Diffusion は、この急速に成長している分野における主要なオープンソースモデルとして際立っています。しかし、これらのモデルのファインチューニングには、新しい手法の統合から体系的な評価に至るまで、複数の課題が存在します。これらの問題に対処するため、本論文では、Stable Diffusion 向けの幅広いファインチューニング手法を提供するオープンソースライブラリである LyCORIS Lora beYond Conventional methods, Other Rank adaptation Implementations for Stable diffusion を紹介します。さらに、多様なファインチューニング技術の体系的な評価のための包括的なフレームワークを提示します。このフレームワークは、多様な指標のセットを用い、ハイパーパラメータの調整や、さまざまな概念カテゴリにわたる異なるプロンプトタイプを用いた評価など、ファインチューニングの複数の側面に深く掘り下げています。この包括的なアプローチを通じて、私たちの研究は、ファインチューニングパラメータの微妙な影響に関する重要な洞察を提供し、最先端の研究と実用的な応用の間のギャップを埋めます。
使用方法
from peft import LoKrConfig, get_peft_model
config = LoKrConfig(
r=16,
alpha=16,
target_modules=["query", "value"],
module_dropout=0.1,
modules_to_save=["classifier"],
)
model = get_peft_model(model, config)
model.print_healthcheck()ベンチマーク概要
API
LoKrConfig
クラス peft.LoKrConfig
< 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 = Falserank_pattern: Optional[dict] = <factory>alpha_pattern: Optional[dict] = <factory>r: int = 8alpha: int = 8rank_dropout: float = 0.0module_dropout: float = 0.0use_effective_conv2d: bool = Falsedecompose_both: bool = Falsedecompose_factor: int = -1rank_dropout_scale: bool = Falsetarget_modules: Optional[Union[list[str], str]] = Noneexclude_modules: Optional[Union[list[str], str]] = Noneinit_weights: Union[bool, Literal['lycoris']] = Truelayers_to_transform: Optional[Union[list[int], int]] = Nonelayers_pattern: Optional[Union[list[str], str]] = Nonemodules_to_save: Optional[list[str]] = None )
パラメータ
- r (
int) — LoKr のランク。 - alpha (
int) — LoKrのスケーリングに使用するalphaパラメータ。 - rank_dropout (
float) — 学習中のランク次元におけるドロップアウト確率。 - module_dropout (
float) — 学習中にLoKrモジュールを無効にするためのdropout確率。 - use_effective_conv2d (
bool) — ksize > 1 の Conv2d (および Conv1d) に対して、パラメータの effective decomposition を使用します (FedPara 論文の “Proposition 3”)。 - decompose_both (
bool) — 左側のクロネッカー積行列のランク分解を実行します。 - decompose_factor (
int) — Kronecker積の分解係数。 - rank_dropout_scale (‘bool) —
学習中にランクドロップアウトをスケーリングするかどうか。デフォルトは
Falseです。 - target_modules (
Optional[Union[List[str], str]]) — アダプタを適用するモジュールの名前です。このパラメータが指定されている場合、指定された名前のモジュールのみが置き換えられます。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。このパラメータが ‘all-linear’ として指定されている場合、出力層を除くすべての linear/Conv1D モジュールが選択されます。このパラメータが指定されていない場合、モデルのアーキテクチャに基づいてモジュールが選択されます。アーキテクチャが不明な場合はエラーが発生します。この場合、ターゲットモジュールを手動で指定する必要があります。 - exclude_modules (
Optional[Union[List[str], str]]) — アダプタを適用しないモジュールの名前。文字列を渡す場合、正規表現によるマッチングが行われます。文字列のリストを渡す場合、完全一致が行われるか、モジュール名が渡された文字列のいずれかで終わるかがチェックされます。 - init_weights (
bool) — アダプター重みの初期化を実行するかどうか。デフォルトはTrueです。LYCORISリポジトリのスタイルで重みを初期化するには“lycoris”を指定します。Falseを渡すことは推奨されません。 - layers_to_transform (
Union[List[int], int]) — 変換対象のレイヤーのインデックスです。int のリストが渡された場合、このリストに指定されたレイヤーのインデックスにアダプターが適用されます。単一の整数が渡された場合、そのインデックスのレイヤーに変換が適用されます。 - layers_pattern (
Optional[Union[List[str], str]]) —layers_to_transformがNoneと異なる場合にのみ使用されるレイヤーパターン名です。これはモデルのnn.ModuleListを対象とすべきで、通常は'layers'または'h'と呼ばれます。 - rank_pattern (
dict) —rで指定されるデフォルトのランクとは異なるランクを持つ、レイヤー名または正規表現からランクへのマッピングです。例えば、{'^model.decoder.layers.0.encoder_attn.k_proj': 16}。 - alpha_pattern (
dict) —alphaで指定されるデフォルトの alpha と異なる alpha を、レイヤー名または正規表現にマッピングする辞書です。例えば、{'^model.decoder.layers.0.encoder_attn.k_proj': 16}のように指定します。 - modules_to_save (
Optional[List[str]]) — アダプタ層を除き、最終的なチェックポイントで学習可能かつ保存されるように設定するモジュールのリスト。
LoKrModelの設定クラスです。
LoKrModel
クラス peft.LoKrModel
< 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 (LoKrConfig) — LoKrモデルの設定。
- adapter_name (
str) — アダプターの名前。デフォルトは"default"です。 - low_cpu_mem_usage (
bool、optional、デフォルトはFalse) — メタデバイス上に空のアダプター重みを生成します。読み込みプロセスを高速化するために有用です。
戻り値
torch.nn.Module
LoKrモデル。
事前学習済みモデルから低ランクのKronecker積モデルを作成します。元の手法はhttps://huggingface.co/papers/2108.06098およびhttps://huggingface.co/papers/2309.14859に部分的に説明されています。現在の実装は、https://github.com/KohakuBlueleaf/LyCORIS/blob/eb460098187f752a5d66406d3affade6f0a07ece/lycoris/modules/lokr.pyから大きく借用しています。
例:
>>> from diffusers import StableDiffusionPipeline
>>> from peft import LoKrConfig, get_peft_model
>>> config_te = LoKrConfig(
... r=8,
... alpha=32,
... target_modules=["k_proj", "q_proj", "v_proj", "out_proj", "fc1", "fc2"],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... )
>>> config_unet = LoKrConfig(
... r=8,
... alpha=32,
... target_modules=[
... "proj_in",
... "proj_out",
... "to_k",
... "to_q",
... "to_v",
... "to_out.0",
... "ff.net.0.proj",
... "ff.net.2",
... ],
... rank_dropout=0.0,
... module_dropout=0.0,
... init_weights=True,
... use_effective_conv2d=True,
... )
>>> model = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
>>> model.text_encoder = get_peft_model(model.text_encoder, config_te)
>>> model.unet = get_peft_model(model.unet, config_unet)属性:
- model (
~torch.nn.Module) — 適応させる対象のモデル。 - peft_config (LoKrConfig): LoKrモデルの設定。