「AUTOMATIC1111を利用せずにモデルマージを行いたい」
「Diffusersにおいて結合したモデルを利用したい」
このような場合には、この記事の内容が参考になります。
この記事では、コマンドラインを使ったモデル結合について解説しています。
本記事の内容
- モデル結合とは?
- コマンドラインによるモデル結合
- 結合したモデルの利用方法
それでは、上記に沿って解説していきます。
モデル結合とは?
Stable Diffusionでは、多くのモデルが公開されています。
最近では、DreamBoothによるモデル作成が主流になっています。
実際、公開されているモデルの多くはDreamBoothで学習しているようです。
そんな流れに加えて、モデルを結合するという流れも存在しています。
例えば、次の画像は3種類のモデルで生成した画像になります。
「a dog」のプロンプトをベースにして、もう一組作成。
それぞれ、左から順に以下モデルを利用しています。
- Anything v3.0
- 結合モデル
- Redshift Diffusion
結合モデルは、次の比率で作成したモデルです。
Anything v3.0 | 70% |
Redshift Diffusion | 30% |
Anything v3.0は、NovelAIがベースではないかと言われているモデルになります。
Redshift Diffusionについては、次の記事で説明しています。
両端は、それぞれ各モデルのスタイルが強く出ています。
Anything v3.0は、2次元です。
Redshift Diffusionは、明らかに3D風の画像になります。
そして、真ん中の画像は少し3Dの要素があるという感じです。
もちろん、SEED固定で同じプロンプトを利用しています。
以上、モデル結合について説明しました。
次は、コマンドラインによるモデル結合を説明します。
コマンドラインによるモデル結合
モデル結合でよく見かける事例は、AUTOMATIC1111を使った例になります。
ただ、個人的にはAUTOMATIC1111を利用していません。
Stable Diffusionは、次の方法で環境を構築しています。
そして、DiffusersベースでStable Diffusionを利用する形になります。
ここでは、このDiffusersを利用している場合の内容となります。
具体的には、コマンドラインを用いたモデル結合の方法です。
その際、次のページで配布されているプログラムを利用します。
GitHub – eyriewow/merge-models
https://github.com/eyriewow/merge-models
上記ページから、「merge.py」をダウンロードしましょう。
Stable Diffusionが動く環境なら、「merge.py」はそのまま動きます。
利用方法は、ヘルプで確認可能です。
> python merge.py -h usage: merge.py [-h] [--alpha ALPHA] [--output OUTPUT] [--device DEVICE] model_0 model_1 Merge two models positional arguments: model_0 Path to model 0 model_1 Path to model 1 options: -h, --help show this help message and exit --alpha ALPHA Alpha value, optional, defaults to 0.5 --output OUTPUT Output file name, without extension --device DEVICE Device to use, defaults to cpu
基本的な使い方は、以下。
merge.py model0 model1 --alpha 0.5 --output merged
「–alpha」の値により、混ぜ合わせる比率が決まります。
デフォルトでは、「0.5」で半分半分です。
今回は、次の比率でモデルを結合しています。
Anything v3.0 | 70% |
Redshift Diffusion | 30% |
実際に用いたコマンドは、以下となります。
python merge.py Anything-V3.0-pruned.ckpt redshift-diffusion-v1.ckpt --alpha 0.3 --output Anyred --device "cuda:0"
「–alpha」は、2つ目のモデルの重みを指定することになります。
Redshift Diffusionが30%であるため、「0.3」と指定します。
あと、GPUメモリに余裕があるならGPUを利用するように指定しましょう。
具体的には、次の計算でGPU利用の可否を判断可能です。
(size of both models) * 1.15
今回のパターンであれば、次の計算式になります。
3.76GB(Anything v3.0)+ 2.08GB(Redshift Diffusion)= 5.84GB 5.84GB x 1.15 = 6.716GB
GPUメモリが8GBあれば、GPU上でモデル結合が可能ということです。
もし足りない場合は、CPUのみで処理を行いましょう。
その場合は、「–device “cuda:0″」を外します。
では、コマンドを実行してみます。
処理が完了すると、次のように表示されます。
Stage 1/2: 100%|█████████████████████████████████████████████████████████████████████████████████| 1819/1819 [00:00<00:00, 2435.79it/s] Stage 2/2: 100%|███████████████████████████████████████████████████████████████████████████████████████████| 1131/1131 [00:00<?, ?it/s] Saving... Done!
同一ディレクトリ上に「Anyred-30.ckpt」が作成されています。
以上、コマンドラインによるモデル結合を説明しました。
最後に、結合したモデルの利用方法を説明します。
結合したモデルの利用方法
もちろん、ここでもDiffusersを利用しているケースで説明します。
と言っても、作成できたモデルはckptファイルです。
公開されているckptをDiffusersで読み込むのと何も変わりません。
そのため、次の記事の方法をそのまま利用できます。
なお、モデルによってはスタイル適用にプロンプトを工夫する必要がある場合があります。
例えば、Redshift Diffusionであれば「redshift style」をプロンプトに含めないといけません。
このルールは、結合したモデルにおいても有効です。
具体的には、次のようにモデル毎にプロンプトを変えています。
モデル | プロンプト |
Anything v3.0 | hatsune miku |
結合モデル | redshift style, hatsune miku |
Redshift Diffusion | redshift style, hatsune miku |
以上、結合したモデルの利用方法を説明しました。