Flash Difusión: FlashSDXL ⚡

jasperai
Texto a imagen

Flash Difusión es un método de destilación de difusión propuesto en el artículo Flash Difusión: Aceleración de cualquier modelo de difusión condicional para la generación de imágenes en pocos pasos por Clément Chadebec, Onur Tasar, Eyal Benaroche y Benjamin Aubin de Jasper Research. Este modelo es una versión destilada de LoRA de 108M del modelo SDXL que es capaz de generar imágenes en 4 pasos. El objetivo principal de este modelo es reproducir los resultados principales del artículo.

Como usar

El modelo se puede usar con la biblioteca DiffusionPipeline de diffusers directamente. Puede permitir reducir el número de pasos de muestreo requeridos a 4 pasos.

from diffusers import DiffusionPipeline, LCMScheduler

adapter_id = "jasperai/flash-sdxl"

pipe = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
use_safetensors=True,
)

pipe.scheduler = LCMScheduler.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
subfolder="scheduler",
timestep_spacing="trailing",
)
pipe.to("cuda")

# Fusionar y cargar pesos de LoRA
pipe.load_lora_weights(adapter_id)
pipe.fuse_lora()

prompt = "Un mapache leyendo un libro en un bosque frondoso."

image = pipe(prompt, num_inference_steps=4, guidance_scale=0).images[0]

Para usar FlashSDXL localmente usando ComfyUI necesitas:

1. Asegúrate de que tu instalación de ComfyUI esté actualizada.
2. Descarga el checkpoint de Hugging Face.
3. En caso de duda, ve a "Files and Version", entra a la carpeta comfy/ y presiona el botón de descarga junto a FlashSDXL.safetensors.
4. Mueve el nuevo archivo checkpoint a tu carpeta local comfyUI/models/loras/.
5. Úsalo como LoRA encima de sd_xl_base_1.0_0.9vae.safetensors, se proporciona un simple comfyui workflow.json en este repositorio (disponible en la misma carpeta comfy/).

FlashSDXL también puede combinarse con LoRAs existentes para desbloquear la generación en pocos pasos de manera libre de entrenamiento. Puede integrarse directamente a canalizaciones de Hugging Face. Véase un ejemplo a continuación.

from diffusers import DiffusionPipeline, LCMScheduler
import torch

user_lora_id = "TheLastBen/Papercut_SDXL"
trigger_word = "papercut"

flash_lora_id = "jasperai/flash-sdxl"

# Cargar pipeline
pipe = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
variant="fp16")

# Configurar scheduler
pipe.scheduler = LCMScheduler.from_config(
pipe.scheduler.config)

# Cargar LoRAs
pipe.load_lora_weights(flash_lora_id, adapter_name="flash")
pipe.load_lora_weights(user_lora_id, adapter_name="lora")

pipe.set_adapters(["flash", "lora"], adapter_weights=[1.0, 1.0])
pipe.to(device="cuda", dtype=torch.float16)

prompt = f"{trigger_word} un corgi adorable"

image = pipe(
prompt,
num_inference_steps=4,
guidance_scale=0
).images[0]

FlashSDXL también puede combinarse con ControlNets existentes para desbloquear la generación en pocos pasos de manera libre de entrenamiento. Puede integrarse directamente a canalizaciones de Hugging Face. Véase un ejemplo a continuación.

import torch
import cv2
import numpy as np
from PIL import Image

from diffusers import StableDiffusionXLControlNetPipeline, ControlNetModel, LCMScheduler
from diffusers.utils import load_image, make_image_grid

flash_lora_id = "jasperai/flash-sdxl"

image = load_image(
"https://hf.co/datasets/huggingface/documentation-images/resolve/main/diffusers/input_image_vermeer.png").resize((1024, 1024))

image = np.array(image)

image = cv2.Canny(image, 100, 200)
image = image[:, :, None].repeat(3, 2)
canny_image = Image.fromarray(image)

# Cargar ControlNet
controlnet = ControlNetModel.from_pretrained(
"diffusers/controlnet-canny-sdxl-1.0",
torch_dtype=torch.float16,
variant="fp16")
pipe = StableDiffusionXLControlNetPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
controlnet=controlnet,
torch_dtype=torch.float16,
safety_checker=None,
variant="fp16").to("cuda")

# Configurar scheduler
pipe.scheduler = LCMScheduler.from_config(pipe.scheduler.config)

# Cargar LoRA
pipe.load_lora_weights(flash_lora_id)
pipe.fuse_lora()

image = pipe(
"retrato de la mona lisa",
image=canny_image,
num_inference_steps=4,
guidance_scale=0,
controlnet_conditioning_scale=0.5,
cross_attention_kwargs={"scale": 1},
).images[0]
make_image_grid([canny_image, image], rows=1, cols=2)

Funcionalidades

Método de destilación de difusión
Generación de imágenes en pocos pasos
Versión LoRA destilada de 108M del modelo SDXL
Capacitado para generar imágenes en 4 pasos

Casos de uso

Generación rápida de imágenes
Combinación con LoRAs existentes
Combinación con ControlNets existentes
Reducción del número de pasos de muestreo necesarios