PEFT documentation
PEFTの統合
PEFTの統合
PEFTの実用的な利点は、DiffusersやTransformersといった他のHugging Faceライブラリにも広がります。PEFTの主な利点の一つは、PEFT手法によって生成されるアダプターファイルが元のモデルよりもはるかに小さいことであり、これにより複数のアダプターを管理・利用することが非常に容易になります。事前学習済みのベースモデルを1つ用意し、解決しようとしているタスク用にファインチューニングされた新しいアダプターを読み込むだけで、複数のタスクに活用できます。また、テキストから画像を生成する拡散モデルに複数のアダプターを組み合わせることで、新しいエフェクトを作成することも可能です。
このチュートリアルでは、PEFTがDiffusersとTransformersにおけるアダプタの管理をどのように支援できるかを示します。
Diffusers
Diffusersは、拡散モデルを用いてテキストや画像から画像や動画を生成するための生成AIライブラリです。LoRAは、新しいスタイルで画像を生成する拡散モデルを非常に素早く学習・共有できるため、拡散モデルの学習手法として特に人気があります。複数のLoRAモデルをより簡単に使用・試すために、DiffusersはPEFTライブラリを使用して、推論用の異なるアダプタの管理を支援します。
例えば、ベースモデルを読み込んだ後、load_lora_weights メソッドを使用して推論用の artificialguybr/3DRedmond-V1 アダプターを読み込みます。読み込みメソッドの adapter_name 引数は PEFT によって有効化されており、アダプターに名前を付けることで参照しやすくします。
import torch
from diffusers import DiffusionPipeline
device = torch.accelerator.current_accelerator().type if hasattr(torch, "accelerator") else "cuda"
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", torch_dtype=torch.float16
).to(device)
pipeline.load_lora_weights(
"peft-internal-testing/artificialguybr__3DRedmond-V1",
weight_name="3DRedmond-3DRenderStyle-3DRenderAF.safetensors",
adapter_name="3d"
)
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image
次に、もう1つのクールなLoRAモデル、ostris/super-cereal-sdxl-loraを試してみましょう。この新しいアダプターをadapter_nameで読み込み、名前を付けるだけで、set_adaptersメソッドを使用して現在アクティブなアダプターとして設定できます。
pipeline.load_lora_weights(
"ostris/super-cereal-sdxl-lora",
weight_name="cereal_box_sdxl_v1.safetensors",
adapter_name="cereal"
)
pipeline.set_adapters("cereal")
image = pipeline("sushi rolls shaped like kawaii cat faces").images[0]
image
最後に、disable_lora メソッドを呼び出してベースモデルを復元できます。
pipeline.disable_lora()
PEFTがDiffusersをどのようにサポートしているかについては、Inference with PEFTチュートリアルを参照してください。
Transformers
🤗 Transformers は、あらゆるモダリティのあらゆるタスク向けの事前学習済みモデルのコレクションです。これらのモデルは、学習や推論のために読み込むことができます。多くのモデルが大型言語モデル(LLM)であるため、アダプターを管理・学習するために PEFT を Transformers と統合するのが理にかなっています。
学習用のベース事前学習モデルを読み込みます。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")次に、モデルパラメータの適応方法を指定するためのアダプター設定を追加します。add_adapter() メソッドを呼び出して、ベースモデルに設定を追加します。
from peft import LoraConfig
peft_config = LoraConfig(
lora_alpha=16,
lora_dropout=0.1,
r=64,
bias="none",
task_type="CAUSAL_LM"
)
model.add_adapter(peft_config)これで、TransformersのTrainerクラス、またはお好みのトレーニングフレームワークを使用してモデルをトレーニングできます。
新しく学習したモデルを推論に使用するには、AutoModel クラスはバックエンドで PEFT を使用して、アダプター重みと設定ファイルをベースの事前学習モデルに読み込みます。
from transformers import AutoModelForCausalLM
model = AutoModelForCausalLM.from_pretrained("peft-internal-testing/opt-350m-lora")代わりに、Pipelines を使用してモデルを読み込み、推論を簡単に実行することもできます。
from transformers import pipeline
model = pipeline("text-generation", "peft-internal-testing/opt-350m-lora")
print(model("Hello World"))複数のアダプタの比較や使用に関心がある場合は、add_adapter()メソッドを呼び出して、ベースモデルにアダプタの構成を追加できます。唯一の要件は、アダプタの種類が同一であることです(LoRAとLoHaのアダプタを混在させることはできません)。
from transformers import AutoModelForCausalLM
from peft import LoraConfig
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
model.add_adapter(lora_config_1, adapter_name="adapter_1")ベースモデルに新しいアダプターを接続するには、add_adapter()を再度呼び出します。
model.add_adapter(lora_config_2, adapter_name="adapter_2")その後、set_adapter() を使用して、現在アクティブなアダプターを設定できます。
model.set_adapter("adapter_1")
output = model.generate(**inputs)
print(tokenizer.decode(output_disabled[0], skip_special_tokens=True))アダプターを無効にするには、disable_adapters メソッドを呼び出します。
model.disable_adapters()
enable_adapters を使用すると、アダプターを再度有効にできます。
ご興味があれば、PEFTでアダプターを読み込み、学習するチュートリアルを参照して、詳細をご覧ください。
Update on GitHub