HuggingFace ブログ : LoRA による効率的な Stable Diffusion 微調整 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 07/06/2023
* 本ページは、HuggingFace Blog の以下のドキュメントを翻訳した上で適宜、補足説明したものです:
- Using LoRA for Efficient Stable Diffusion Fine-Tuning (Authors : Pedro Cuenca, Sayak Paul ; Published : 01/26/2023)
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
- 人工知能研究開発支援
- 人工知能研修サービス(経営者層向けオンサイト研修)
- テクニカルコンサルティングサービス
- 実証実験(プロトタイプ構築)
- アプリケーションへの実装
- 人工知能研修サービス
- PoC(概念実証)を失敗させないための支援
- お住まいの地域に関係なく Web ブラウザからご参加頂けます。事前登録 が必要ですのでご注意ください。
◆ お問合せ : 本件に関するお問い合わせ先は下記までお願いいたします。
- 株式会社クラスキャット セールス・マーケティング本部 セールス・インフォメーション
- sales-info@classcat.com ; Web: www.classcat.com ; ClassCatJP
HuggingFace ブログ : LoRA による効率的な Stable Diffusion 微調整
LoRA: Low-Rank Adaptation of Large Language Models (LoRA: 大規模言語モデルの低ランク適応) は大規模言語モデルを微調整する問題に対応するために Microsoft の研究者により紹介された新しいテクニックです。GPT-3 のような、数十億のパラメータを持つ強力なモデルはそれらを特定のタスクや領域に適応させるために微調整することはとてつもなく高価です。LoRA は事前訓練済モデルの重みを凍結して、各 transformer ブロック内に訓練可能な層 (ランク分解行列) を注入 (inject) することを提案しています。これは訓練可能パラメータ数と GPU メモリ要件を大幅に削減させます、殆どのモデル重みについて勾配が計算される必要がないからです。研究者は、大規模言語モデルの Transformer アテンションブロックにフォーカスすることにより、LoRA による微調整品質は完全なモデル微調整と同程度でありながら、遙かに高速で少ない計算量を必要とするだけであることを見出しました。
Diffusers 🧨 のための LoRA
LoRA は当初は大規模言語モデルのために提案されて transformer ブロック上で実演されましたが、このテクニックは他のところでも適用できます。Stable Diffusion の微調整の場合、LoRA は画像表現をそれらを記述するプロンプトと関連づける交差アテンション層に適用できます。次の図 (Stable Diffusion 論文 から引用) の詳細は重要ではありませんが、黄色のブロックが画像とテキスト表現の間の関係の構築を担っていることにだけ注意してください。
私たちが知る限りでは、Simo Ryu ( @cloneofsimo ) が Stable Diffusion に適用された LoRA 実装を思いついた最初の人です。彼らの GitHub プロジェクト を見てサンプルや多くの興味深い議論や洞察を見てください。
LoRA 訓練可能行列を交差アテンション層内のようなモデルの深いところに注入するため、diffusers のソースコードを創造的な (しかし不安定な) 方法でハックする必要がありました。Stable Diffusion が一つのことを私たちに示してくれたとするならば、それはコミュニティが創造的な目的でモデルを曲げて適応させる方法を常に思いつくことで、そして私たちはそれを愛します!交差アテンション層を操作する柔軟な方法を提供することは、xFormers のような最適化テクニックの採用を簡単にするような、多くの他の理由で有用でありえます。Prompt-to-Prompt のような他の創造的なプロジェクトはそれらの層にアクセスするある簡単な方法に対応できるでしょうから、私たちは それを行う一般的な方法をユーザに提供する ことに決めました。私たちは 12 月下旬からこのプルリクエストをテストしていて、それは公式に 昨日 diffusers リリース で公開されました。(※ 訳注: この元記事は 01/26/2023 に公開されています。)
Dreambooth と完全な微調整手法の両方に対して、diffusers の LoRA 訓練サポートを提供するために私たちは @cloneofsimo と強力して作業してきました!これらのテクニックは以下の利点を提供します :
- 既に説明したように、訓練は遙かに高速です。
- 計算量要件はより低いです。VRAM 11 GB の 2080 Ti で完全な微調整モデルを作成できるでしょう!
- 訓練済み重みは遙かに、遙かに小さいです。元のモデルは凍結されて訓練される新しい層を注入しますので、新しい層用の重みはサイズ ~3 MB の単一ファイルとしてセーブできます。これは UNet モデルの元のサイズのおよそ 1000 分の 1 ほどに小さいです。
私たちは特に最後の点についてワクワクしています。素晴らしい微調整された、または dreambooth のモデルをユーザが共有するためには、最終的なモデルの完全なコピーを共有する必要がありました。それらを試したい他のユーザは好みの UI で微調整済み重みをダウンロードする必要があり、合わせて膨大なストレージとダウンロードコストがかかります。今日の時点で、Dreambooth Concepts ライブラリに登録されたおよそ 1,000 の Dreambooth モデル があり、たぶんライブラリには登録されていないより多くのモデルもあるでしょう。
LoRA によれば、他の人が貴方の微調整モデルを利用することを可能にするために 単一の 3.29 MB ファイル を公開することが可能になります。
(h/t to @mishig25, 通常の会話で dreamboothing を動詞として使用するのを聞いた最初の人です)。
LoRA 微調整
Stable Diffusion の完全なモデルの微調整は遅く困難であり、そしてそれが Dreambooth や Textual Inversion のような軽量な方法がポピュラーになった理由の一部です。LoRA を使用すれば、カスタムデータセット上でモデルを微調整することが遙かに簡単になります。
Diffusers は、8-bit optimizer のようなトリックに頼ることなく 11 GB の GPU RAM ほどに少なく実行できる LoRA 微調整スクリプト を提供するようになりました。これは Lambda Labs Pokémon データセット を使用してモデルを微調整するためにそれを使用する方法です :
export MODEL_NAME="runwayml/stable-diffusion-v1-5"
export OUTPUT_DIR="/sddata/finetune/lora/pokemon"
export HUB_MODEL_ID="pokemon-lora"
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 \
--dataloader_num_workers=8 \
--resolution=512 --center_crop --random_flip \
--train_batch_size=1 \
--gradient_accumulation_steps=4 \
--max_train_steps=15000 \
--learning_rate=1e-04 \
--max_grad_norm=1 \
--lr_scheduler="cosine" --lr_warmup_steps=0 \
--output_dir=${OUTPUT_DIR} \
--push_to_hub \
--hub_model_id=${HUB_MODEL_ID} \
--report_to=wandb \
--checkpointing_steps=500 \
--validation_prompt="Totoro" \
--seed=1337
注意すべき一つのことは学習率が 1e-4 であることで、通常の微調整 (通常は ~1e-6 のオーダー) のための通常の学習率よりも遙かに大きいです。これは前の実行の W&B ダッシュボード で、2080 Ti GPU (11 GB の RAM) でおよそ 5 時間かかりました。私はハイパーパラメータの最適化は試みていませんので、貴方自身でそれを自由に試してください!Sayak は T4 (16 GB の RAM) で別の実行を行ないました。
ここに 彼の最終的なモデル があり、ここに それを使用したデモ Space があります。
diffusers における LoRA サポートの追加の詳細については、ドキュメント を参照してください – それは常に実装とともに最新の状態に保持されます。
推論
説明してきたように、LoRA の主要な利点の一つは、元のモデルサイズよりも桁違いに小さい重みを訓練することにより優れた結果を得られることです。私たちは、追加の重みを変更されていない Stable Diffusion モデル重みの上にロードすることを可能にする推論プロセスを設計しました。Let’s see how it works.
まず、LoRA モデルを微調整するために使用されたベースモデルが何かを自動的に決定するために Hub API を使用します。Starting from Sayak’s model, we can use this code:
from huggingface_hub import model_info
# LoRA weights ~3 MB
model_path = "sayakpaul/sd-model-finetuned-lora-t4"
info = model_info(model_path)
model_base = info.cardData["base_model"]
print(model_base) # CompVis/stable-diffusion-v1-4
このモデルは彼が微調整のために使用したモデルをプリントし、それは CompVis/stable-diffusion-v1-4 です。私の場合は、Stable Diffusion のバージョン 1.5 から始めてモデルを訓練しましたので、私の LoRA モデル で同じコードを実行する場合、出力は runwayml/stable-diffusion-v1-5 であることがわかるでしょう。
ベースモデルについての情報は前のセクションで見た微調整スクリプトにより、–push_to_hub オプションを使用する場合、自動的に追加されます。ここ でご覧になれるように、これはモデルの repo の README ファイルの metadata タグで記録されます。
LoRA 微調整するために使用したベースモデルを決定した後、通常の Stable Diffusion パイプラインをロードします。非常に高速な推論のために DPMSolverMultistepScheduler でそれをカスタマイズします :
import torch
from diffusers import StableDiffusionPipeline, DPMSolverMultistepScheduler
pipe = StableDiffusionPipeline.from_pretrained(model_base, torch_dtype=torch.float16)
pipe.scheduler = DPMSolverMultistepScheduler.from_config(pipe.scheduler.config)
And here’s where the magic comes. 通常のモデル重みの上に Hub から LoRA 重みをロードし、パイプラインを cuda デバイスに移して、推論を実行します :
pipe.unet.load_attn_procs(model_path)
pipe.to("cuda")
image = pipe("Green pokemon with menacing face", num_inference_steps=25).images[0]
image.save("green_pokemon.png")
LoRA による Dreamboothing
Dreambooth は新しいコンセプトを Stable Diffusion モデルに「教える」ことを可能にします。LoRA は Dreambooth と互換性があり、そのプロセスは幾つかの利点とともに微調整に類似しています :
- 訓練はより高速です。
- 訓練したい主題 (subject) の数枚の画像を必要とするだけです (5 か 10 枚で通常は十分です)。
- 必要であれば、主題への更なる忠実度のためにテキストエンコーダを調整できます。
LoRA で Dreambooth を訓練するためには、この diffusers スクリプト を使用する必要があります。詳細は、README, ドキュメント そして ハイパーパラメータ探求のブログ記事 をご覧ください。
LoRA で Dreambooth モデルを訓練する素早く、安価で簡単な方法については、hysts による この Space を確認してください。それを複製して GPU を割り当てる必要があります、そうすれば高速に実行できます。This process will save you from having to set up your own training environment and you’ll be able to train your models in minutes!
以上