Usando Stable Diffusion en tu máquina
He visto mucho las maravillas del modelo Stable Diffusion, el modelo open source de texto a imagen, pero a pesar de todo ninguna me ha dado la claridad de cómo usarlo en mi máquina, así dejaré este articulo por acá para esa alma curiosa.
¿Qué es Stable Diffusion?
Sí, lo tengo que explicar, sé que ya llegaste sabiendo lo que quieres, pero ¿Por qué no?
Stable Diffusion es un modelo de aprendizaje automático desarrollado por Stability AI para generar imágenes digitales de alta calidad a partir de descripciones en lenguaje natural. El modelo se puede usar para diferentes tareas, como la generación de traducciones de imagen a imagen guiadas por mensajes de texto y la mejora de imágenes.
Requerimientos
Empecemos de lleno al asunto, primero hablaré de cómo usarlo en código, sin GUI, esto porque me gusta más escribir código y siendo sincero aún no he levantado la GUI en mi local.
El primer requerimiento es tener espacio, el modelo de Stable Diffusion es pesado, sobre ~5GB de espacio o quizás más.
El segundo es python
3.x y el comando de instalación de paquetes pip
, vamos a escribir un poco de código.
Lo último es internet, ojalá de buena velocidad, vas a descargar 5GB, ¿recuerdas?
Hugging Face 🤗
Usaremos la plataforma Hugging Face 🤗, el emoji al comienzo es tierno, pero luego de un rato empieza a perturbar, o quizás soy yo. Hugging Face 🤗 es una plataforma que contiene miles de modelos entrenados, así como datasets para entrenar modelos de Machine Learning que nos sirven para completar distintas tareas ML, además permite usarlos en la misma plataforma como también fuera de ella que es justamente lo que haremos:
- Lo primero es crearnos una cuenta en la plataforma, tranquilo, es GRATIS y no he recibido spam tampoco, es una plataforma linda 🤗, ¡Ay no! empiezo a usar el emoji.
- Una vez creada tu cuenta necesitas crear un API Token (https://huggingface.co/settings/tokens) y cópialo, lo usaremos luego.
- Nos queda un último paso que es aceptar los términos y condiciones para el uso del modelo Stable Diffusion
runwayml/stable-diffusion-v1–5
(https://huggingface.co/runwayml/stable-diffusion-v1-5)
Todo listo a escribir código.
Manos a la obra
Necesitamos descargar un paquete pip install diffusers
… en realidad es el único paquete a instalar. Emm… rellenaré; diffusers es una librería creada por Hugging Face 🤗 (huggingface/diffusers) que nos permite usar los modelos subidos a Hugging Face 🤗.
Una vez instalada ya es hora de escribir código, crearemos un archivo, el mío se llamará stable_diffusion.py
:
from diffuser import StableDiffusionPipelinetoken = "TU_TOKEN" # Acá va el token copiado desde Hugging Face
model_id = "runwayml/stable-diffusion-v1-5"pipe = StableDiffusionPipeline.from_pretrained(model_id, use_auth_token=token)
En esta primera parte del código hacemos el import
del pipeline para usar Stable Diffusion y en donde dice TU_TOKEN
debes pegar el API Token que copiaste ¿verdad?. Luego cargamos el modelo pre-entrenado con StableDiffusionPipeline.from_pretrained
.
Y si tenemos tarjeta de vídeo será mucho mejor para nuestro computador, sólo debemos usar dos líneas:
device = "cuda"
pipe = pipe.to(device)
Lo último ya es generar la imagen y guardar un archivo:
prompt = "a photograph of handsome guy writing a medium post, vibrant color"
image = pipe(prompt, num_inference_steps=25)["sample"][0]
image.save("imagen_generated.png")
Si corremos python3 stable_diffusion.py
notarás que ha empezado la descarga de los modelos, esto puede tardar dependiendo de tu internet, pero luego de eso empezará a mostrar el progreso.
Luego de un gran esfuerzo tendremos nuestro primer resultado:
Y efectivamente así se ven mis manos al escribir este post o quizás son muy pocos pasos (25), con 50 pasos debería salir algo mejor:
image = pipe(prompt, num_inference_steps=50)["sample"][0]
¡Maravilloso!
Puedes jugar bastante con pipe()
por ejemplo puedes usar la imagen anterior y mejorarla, cambiarla o lo que imagines.
Usando Pillow (pip install Pillow
) para cargar la imagen quedaría algo así:
from PIL import Image
# ...
img = Image.open("imagen_generated.png")
prompt = "a photograph of handsome guy with a hat writing on internet, vibrant color"
image = pipe(prompt, init_image=img, strength=0.1,
num_inference_steps=50)["sample"][0]
image.save("imagen_generated_next.png")
Ahora nuestro muchacho tiene un gorro y ya corregimos que esté frente a un computador.
Espero te diviertas generando imágenes divertidas o interesantes.
¡Ah! una última cosa, crear prompt no es una tarea sencilla, pero ya existe un repositorio de prompts y este es https://lexica.art/, busca un imagen que te guste y copia el prompt.
Acá hay más documentación del uso de pipelines Stable diffusion pipelines.
Y más información sobre diffusers de Hugging Face: Stable Diffusion with 🧨 Diffusers.