このリポジトリは、AIGC研究者が数行でLORAを使用するための最も簡単なチュートリアルコードを提供します。このハンドブックを使用すると、HuggingfaceやCititaiなどのアクティブコミュニティのLORAモデルで簡単にプレイできます。
現在、ControlNet-For-Diffusers、T2I-Adapter-For-Diffusersもサポートしています。
大規模な言語モデル(LORA)の低ランク適応は、Microsoftによって開発され、元の重みを凍結しながらランク分散マトリックスのペアを学習することにより、トレーニング可能なパラメーターの数を減らします。 Loraは、モデル全体の代わりにモデルの「残差」を微調整しようとします。つまり、トレーニング
どこ
このトレーニングのトリックは、大規模な一般的なベースモデルでのカスタマイズされたモデルをFune-Tuningに非常に役立ちます。さまざまなテキストから画像モデルが開発されており、公式の安定した拡散の上部に構築されています。現在、LORAを使用すると、リソースがはるかに少ない独自のモデルを効率的にトレーニングできます。
SafeTensorsは、顔を安全に保存するための新しいシンプルな形式です(ピクルスとは対照的に)フェイスを抱きしめてリリースしますが、それはまだ高速です(ゼロコピー)。その効率のために、多くの安定した拡散モデル、特にLORAモデルはSafetensors形式でリリースされます。 Huggingface/Safetensorsからその利点をさらに見つけて、PIPインストールを介してインストールできます。
pip install safetensorsこのチュートリアルでは、事前に訓練されたLORAをDiffusersフレームワークにロードまたは挿入することを示します。多くの興味深いプロジェクトは、HuggingfaceとCititaiで見つけることができますが、ほとんどが高度な開発者にとって便利ではない安定した拡散Webuiフレームワークにあります。 cloneofsimo/loraによって、訓練されたロラの荷重、融合、補間について非常に動機付けました。主に、Diffusersと十分に互換性がないSafetensors形式のモデルについて説明します。
完全なモデルには、必要なすべてのモジュール(ロラ層の有無にかかわらずベースモデル)が含まれ、通常は.ckptまたは.safeTensors形式に保存されます。手元での使用方法を示すために、以下の2つの例を示します。
Huggingfaceからのstabilityai/stable-diffusion-2-1。
CivitaiのDreamshaper。
.ckptまたは.safeTensorsファイルのみをダウンロードできます。ディフューザーはそれらを直接ロードすることをサポートしていませんが、変換スクリプトを提供します。最初にディフューザーをローカルにダウンロードします。
git clone https://github.com/huggingface/diffusers cd ./diffusers
# assume you have downloaded xxx.safetensors, it will out save_dir in diffusers format.
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.safetensors --dump_path save_dir --from_safetensors
# assume you have downloaded xxx.ckpt, it will out save_dir in diffusers format.
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.ckpt --dump_path save_dir次に、モデルをロードできます
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained(save_dir,torch_dtype=torch.float32)今のところ、ディフューザーはLORAの負荷重量をサポートできません(通常は.SafeTensor形式)。ここでは、私たちの試みを無力なスタイルで示します。また、1つの例を提供します。
ファイルのサイズは、余分なロラ重量のみが含まれているため、完全なモデルよりもはるかに小さいことに注意してください。場合、ベースモデルをロードする必要があります。また、安定した拡散1.5をベースとしてロードするだけで問題ありませんが、満足した結果を得るには、推奨されるベースモデルをダウンロードすることをお勧めします。
私たちの方法は非常に簡単です:.SafeTensorから重量を取り出し、Loraの重量をサポートするディフューザーの重量に融合します。 .safeTensorを他の形式に変換するのではなく、代わりにベースモデルの重みを更新します。
私たちのスクリプトは、HuggingfaceとCititaiのほとんどのモデルで正常に動作するはずです。そうでない場合は、独自にコードを変更することもできます。私を信じて、それは本当に簡単で、あなたはそれを作ることができます。
# the default mergering ratio is 0.75, you can manually set it
python convert_lora_safetensor_to_diffusers.pyこの号でディフューザー用のPRを作成しました。この問題では、収束関数をさらにゆがめて柔軟になります。待つことができない場合は、直接確認できます。すぐにディフューザーに統合されます!
Diffusersは、LORAモデルでトレーニングするために、Simple Train_text_to_image_lora.pyを提供しています。要件をインストールするために、その指示に従ってください。
export MODEL_NAME= " CompVis/stable-diffusion-v1-4 "
export DATASET_NAME= " lambdalabs/pokemon-blip-captions "
accelerate launch --mixed_precision= " fp16 " train_text_to_image_lora.py
--pretrained_model_name_or_path= $MODEL_NAME
--dataset_name= $DATASET_NAME --caption_column= " text "
--resolution=512 --random_flip
--train_batch_size=1
--num_train_epochs=100 --checkpointing_steps=5000
--learning_rate=1e-04 --lr_scheduler= " constant " --lr_warmup_steps=0
--seed=42
--output_dir= " sd-pokemon-model-lora "
--validation_prompt= " cute dragon creature " --report_to= " wandb "上記のコマンドを使用してモデルをトレーニングしたら、訓練されたLORAウェイトをロードした後、単にstabled fiusionpipelineを使用して推論を行うことができます。この場合、sd-pokemon-model-loraであるLoraウェイトをロードするには、output_dirを渡す必要があります。
import torch
from diffusers import StableDiffusionPipeline
model_path = " your_path/sd-model-finetuned-lora-t4 "
pipe = StableDiffusionPipeline.from_pretrained( " CompVis/stable-diffusion-v1-4 " , torch_dtype=torch.float16)
pipe.unet.load_attn_procs(model_path)
pipe.to( " cuda " )
prompt = " A pokemon with green eyes and red legs. "
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save( " pokemon.png " )今のところ、DiffusersはUNETのTrain Loraのみをサポートしています。 PRをサポートして作成しました。必要に応じて、PRに確認するか、問題を開いてください。
ColossalaiはすでにLoraをサポートしています。 train_dreambooth_colossalai.pyの上部に数行を変更する必要があります。この例はDreamBooth用ですが、通常のテキストを簡単に採用してイメージトレーニングを行うことができます。生成されたロラウェイトは、UNETの注意層のみです。 Text Encoderもサポートしたい場合は、Colossalaiはまだ複数のモデルをサポートしていないため、DiffusersでAccletateフレームワークを使用してください。
from diffusers.loaders import AttnProcsLayers
from diffusers.models.cross_attention import LoRACrossAttnProcessor
# attention here! It is necessaray to init unet under ColoInitContext, not just lora layers
with ColoInitContext(device=get_current_device()):
unet = UNet2DConditionModel.from_pretrained(
args.pretrained_model_name_or_path,
subfolder= " unet " ,
revision=args.revision,
low_cpu_mem_usage=False
)
unet.requires_grad_(False)
# Set correct lora layers
lora_attn_procs = {}
for name in unet.attn_processors.keys ():
cross_attention_dim = None if name.endswith( " attn1.processor " ) else unet.config.cross_attention_dim
if name.startswith( " mid_block " ):
hidden_size = unet.config.block_out_channels[-1]
elif name.startswith( " up_blocks " ):
block_id = int(name[len( " up_blocks. " )])
hidden_size = list(reversed(unet.config.block_out_channels))[block_id]
elif name.startswith( " down_blocks " ):
block_id = int(name[len( " down_blocks. " )])
hidden_size = unet.config.block_out_channels[block_id]
lora_attn_procs[name] = LoRACrossAttnProcessor(
hidden_size=hidden_size, cross_attention_dim=cross_attention_dim
)
unet.set_attn_processor(lora_attn_procs)
lora_layers = AttnProcsLayers(unet.attn_processors)
# DDP
unet = gemini_zero_dpp(unet, args.placement)
# config optimizer for colossalai zero, set initial_scale to large value to avoid underflow
optimizer = GeminiAdamOptimizer(unet,
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
initial_scale=2 ** 16,
clipping_norm=args.max_grad_norm)ここに行くと、唯一のことはUNETの初期化の方法です。ロラの重量のみを節約するために、
torch_unet = get_static_torch_model(unet)
if gpc.get_local_rank(ParallelMode.DATA) == 0:
torch_unet = torch_unet.to(torch.float32)
torch_unet.save_attn_procs(save_path)次に、推論を行います
from diffusers import StableDiffusionPipeline
import torch
model_path = " sd-model-finetuned-lora "
pipe = StableDiffusionPipeline.from_pretrained( " CompVis/stable-diffusion-v1-4 " , torch_dtype=torch.float16)
pipe.unet.load_attn_procs(model_path)
pipe.to( " cuda " )
prompt = " A pokemon with green eyes and red legs. "
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save( " pokemon.png " )生成されたロラ重量は約3MBサイズのみであることがわかりますが、これはデフォルト設定のためです。サイズを増やすために、LORA層のランク(低ランク分解の寸法)を手動で設定できます。
lora_attn_procs[name] = LoRACrossAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=128)次に、ロラの重量は約100〜200MBのサイズになります。 Lora層は過剰に触れやすいことに注意してください。一般的に言えば、バッチサイズ= 64の小さなデータセット(1k未満の画像)で100〜2000のステップしかトレーニングしないはずです。
(1)マージ時にロラの重量を手動で調整できますか?
はい、ここのアルファはロラの重量です。 DiffusersにPRを提出しました。そこでは、柔軟なWarpped関数を提供します。
(2)LORA(.SafeTensors)をディフューザーがサポートした他の形式にのみ変換できますか?
あなたはできますが、私たちは提案しません、この問題を見てください。多くの制限があります。たとえば、スクリプトはすべての.safeTensorsに一般化することはできません。一部の命名は異なるためです。さらに、現在のディフューザーフレームワークはUNETの注意レイヤーにLORAを追加することのみをサポートしますが、Civitaiの多くのセーフテンサーには、テキストエンコーダーなどの他のモジュールのLORAウェイトが含まれています。ただし、テキストエンコーダーのLORAはまもなくサポートする必要があります。
(3)複数のLORAモデルを混ぜることはできますか?
はい、唯一のことは2回マージすることです。ただし、アルファ(ロラの重量)を慎重に設定してください。アルファが大きすぎるとモデルが分解します。
(4)このプロジェクトの動機は何ですか?
Civitaiプラットフォームには多くの信じられないほどのモデルがありますが、LORAウェイトのほとんどはSafetensors形式であり、ディフューザーユーザーにとっては便利ではありません。したがって、これらのロラをディフューザーで使用できるように、変換スクリプトを書きます。私たちは、すでに非常に成熟しているが、ディフューザーとはまったく異なるAPIを持っている安定した拡散webuiのターゲットではないことに注意してください。