RuntimeError: mat1 and mat2 shapes cannot be multiplied

Stable Diffusion で InPaint をするべく、ControlNet で色々試していた時に表示されたエラー。

RuntimeError: mat1 and mat2 shapes cannot be multiplied (154x2048 and 768x320)

行列の内積を計算できないという意味で、ベースモデルとコントロールネットのモデルのバージョンが一致していないときなんかに起こるようです。Web UI での InPaint の方法はいろいろなサイトで紹介されているのですが、Python のコードの解説は(日本語では)少ないですね。

SD1.5、SD2.0、SDXL など、どのバージョンを使うのかを意識して ControlNet も選びます。

Stable Diffusion 2.0 系の組み合わせ例

Base Model: stabilityai/stable-diffusion-2-inpainting

ControlNet: thibaud/controlnet-sd21-canny-diffusers

Stable Diffusion XL 系の組み合わせ例

Base Model: diffusers/stable-diffusion-xl-1.0-inpainting-0.1

ControlNet: diffusers/controlnet-canny-sdxl-1.0

diffusers のモジュール

SDXL は使用するdiffusersのクラスも異なります。SDXL用はまだ比較的新しいようで、あまり解説も見当たりません。(まだ開発途上?)

SDSDXL
InpaintPipeLineStableDiffusionControlNetInpaintPipelineStableDiffusionXLControlNetInpaintPipeline
ControlNetControlNetModelControlNetModel

ControlNet についてはどちらもControlNetModelでいけました。