見出し画像

StreamDiffusionとか

StableDiffusionが出たときぶりに画像生成AIをローカルに構築してみる

まずはcolabでお試し

from google.colab import drive
drive.mount('./gdrive')
!mkdir -p ./gdrive/MyDrive/pip/
import sys
sys.path.append('/content/gdrive/MyDrive/pip')
#!mkdir -p ./diffusers/

# PyTorchとxformersのインストール
import sys
sys.path.append('/content/gdrive/MyDrive/pip')
!pip install --target /content/gdrive/MyDrive/pip  torch==2.1.0 torchvision==0.16.0 xformers --index-url https://download.pytorch.org/whl/cu121
!pip install --target /content/gdrive/MyDrive/pip diffusers
!pip install --target /content/gdrive/MyDrive/pip accelerate
!pip install --target /content/gdrive/MyDrive/pip git+https://github.com/cumulo-autumn/StreamDiffusion.git@main#egg=streamdiffusion

import torch
from diffusers import AutoencoderTiny, StableDiffusionPipeline

from streamdiffusion import StreamDiffusion
from streamdiffusion.image_utils import postprocess_image
import time
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import display  # 試した環境では省略しても動作しました
pipe = StableDiffusionPipeline.from_pretrained("KBlueLeaf/kohaku-v2.1",cache_dir = "/content/gdrive/MyDrive/diffusers/kohaku/").to(
    device=torch.device("cuda"),
    dtype=torch.float16,
)

# Wrap the pipeline in StreamDiffusion
# Requires more long steps (len(t_index_list)) in text2image
# You should use cfg_type="none" when text2image
stream = StreamDiffusion(
    pipe,
    t_index_list=[0, 16, 32, 45],
    torch_dtype=torch.float16,
    cfg_type="none",
)

# If the loaded model is not LCM, merge LCM
stream.load_lcm_lora()
stream.fuse_lora()
# Use Tiny VAE for further acceleration
stream.vae = AutoencoderTiny.from_pretrained("madebyollin/taesd").to(device=pipe.device, dtype=pipe.dtype)

# Enable acceleration
pipe.enable_xformers_memory_efficient_attention()
#prompt = "1girl with dog hair, thick frame glasses" # @param {type:"string"}
prompt = "boy" # @param {type:"string"}

# ファイルが存在しない場合は新しく作成されます
with open("prompt.txt", "w") as file:
    # 文字列をファイルに書き込む
    file.write(prompt)
    file.close()
# Prepare the stream
stream.prepare(prompt)

# Warmup >= len(t_index_list) x frame_buffer_size
for i in range(4):
    stream()

# Run the stream infinitely
fig = plt.figure(figsize=(5, 5))
display_handle = display(fig, display_id=True)
shinprompt=prompt
for i in range(30):
    with open('prompt.txt', 'r') as file:
      prompt2 = file.read()
    # ストリームの実行
    if shinprompt != prompt2:
      stream.update_prompt(prompt2)
    x_outputlist = stream.txt2img()
    pics = postprocess_image(x_outputlist, output_type="np")
    for count, pic in enumerate(pics):
      #arrPIL = np.asarray(pic)
      #output_image.save(f"/content/sdoutput/{i:02}.png")
      plt.imshow(pic)
      display_handle.update(fig)
      plt.clf()
    shinprompt=prompt2
    time.sleep(2.0)

サンプルを適当にいじって実行
画像が保存されるのがなんとなくいやだからmatlab使って表示するだけに

で、実行してみた結果だけど流石にはやい。どれが効いているのかは浦島すぎるけど、確か1つの画像に4秒から10秒くらいかかってたのが、一瞬で出る。すごい。

で、colab使ってると制限かかったからローカル環境でも試してみる。
ReedMeに従ってanacondaとvenv使った上で環境作成して後は同じ。VS Codeにjupytor Notebook入れてるからコードもそのまま
30秒で1枚だったのがsleep入れないと流れるのが速すぎるくらいだから速い

ただ、自分の弱点としてこれといって表現したいものは無いから、適当に遊ぶ以上のことが特にできない。
なんかないものか


そういえばローカルの環境書いてないな
メモリ16GBでグラボはGTX1080
VRやるために強いグラボ買ったおかげでまあ楽しめてる
次の買い替えがなあ


この記事が気に入ったらサポートをしてみませんか?