西川和久の不定期コラム

Stable Diffusion高速化の決定版登場!?品質落とさず制限もほぼなしで2~3倍速に

 11月9日に掲載した前々回、Stable Diffusionの高速化技術として「TensorRT」、「SSD-1B」、そして「LCM」をご紹介したが、どれも帯に短し襷に長しと言う残念な結果だった。ところが翌日の11月10日、「LCM LoRA」の登場により、それが引っ繰り返ってしまったのだ。今回はこの辺りをお話したい。

Latent Consistency Model LoRAとは?

 11月9日に掲載した前々回の3番目に書いたのが、このベースとなるLCM(Latent Consistency Model for Stable Diffusion)だった。技術的には良く分からないので、詳細はここを参考としたが、実際の動きとしては、

SDXL通常の処理でStep 5 / 00:01<00:00, 8.17it/s
SDXL通常の処理でStep 10 / 00:02<00:00, 7.22it/s
SDXL通常の処理でStep 15 / 00:02<00:00, 7.07it/s
SDXL通常の処理でStep 20 / 00:03<00:00, 7.05it/s

 上に並べた画像から分かるように、画像を生成するのに書込量のStep数が20~30(もっとの場合も)必要となり、Step数が増えるほど絵がしっかりしてくる。またかかる時間は正比例する。

 もし、少ないStep数で同じレベルの絵を生成できれば、高速化が実現できる、という発想から生まれたのがLCMというわけだ。

 なおこれらも含め以降、すべての計測は、少し前に作ったRTX 4090搭載AIマシンで行なっているためかなり速い。GeForce RTX 3060などミドルクラスでは、もっと時間がかかることが予想される(おそらく4~5倍程度)ため、あらかじめご了承頂きたい。

 前々回では、“LCM専用Model”が必要だったのに対し、今回はLoRA(Low-Rank Adaptation)というのが異なり、一般的なModelにこのLoRAを追加するだけ形式、つまりこれまで使っていたイラスト系やアジア美女リアル系など、ModelはそのままLCM化でき、より実用的に使えるのが特徴となる。

 具体的な設定内容はここによると

  • Latent Consistency Model LoRAの重みは1
  • Samplerはlcm
  • schedulerはlcm(もしくはsgm_uniform)
  • Stepは2~8
  • CFG(Guidance) Scaleは1~2

となっている。

 LoRA自体は以下からダウンロード可能だ。SD 1.5でもSDXLでもLCM LoRAは使用できるが、ファイルが異なるので注意が必要。SD 1.5とSDXLが混在する環境では、元々のファイル名が違うCivitai側のをお勧めする。

 以降、これらの設定方法が生成アプリによって呼び名や場所が違うため、Fooocus、StableSwarmUI(ComfyUI)、AUTOMATIC1111の順に解説する。

FooocusでLCM LoRAを使う方法

 FooocusでLCM LoRAを使うのは非常に簡単。というのも、バージョン2.1.799で正式対応したためだ。従来のPerformance、Speed(Step 30)とQuality(Step 60)にExtreme Speedが追加され、これを選ぶだけでLCM LoRAがオンとなる。ModelやほかのLoRA、UpscaleやControlNetなどは、そのまま普通に利用でき、何の制限もない。

 ログを見ると、Samplerとschedulerはlcm、Stepは8、Guidance Scaleは1と自動的に設定されている。またLCM LoRAであるpytorch_lora_weights.safetensorsは、初回時、自動的にダウンロードされるので手間いらずだ。

FooocusのPerformance設定。Extreme SpeedがLCM LoRA動作モードとなる
Performance > Speed (Step 30) / 8.02 seconds
Performance > Extreme Speed (Step 8)/ 3.13 seconds

 いかがだろうか? 書込量となるStep数が大幅に異なるので絵柄は違うものの、クオリティ自体には差がないのがお分かり頂けるだろうか。しかも処理時間は2.5倍ほどの差が出ている。LCMでは速いものの、眠く、大雑把な絵だっただけに、ちょっと驚きの結果だ。

StableSwarmUIでLCM LoRAを使う方法

 StableSwarmUIは今のところFooocusのように一発切り替えのスイッチはなく、地味に各パラメータを設定する。具体的には

  • Steps: 5~8
  • CFG Scale: 1~2
  • Sampler: lcm
  • Scheduler: sgm_uniform

 そしてLoRAsのタブでpytorch_lora_weights.safetensorsを指定し、重みを1とする。自動的にダウンロードしないので、事前にダウンロードし、LoRaが入っているフォルダに入れておく必要がある。

StableSwarmUIの設定
通常 (Step 20) / 2.94 (gen) seconds
LCM LoRA (Step 6) / 1.17 (gen) seconds

 処理時間を見ればその差歴然で、約2倍。Fooocus同様、構図などは異なるものの、絵的なクオリティには変わりない。なお、StableSwarmUIは、バックエンドでComfyUIが動いているため、ComfyUI単独使用でも同じ設定をすればOKだ(確認済み)。

AUTOMATIC1111でLCM LoRAを使う方法

 FooocusとStableSwarmUIはSDXL専用だが、LCM LoRAはSD 1.5でも(ファイルは別になるが)動作する。そして唯一SD 1.5とSDXLの両方を試せるのが、このAUTOMATIC1111となる。

 ただ大きな問題があり、先のレシピ通りの設定ができない。それはSampler lcmとScheduler lcm、もしくはsgm_uniformがないためだ。

 AUTOMATIC1111がなぜこのような仕様になっているのか不明だが、該当項目がSampling methodとなっており、“DPM++ 3M SDE Karras”など、“Sampler + Scheduler”の形式で1つにまとまっているのだ。この例だと、SamplerはDPM++ 3M SDE。SchedulerはKarrasとなる。加えてlcmとsgm_uniformがない。試しにほかの組み合わせで生成すれば分かるが、ガチガチの妙な絵が出てくる。

AUTOMATIC1111のSampling methodにlcmやsgm_uniformがない
DPM++ 2M SDE Karrasで無理にLCM LoRAを使うとガチガチな絵となる

 ではAUTOMATIC1111ではLCM LoRAは使えないのか? となるが、無理やり何とかしたのが以下のレシピ。パラメータはSD 1.5でもSDXLでも同じだ。

  • LoRA: <lora:LCM_LoRA_Weights.safetensors:0.3> (SDXLの場合)
  • LoRA: <lora:LCM_LoRA_Weights_SD15.safetensors:0.3> (SD 1.5の場合)
  • Sampling method: DPM++ 2S a Karras
  • Sampling steps: 4~8 (推奨6)
  • CFG Scale: 2~3 (推奨 SD 1.5: 2.5, SDXL: 2.0)

 ここでの肝は、LoRAの重みを0.3とし、かなり効果を弱めること。そしてSampling methodはDPM++ 2S a Karras、Stepsは変わらないが、CFG Scaleは少し大きめとなる。

AUTOMATIC1111のLCM LoRA設定
SD 1.5 通常 (Step 20) x4 / 00:07<00:00, 14.45it/s
SD 1.5 LCM LoRA (Step 6) x4 / 00:03<00:00, 11.15it/s
SDXL 通常 (Step 20) / 00:06<00:00, 3.68it/s
SDXL LCM LoRA (Step 6) / 00:02<00:00, 3.96it/s

 もちろん、この設定をした状態でHires. fix、ADetailer、ControlNet、FreeUなどは今まで通り使用可能。リードで「制限もほぼなし」と書いたのは、ほかのアプリも含めSampling methodが固定となるから……ただそれだけだ。

 結果はご覧の通り、FooocusやStableSwarmUIとは設定内容が異なるものの、画質は問題なし、処理時間はSD 1.5で約2.3倍、SDXLで3倍の爆速!

 以上のように、画質を保ちつつ処理速度が大幅に向上するLCM LoRAは、まさに「待ってました!」的な手法だが、何か欠点があるのでは? と多くの人は思うだろう。

 もちろんあるにはある。まずレアケースだが組み合わすModelと相性があること。手持ちでは2つほどNGだった(まず使わないModelだったので実害はない)。加えてそもそもStep数を減らして高速化しているので、絵柄によっては絶対的な書込み量不足になること“も”あるのだ。

 たとえばリアル系だとModelによっては露出狂(=衣服を書くStepが足らない)になったり(笑)、背景があっさりしてるなどがあるだろうか。ただ前者は呪文で重みを付け、逃げられるし、後者はポートレートなら背景はボケていることが多くそれほど気にならない。

 問題があるとすれば、背景の書込み量命的イラスト系だとつらいかも知れないが、筆者の専門外なのであまり詳しくは調べていない。

 いずれにしても、これに遭遇した場合は、速度を取るか、緻密さを取るか的な選択となる。とは言え、個人的にはLCM LoRA ONが既にデフォルト。少なくともリアル系は常用で大丈夫。もともとGeForce RTX 4090で速かったのに、その2~3倍速! ノーマルのSD 1.5とほとんど変わらなくなってしまった。


 以上、各代表的なアプリでのLCM(Latent Consistency Model) LoRA設定方法とその爆速度をご紹介した。期待のTensorRTは、変換の手間がかかる上、制限事項が多く、SSD-1BやLCMは画質が……っとガッカリした翌日にLCM LoRA登場。制限は特になく画質も良好。そして処理速度は2~3倍と、GPUを買い換えずしてこのパフォーマンスアップは驚異的だと思った。

 Fooocus、StableSwarmUI(ComfyUI)、AUTOMATIC1111を使っているユーザーは是非一度試してほしい。


 入稿後、AUTOMATIC1111にSampling method: LCMを追加する方法が分かったので軽く触れておきたい。方法は簡単! Extensionのsd-webui-animatediffをインストールすればOK。この中に含まれるLCMを流用する形となる。

 後は<lora:LCM_LoRA_Weights.safetensors:1>として、最初に書いたパラメータをセットすれば作動する。ただ実際試すと描写が結構大雑把なので、細かく出したい時には、<lora:LCM_LoRA_Weights.safetensors:0.3>方式の方を使えば良い。処理速度的に変わりはない。