Open8
stable diffusion
シンギュラリティ・ソサエティのAI Innovators Hubに参加しています。
Stable Diffusion Webui をMacで動かすことができたので、
次はCUIを使ってmac でstable diffusionを使う方法を調べます。
webuiを入れたときに諸々の機械学習環境は入っているので
pip install diffusers
pip install transformers
の追加。
サンプルコードを見ながら作成。
airplane and cloudsの指定通りの絵が書けた。
モデルが古いからか、クオリティーは低い。
を試す。
pipは追加不要。
動かすとcudaのエラー。
cuda をmpsに置き換える
import torch
from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel, EulerDiscreteScheduler
from huggingface_hub import hf_hub_download
from safetensors.torch import load_file
base = "stabilityai/stable-diffusion-xl-base-1.0"
repo = "ByteDance/SDXL-Lightning"
ckpt = "sdxl_lightning_4step_unet.safetensors" # Use the correct ckpt for your step setting!
# Load model.
unet = UNet2DConditionModel.from_config(base, subfolder="unet").to("mps", torch.float16)
unet.load_state_dict(load_file(hf_hub_download(repo, ckpt), device="mps"))
pipe = StableDiffusionXLPipeline.from_pretrained(base, unet=unet, torch_dtype=torch.float16, variant="fp16").to("mps")
# Ensure sampler uses "trailing" timesteps.
pipe.scheduler = EulerDiscreteScheduler.from_config(pipe.scheduler.config, timestep_spacing="trailing")
# Ensure using the same inference steps as the loaded model and CFG set to 0.
pipe("A girl smiling", num_inference_steps=4, guidance_scale=0).images[0].save("output.png")
次は動画を試してみる
text-to-videoで適当の選ぶ
コピペ。
raise ImportError("`enable_model_cpu_offload` requires `accelerate v0.17.0` or higher.")
ImportError: `enable_model_cpu_offload` requires `accelerate v0.17.0` or higher.
となる。
pip install accelerate
して再度実行
raise AssertionError("Torch not compiled with CUDA enabled")
AssertionError: Torch not compiled with CUDA enabled
pipe = pipe.to("mps")
を追加しても変わらず。
疑問
- CUDA以外で動くかどうか、なにで判断すれば良い?それとも全てmpsを指定すれば動く?
- mpsで指定すれば動く場合、その書き方はどこを見れば良い?
diffusers, pytouch(touch), transformar, accelerateあたりは、まとめと、tipsがあるとよいかも。
M1チップでtext-to-videoはまだサポートしてないようだ。
"torch.nn.Conv3D on MPS backend" は対応済みっぽいので時間の問題?
stable diffusion自体はすでにmpsに対応しているのでこれは不要だと思うが、修正内容としては参考になる。
動画は一旦やめてimageへ
web uiで使ったmodelを試してみる
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("Justin-Choo/epiCRealism-Natural_Sin_RC1_VAE")
# for M1 mac
pipe = pipe.to("mps")
pipe.enable_attention_slicing()
prompt = "polaroid photo, night photo, photo of 24 y.o beautiful woman, pale skin, bokeh, motion blur"
# warmup for mac
pipe(prompt, num_inference_steps=1)
image = pipe(prompt).images[0]
image.save("./episode3.jpg")
最初に作ったサンプルと組み合わせてできた
# from diffusers import StableDiffusionPipeline
# pipe = StableDiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("Justin-Choo/epiCRealism-Natural_Sin_RC1_VAE")
最初とimportするものが少し異なる。これの差分は何?
他はpipeの処理はほぼ同様で動く。