「DreamBoothを動かせる環境がない・・・」
「気軽にモデルのファインチューニングを実行したい」
このような場合には、LoRAがオススメです。
この記事では、LoRAについて解説しています。
本記事の内容
- LoRAとは?
- LoRAのシステム要件
- LoRAのインストール
- LoRAの動作確認
それでは、上記に沿って解説していきます。
LoRAとは?
LoRAとは、モデルの微調整を行う仕組みのことです。
以下では、その仕組みで生成したモデルをLoRAモデルと呼びます。
LoRAの詳細は、GitHubのページで説明されています。
Low-rank Adaptation for Fast Text-to-Image Diffusion Fine-tuning
https://github.com/cloneofsimo/lora
LoRAの特徴として、以下が記載されています。
- DreamBoothより2倍速い
- 数MBのサイズ容量で済む
- Diffusersで簡単に利用できる
- 全体のファインチューニングより良い効果を出す場合がある
- LoRAモデル同士を結合できる
- CLIPとUnetを両方を微調整できる
DreamBoothは、モデル自体を新規に作成します。
それに対して、LoRAはモデルを微調整するのです。
LoRAは、オリジナルモデルをそのまま利用します。
利用したまま、CLIPとUnetを微調整する仕組みです。
モデル全体ではなく差分だけとなるため、ファイルサイズは小さくなります。
そして、その差分であるLoRAモデル同士を結合することもできます。
一言で言うと、柔軟性のあるファインチューニングと言えます。
また、LoRAではDreamBoothほどGPUメモリを必要としません。
したがって、LoRAはファインチューニングの敷居を下げていると言えます。
追記 2023年2月24日
AUTOMATIC1111版web UIでLoRAを利用する場合は、次の記事をご覧ください。
以上、LoRAについて説明しました。
次は、LoRAのシステム要件を説明します。
LoRAのシステム要件
LoRAのシステム要件は、主に次の二つが挙げられます。
- PyTorch
- Accelerate
PyTorchは、GPU版のみが対象となります。
CPUだけで学習するのは、さすがに無理があります。
各自の環境にあったバージョンをインストールします。
また、Accelerateもインストールします。
ちゃんと「accelerate config」で設定までしておきましょう。
詳細は、上記の記事内で説明しています。
以上、LoRAのシステム要件を説明しました。
次は、LoRAのインストールを説明します。
LoRAのインストール
LoRAのインストールは、Python仮想環境の利用をオススメします。
Python仮想環境は、次の記事で解説しています。
検証は、次のバージョンのPythonで行います。
> python -V Python 3.10.4
では、LoRAのインストールを進めていきます。
まずは、Githubからリポジトリをクローンします。
git clone https://github.com/cloneofsimo/lora.git
ダウンロードできたら、リポジトリのルートへ移動。
cd lora
同じディレクトリ上に次のファイルを確認できます。
requirements.txt
diffusers>=0.9.0 transformers scipy ftfy fire
そのまま一括でインストールしましょう。
pip install -r requirements.txt
インストールには、少し時間がかかります。
以上、LoRAのインストールを説明しました。
次は、LoRAの動作確認を説明します。
LoRAの動作確認
LoRAの動作確認を行う場合、主に次の2点が考えられます。
- LoRAモデルの利用(推論)
- LoRAモデルの作成(学習)
今回は、LoRAモデルの利用(推論)までを確認します。
LoRAモデルの作成(学習)については、次の記事で解説しています。
では、LoRAモデルの利用を動作確認していきます。
LoRAモデルは、すでにダウンロード済みです。
この中から、適当にLoRAモデルを選びます。
そして、動作確認に利用するのは次のコードです。
import torch from lora_diffusion import monkeypatch_lora, tune_lora_scale from diffusers import StableDiffusionPipeline, EulerDiscreteScheduler model_id = "stabilityai/stable-diffusion-2-1-base" unet_pt = "lora_●●●.pt" pipe = StableDiffusionPipeline.from_pretrained(model_id) pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config) pipe = pipe.to("cuda") monkeypatch_lora(pipe.unet, torch.load(unet_pt)) tune_lora_scale(pipe.unet, 1.2) prompt = "style of sks, a dog in the city" image = pipe( prompt, num_inference_steps=50, guidance_scale=7 ).images[0] image.save("test.png")
モデルは、Stable Diffusion v2.1を利用します。
上記コードにおいて、注目すべきは次の箇所です。
monkeypatch_lora(pipe.unet, torch.load(unet_pt)) tune_lora_scale(pipe.unet, 1.2)
ここで、LoRAモデルを読み込んでいます。
LoRAモデルの効果は、「1.2」の値を変更することで調整できます。
あと、LoRAモデルを反映させるためにはプロンプトを工夫する必要があります。
プロンプトには、「style of sks」を含まないといけません。
これは提供済みのLoRAモデルが、このようなルールで作成されているからです。
実際に上記コードを実行した結果、次の画像が作成されました。
test.png
特徴のある犬の画像が生成されました。
LoRAの特徴にあったように、本当に簡単にLoRAを利用できますね。
以上、LoRAの動作確認を説明しました。