こんばんは、スタジオ真榊です。今回は、supermergerやregional-prompterで知られるhakomikanさんが開発した追加学習法「ADDifT」についての特集記事です。
CoppyLoRAで使われているコピー機法と同様に、2枚の画像ペアから違いを抽出し、LoRAとして出力することができる技術で、最短1分でLoRAを作れる快速性が最大の特徴です。
おなじみのCoppyLoRAは2枚の画像を過学習した「コピー機LoRA」を順番に作って差分を取るのですが、今回検証するADDifTはコピー機LoRAを作らず、2枚の画像をもとにいきなり差分LoRAを一発学習できるのが最大の違い。RTX4080環境ですと、CoppyLoRA一つ学習するのに40分かかりますが、ADDifTは1~5分程度で学習ができてしまいます。
ADDifTはhakomikanさんの提供されているLoRA学習用の拡張機能「traintrain」に実装されているのですが、以前reForgeに導入してみたところ環境ごと壊れてしまったので、A1111版かForgeで導入するか、拡張ではなく単独で動作する「traintrain-standalone」を使うのが安心かもしれません(現在はreForgeにも対応しているとの告知あり。試していませんので各自自己責任で)
この記事では、インストール方法を簡単に触れた後で、実際に各種LoRAを作って検証し、従来のCoppyLoRAとの使い分けを考えてみたいと思います。
1.インストール
まずはインストール方法から見ていきましょう。traintrainを拡張機能としてインストールする方法と、coppywebUIのようにスタンドアロン(単体)で動作するアプリをインストールする方法の二つを順番に解説していきます。スタンドアロン版の方はやや導入が複雑です。
(1)拡張機能としてインストールする方法
公式サイトの説明によると、拡張機能が動作するのは、A1111版WebUI v1.10か、Forge/reForge の最新バージョン。やり方は「URLからインストール」に「https://github.com/hako-mikan/sd-webui-traintrain」と入力して「インストール」するだけでOKです。

インストールがうまくいっていれば、このようにtraintrainのタブができているはずです。こちらが起動画面。スタンドアロン版を使わない方は「2.traintrainを使ってみよう」まで飛んでOKです。

(2)スタンドアロン版をインストールする方法
SDwebUIの拡張機能ではなく、CoppyLoRAwebUIのように単体で動作させたい場合はこちら。インストールしたい場所でこちらのリポジトリをgit cloneします。
よく分からない方(かつ、Win11を使用している方)は、インストールしたい場所で右クリックして「ターミナルを開く」をクリック。「git clone https://github.com/hako-mikan/traintrain-standalone」と入力してENTERすると、その場所にフォルダができるはずです。よくわからなかったらChatGPTやGrok3に「このリポジトリを好きな場所にgit cloneしたいんだけどどうしたらいいの?」と聞いてみましょう。

スタンドアロン版の場合、インストールが終わった後に、普段使っているmodelフォルダのパスを指定する必要があります。これを指定しないと、ベースモデルやVAEを選ぶことができませんし、出力先のLoRAフォルダが見つかりません。
webui-user.batをメモ帳で開いたら、「set COMMANDLINE_ARGS=」となっている行を下記のように書き換えます。
set COMMANDLINE_ARGS=--models-dir (modelsフォルダのフルパス)
例えば私の環境だとこのようになります。余計な半角スペースなどがないかよくチェックしましょう。できたらファイルを上書きして保存。

書き換えが済んだら、今上書き保存したwebui-user.batをダブルクリックします。初回は各種インストールが進むので多少待つことになります(次回からはサクサク)。このような画面になりますので、「Running on local URL:」以降のURL部分をCtrlキーを押しながらクリックすると、ブラウザでスタンドアローン版のtraintrainが起動します。

2.traintrainを使ってみよう
traintrainはADDifT専用のアプリというわけではなく、汎用的なLoRA学習ツールです。LoRA学習自体はほかのツールでも可能ですが、hakomikanさんの開発したADDifTでの学習は現時点ではこのツールでしか行うことができません。
◇公式解説
こちらの「Mode」から「ADDifT」にチェックを入れるところから始めましょう。

その右上にあるのは、学習目的別の設定プリセットのプルダウンメニューです。「ADDifT Action」は二枚の画像の動きや位置の違いを抽出するのに向いた設定で、「ADDifT Style」は画風の違いを抽出するのに向いた設定です。SDXLモデル用LoRAを作る場合は「XL」がついているものを選び、横の「↙」ボタンを押すと、公式おすすめの設定が全ての入力欄に上書きされます。

3.ポーズ差分学習
では、さっそくこちらのペアで「口元で逆ピースをして舌を出すポーズLoRA」を作ってみましょう。

・画像ペアを簡単に作るには?
その前に、こうした差分LoRA学習用の画像ペアの作り方から触れておきます。
このような差分用画像はNovelAIのv4インペイントを使うと簡単に作ることができます。まず学習ターゲットとしたいポーズの画像を用意し、このように手と口の部分をインペイントして普通のポーズにするだけ(arms at sideタグを使うと自然に手を下におろせます)。二つの画像の間で異なっているのはポーズだけ、というペアにできればOKです。

NAIをサブスクしていない方は、Controlnetインペイントなどを使ってもよいでしょう。最近では、ChatGPT4oに頼むなどしてペアを作ることもできるようになってきています(画角を変えるLoRAなどを作るときはとても役に立ちます)
・使用モデル
今回のテストに使用したベースモデルはWAI-NSFW-illustrious-SDXLのv12です(記事執筆時点の最新バージョンはv13)。ターゲット画像も、ベースモデルのマスピ画風で生成した方がLoRAの精度がよくなると思われます。

・traintrainの設定
さっそく学習していきましょう。LoRA学習が初めてで「dim」や「alpha」、「オプティマイザ」といった言葉について知らない方はこちらの記事をご参照ください。
traintrainの設定はこのような感じです。(拡大して御覧ください)

・「停止」のすぐ下のウィンドウでアクション(ポーズを動かす)LoRA学習用のプリセット「ADDifT Action XL」を選び、↙ボタンを押すとプリセット(ひな形)が入力されます。
・「モデル」からベースモデルにするcheckpointを選択(今回はWAI-NSFW-illustrious-SDXLのv12)
・「VAE」はNoneか、普段使用しているものを選びます。
・「train iterations」は学習回数。ADDifTでは30~100程度が限界で、それ以上にすると過学習を起こします。ここは公式プリセットのまま「30(回)」にします。train batch sizeは公式推奨の「1」とします。
・「train learning rate」は学習率(lr)。プリセットの「0.0002」のままでいきます。
・「train optimizer(オプティマイザ)」はプリセットのCAMEを使います。これは、低ステップから学習結果が出てくることで知られている比較的新しいオプティマイザです。
・プリセットを使う場合、network rank(いわゆるdimのこと)は4、alphaは1が推奨値。これを引き上げると学習に時間が掛かり、LoRA自体が重くなる代わりに細部をよく学習することができます。とりあえずそのままでやってみます。
・「train lr scheduler」は、学習率スケジューラ。デフォルトはコサインですが、プリセットだと「cosine annealing」を採用しているようです。このままやります。
・「use gradient checkpointing」は、学習時のVRAM使用量を抑制できる重要オプション。学習開始したらVRAMがいっぱいになってしまって異常に学習に時間が掛かってしまう場合、ここにチェックを入れましょう。(私のRTX4080環境ではチェック必須です)
・「save lora name」に、これから作るLoRA名を記入します。「lora trigger word」はいわゆるトリガーワードのこと。通常のLoRA学習では「vpero」などと独自の文字列を入れておくと、そのワードを入れたときに覚えさせた要素が現出するようにできるのですが、ADDifTではあまり安定した効果が見られないようです。普段は空欄にしています。
・「network blocks(BASE = TextEncoder)」はモデルのどの層に学習を影響させるかです。プリセットは「BASE」だけ外しており、つまりTextEncoderに学習させない設定になっています。
一つ下の画面はほぼいじりません。アクションLoRAの場合はtrain min timestepsを500、train max timestepsを1000とするのが公式の推奨で、プリセットでもそのようになっています。「save as json」という入力欄にチェックを入れておいて学習すると、学習した設定がさきほどのプリセット欄に記録されるので、いつでも呼び出せるようになります。

あとは画面最下部の二つある画像入力欄から、用意したペアを入力します。左がベース、右がターゲット。LoRAを適用すると、左の画像が右の画像に変化するのを想定します。画像ペアのサイズは必ず一致するようにしましょう。

あとは「Start Training」ボタンを押せば学習開始です。私の環境では1分20秒ほどで、ADDifT製LoRA「test01.safetensors」が保存されました。









