西川和久の不定期コラム
Stable Diffusion高速化の決定版登場!?品質落とさず制限もほぼなしで2~3倍速に
2023年11月20日 06:14
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)だった。技術的には良く分からないので、詳細はここを参考としたが、実際の動きとしては、
上に並べた画像から分かるように、画像を生成するのに書込量の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は、初回時、自動的にダウンロードされるので手間いらずだ。
いかがだろうか? 書込量となる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が入っているフォルダに入れておく必要がある。
処理時間を見ればその差歴然で、約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では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は少し大きめとなる。
もちろん、この設定をした状態で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>方式の方を使えば良い。処理速度的に変わりはない。