👨‍🎨

WebUIではなく素のDiffusersでLora(safetensors)もLCMもやる

2023/12/15に公開

ざっくりこんな感じになります。V100で620msecで生成できます。

Setup

!pip install -U diffusers transformers scipy ftfy accelerate

LoRA modelのロード

今回はsafetensorsをダウンロードします。これはLoraとして指定すると数ステップで画像が生成できるようになります。

!wget  -O LCM-LoRA.safetensors "https://civitai.com/api/download/models/225222?type=Model&format=SafeTensor"

モデルをロードする

import torch
from diffusers import StableDiffusionPipeline
from diffusers import LCMScheduler

# Load the model
pipeline = StableDiffusionPipeline.from_pretrained(
    "SG161222/Realistic_Vision_V2.0",
    torch_dtype=torch.float16,
    )
pipeline = pipeline.to("cuda")

pipeline.load_lora_weights(".", weight_name="LCM-LoRA.safetensors")

以前はsafetensorsのままのLoraをロードするのは大変だったと思うのですが、今は1行でスッキリ書けます。

生成用の関数を定義

def generate(prompt, negative_prompt=None, lora_params=None):
    pipeline.scheduler = LCMScheduler.from_config(pipeline.scheduler.config)
    image = pipeline(
        prompt,
        negative_prompt=negative_prompt,
        lora_params=lora_params,
        guidance_scale=1,
        num_inference_steps=4,
        num_images_per_prompt=1,
        height=512,
        width=768,
    ).images[0]
    return image

スケジューラーにはLCMを指定しています。stepsも4にしてます。

画像生成する

promptを渡して生成してみましょう。

prompt = "8k, high quality, real photo, yellow taxi, full body"
ng_prompt = "lowres, bad anatomy, bad hands, text, error, missing fingers, extra digit, fewer digits, cropped, worst quality, low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry"
image = generate(prompt, ng_prompt)
image

わずか4stepsでそれなりの画像が生成されたことがわかります。

はっや!

以上です。

参考

https://huggingface.co/docs/diffusers/main/en/using-diffusers/lcm

Discussion