LCM

Last-modified: 2024-02-10 (土) 21:11:28

注:本ページは執筆中のメモ段階です。
(情報が消える前にメモするのが目的なので、信憑性は担保できません。)
なお'23/12月末を目処に、LCMがニュース&スレで常用されているようなら、「執筆中」を外す予定です。

迷って来た(または迷ってきた)人向け

君の手元におそらくあるLCM_LoRA_Weightsとかpytorch_lora_weightsとかの名前のついたファイルは「Dreamshaper-V7を短ステップ数で再現できるLoRA」である。古い情報では「LCMを導入したモデルが必要なので探してみよう」等書かれていることがあるが、その直後のLCM_LoRAの登場で不要となった(LoRAなので好きなモデルと併用できる)。そのファイルさえあればよい。ちなみにHash値が同じなら名前違っても同じファイルである。1個でいいよ。
Dreamshaperはわりと汎用的なモデルではあるが、特定のモデルのデータがLoRAとしてくっついてきてしまうため絵柄がどうしても変わるのが難点。
1111はLCM用の収束設定をする項目がないので、AnimateDiffを導入することでもれなくついてくるLCMサンプラーを使うとよい(このサンプラーの挙動が気に入らない場合、プロンプト上で<lora:LCM_LoRAなんとか:0.4>のように影響を弱めると通常サンプラーでもそれなりにできることがわかっている。後述)。

なお、収束(完成)に必要なステップ数が通常よりは少なくて済むはず、という以外の利点はない(Step1周あたりの時間は短くならない)。LCM使用時にイイ構図が出たとしても、いつもの生成手段に切り替えるとすべてが変わってしまう。モデルによってはわりと馴染む、または独特な雰囲気になって意外とステキ、ということがあるので、それが気に入ったor今日はこれでいいやという場合向けといえる。

日常的な生成が(体感上)充分速い、困ってない、という人は、完成品質を犠牲にしてまでLCM/LCM_LoRAを導入する理由は薄い。


…つまりはロースペ救世主である。ようこそ。



概要

効果

  • 画像生成の生成速度が上がる。リアルタイム生成に貢献する。*1
  • Step数を増やしても、従来のsamplerと生成結果は異なる模様。*2
  • Step数を増やした後の、数値上のスコアは従来のsamplerと同等。*3

原理

Stable Diffusionなどの拡散生成モデルの理論は、2つの過程によって構成される。

  • 拡散過程
    モデル学習時に元の画像に少しずつノイズを加えていく過程。ノイズを加えるだけなので、理論的にも扱いやすい非常にシンプルなアルゴリズムで実装されている。
  • 生成過程
    完全なノイズから少しずつノイズを除去して画像を生成していく過程。ノイズを除去する機能をニューラルネットワーク(=モデル)で学習している。

生成過程について理論的な研究が進められていて、現在は2種類の微分方程式「PF-ODE」「reverse-time SDE」のいずれかに沿って生成することが多い。(これらの微分方程式については複雑すぎるのでここでは詳しく解説しない)
これらの微分方程式を数値的に近似して解く方法がサンプラー。お馴染みのEuler, Heun, PLMS, DPM, DPM++, UniPCなども、その正体はPF-ODEあるいはreverse-time SDEを数値的に解くアルゴリズム。

ある完全なノイズから出発して、PF-ODEによって画像を生成するまでの連続した軌跡のことをPF (Probability Flow)という。
(PF-ODEで画像検索してイメージを掴んでもらいたい)

「同じPFに属する値からは同じ画像が生成されるはず」という前提に基づいて学習されたモデルがCM (Consistency Model)。

  • このように学習することで、ノイズが小さいときの予測結果と、ノイズが大きいときの予測結果が一致するようになり、結果的にノイズが大きいときにも高い品質で画像を生成できるようになる。
  • 「ノイズが小さいときの予測結果」には学習対象のモデルではなく、既存のモデル(=教師モデル)を使う。このように、既存のモデルを使って新しいモデルを学習する方法のことを「蒸留」という。
  • 「同じ画像が生成される」という部分をConsistency (=一貫性)と表現している模様。
  • この技術は2023年3月に公開されたが、いまいち話題にならないまま忘れられてしまった。

Consistency ModelをLDM(=Stable Diffusion)*4に適用したものがLCM (Latent Consistency Model)。

  • LCMは2023年10月に公開されてじわじわと話題になって、現在はリアルタイム生成に活用されている。

としあき達の反応

すごく沢山の意見があるので、ざっくりまとめると、下記の感じ
(とりあえず、こんな感じですということを知ってもらうための'23/11月リリース時点の傾向です。大勢は今後変わります。)

  • LCMに対する反応
    • たくさん画像生成する人
      「早くていいやん!」
    • 生成品質を求める人
      「なんとか、品質下げんで済む方法はないかな?」「LCM4step✕2回のガチャをするより、他のsamplerで8step✕1回すれば良いのでわ?」
    • 学習メインの人
      sd-scriptsに対するPRが来ているけど、学習は品質が大事なので、安易に導入するのはちょっと・・・(意訳)」by kohya
もっと見る

28無念Nameとしあき23/11/10(金)12:04:19 ID:Dpr61MtsNo.1155757225
昨日みたときLCMのlora?くらいしか理解してなかったけど
>便利そうなので注目しておくのですよ…
> https://huggingface.co/blog/lcm_lora [link]
正しく要約できるかはまた課題として こうしてざっくり英文記事の要約を出してもらえるのは凄く便利だよなあ

76無念Nameとしあき23/11/10(金)13:51:45 ID:YyG4B9XENo.1155783218+
>多分だけどSDXLとかがデカすぎるからモデルを蒸留(?)することで4ステップで十分な品質の画像が生成出来るようになるよ! 速度10倍くらいになるよ!
今まではモデルの蒸留作業必要だったけど今回はLoraを使うだけでモデルをlcm化できるというすごいもの
最新のcomfyUIならlcm用のサンプラーもついてるのでお手軽にためせる
注意点としてCFGは1か2にする

83無念Nameとしあき23/11/10(金)14:05:40 ID:Dpr61MtsNo.1155785996そうだねx1
>今まではモデルの蒸留作業必要だったけど今回はLoraを使うだけでモデルをlcm化できるというすごいもの
>最新のcomfyUIならlcm用のサンプラーもついてるのでお手軽にためせる
LCMのマッピングとかの情報をLoRaって感じで外だしにしてるって感じなのかな? 
最近は1111webuiよりcomfyUIのほうが最新技術の対応が早いね

8無念Nameとしあき23/11/10(金)18:38:14 ID:dd3ZXL8YNo.1155848222そうだねx3
たておつ
LCMは下地を出すのに良かった
4枚7秒

16無念Nameとしあき23/11/10(金)18:45:12 ID:xIO2etT.No.1155850334
LCMのloraの学習コードさえ出してくれたらよく使うモデルでLCM化lora作っておくってできるんだが…

138無念Nameとしあき23/11/10(金)20:45:05 ID:8Sij1mXUNo.1155893697そうだねx1
たておつ
https://huggingface.co/blog/lcm_lora [link]
https://huggingface.co/latent-consistency/lcm-lora-sdv1-5 [link]
ステップ8ガイダンススケール1
ガイダンススケール1だとネガティブプロンプト無効ってことで困る時は困ると思うし絵作りの方法が全然変わってきてしまう
2まで上げる範囲でネガティブがどう効いてくるのが探り探りだ
数ステップ数秒でまともな絵がでてくるのは衝撃的だ

194無念Nameとしあき23/11/11(土)15:15:21 ID:u0XH.ABMNo.1156127477そうだねx2
たておつpussycat
Latent Consistency Modelの2-8step生成は非力なPCで輝くはずだけど
今のところLCMを使えるComfyUIでは--directmlと--lowvramは併用できない感じで
VRAM不足のうちでは--cpuを選ばざるをえない
A1111 webuiのDirectML版の方は生成できてるのでこっちがLCMに対応するのを待つ形になる

実装・利用方法

Stable diffusion web UIにおけるLCMの実装

1. stable-diffusion-webui/venv/Scriptsに移動し、venvを有効化する。
2. pip show diffusers を実行し、現在のバージョンを確認する
3. 入ってなかったりバージョンが古い場合は、pip3 install --upgrade diffusers を実行してインストールする
4. pip show diffusers を実行し、現在のバージョンを確認して更新されてるかチェック
5. 入ってたらvenvを抜けて普通にwebuiを起動
6. webuiでLCMタブがあればOK

  • タブ出てこないんだけど→stable-diffusion-webui\venv\Lib\site-packages に古いdiffusersがあったら消してやり直す

WebUIでLCM LoRAを使えるようにする

  1. LCM samplerを追加する拡張をインストールする
    GitHub - light-and-ray/sd-webui-lcm-sampler: LCM Sampler for sd-webui
    手動で改造する場合

    手動で改造する場合
    ※ファイルを書き換えますので必要に応じてバックアップを取ってください

    1. k_diffusionにsamplerを追加する
      以下のファイルを書き換えます
      stable-diffusion-webui\repositories\k-diffusion\k_diffusion\sampling.py
      ファイルの最後に次のコードを追加してください
      @torch.no_grad()
      def sample_lcm(model, x, sigmas, extra_args=None, callback=None, disable=None, noise_sampler=None):
          extra_args = {} if extra_args is None else extra_args
          noise_sampler = default_noise_sampler(x) if noise_sampler is None else noise_sampler
          s_in = x.new_ones([x.shape[0]])
          for i in trange(len(sigmas) - 1, disable=disable):
              denoised = model(x, sigmas[i] * s_in, **extra_args)
              if callback is not None:
                  callback({'x': x, 'i': i, 'sigma': sigmas[i], 'sigma_hat': sigmas[i], 'denoised': denoised})
      
              x = denoised
              if sigmas[i + 1] > 0:
                  x += sigmas[i + 1] * noise_sampler(sigmas[i], sigmas[i + 1])
          return x
    2. WebUIでsamplerを呼び出せるようにする
      以下のファイルを書き換えます
      stable-diffusion-webui\modules\sd_samplers_kdiffusion.py
      ファイルの39行目(Restartの下)あたりに追加してください
          ('LCM Test', 'sample_lcm', ['lcm'], {}),
    3. WebUIを再起動する
  2. LCM LoraをダウンロードしてLoraフォルダに配置します
    latent-consistency/lcm-lora-sdv1-5 at main (huggingface.co)
    pytorch_lora_weights.safetensorsをダウンロードしてLoraフォルダに配置してください
  3. 実際に生成する
    特別なタブページとかは無く、いつもどおりの生成する感じ。下記のように設定する。
    ①<lora:pytorch_lora_weights:1>をプロンプトに入れて指定します
    Sampling methodを「LCM Test」に設定し、Stepsを6~8程度にします
    ③CFG Scaleを1~2に設定します
    ④生成(Generate)ボタンを押す
    ※いつも通りのプロンプト、モデル、Loraを利用できます

実のところsamplerを追加しなくてもLoRAさえ利用すれば
Euler aなどでも低Steps(≒高速化)で出力できる様だ

参考①

https://pc.watch.impress.co.jp/docs/column/nishikawa/1547611.html
の後半 >入稿後、AUTOMATIC1111Sampling method: LCMを追加する方法が分かった

参考②

https://github.com/continue-revolution/sd-webui-animatediff/tree/master#lcm
>I provide a "gift" to everyone who update this extension to >= v1.12.1 - you will find LCM sampler in the normal place you select samplers in WebUI. You can generate images / videos within 6-8 steps if you
>select Euler A / Euler / LCM sampler (other samplers may also work, subject to further experiments)
>use LCM LoRA

https://civitai.com/models/195519/lcm-lora-weights-stable-diffusion-acceleration-module
>use a low CFG denoising strength (1-2 is recommended)

LCMサンプラーを使用しない LCM LoRAの出力設定

「LCM LoRAは高速なんだけど、絵柄がLCM LoRAに引っ張られて雰囲気がかなり変わっちゃうよね…」
という欠点の緩和に役立つ設定。
関連記事リンクにもあるが、下記の内容が詳しい。推奨値などの説明もあるので一読をおすすめ。
【西川和久の不定期コラム】Stable Diffusion高速化の決定版登場!?品質落とさず制限もほぼなしで2~3倍速に - PC Watch

標準出力よりRTX3060 12GBで約3割の生成時間短縮効果が得られた
・LCM LoRAを強度0.3で使用

 Civitai LCM-LoRA Weights - Stable Diffusion Acceleration Module(上のhuggingfaceと同じ物)
 https://civitai.com/models/195519?modelVersionId=225222

・<lora:LCM_LoRA_Weights_SD15:0.3>
Sampling method : DPM++ 2S a Karras
・CFG Scale : 2.5~3程度
・Step 6~8程度
・hiresfix step : 0(生成と同数を自動設定)
・hiresfix Sampling method : same (更に早くするならEuler a)
ステップ減少分書込みが少なくなるのはflatのマイナス適用や同系LoRAを使用して補正可能

関連記事リンク

記事

論文


*1 原理はarXiv論文を参照。低Stepでスコアが高い
*2 このページ内の説明や、diffuser公式サンプル画像の後期Stepを参照のこと
*3 arXiv論文のCLIP scoreを参照。8step以上になるとLCMの優位性はなくなる。
*4 Stable DiffusionなどのLDM (Latent Diffusion Model)は、画像そのものにノイズを加えるのではなく、VAEでエンコードされた潜在ベクトル(Latent)に対してノイズを加えるという原理で動いている。