AiArtLab/sdxs-1b
AiArtLab
Texto a imagen
Simple Diffusion XS 1B es un modelo alfa de generación texto-a-imagen de AiArtLab, diseñado para ser compacto, rápido y entrenable con GPU de consumo. Usa una UNet personalizada de unos 1.600 millones de parámetros, un codificador de texto Qwen3.5 de unos 1.800 millones de parámetros y un VAE asimétrico de 32 canales con codificador 8x y decodificador 16x. Está optimizado para arte, ilustración y anime, con resolución por defecto de 1024x1408 y entrenamiento en rangos de 768 a 1408 píxeles.
Como usar
Instalación y uso básico con Diffusers:
pip install -U diffusers transformers accelerate
import torch
from diffusers import DiffusionPipeline
# usar "mps" para dispositivos Apple
pipe = DiffusionPipeline.from_pretrained(
"AiArtLab/sdxs-1b",
dtype=torch.bfloat16,
device_map="cuda"
)
prompt = "sdxs-1b"
image = pipe(prompt).images[0]
Ejemplo de texto a imagen:
#!pip install -U torch torchvision
#!pip install -U diffusers accelerate transformers
import torch
from diffusers import DiffusionPipeline
device = "cuda" if torch.cuda.is_available() else "cpu"
dtype = torch.float16 if torch.cuda.is_available() else torch.float32
pipe_id = "AiArtLab/sdxs-1b"
pipe = DiffusionPipeline.from_pretrained(
pipe_id,
torch_dtype=dtype,
trust_remote_code=True
).to(device)
prompt = "1girl, smiling, red eyes, blue hair, white shirt"
refined = pipe.refine_prompts(prompt)[0]
negative_prompt = "bad quality grainy image with low details, incomplete text, despite numerous technical flaws and distorted figures"
image = pipe(
prompt=refined,
negative_prompt=negative_prompt,
width=1024,
height=1408,
guidance_scale=5,
seed=0,
).images[0]
image.show()
Escalado de imagen con el VAE integrado:
upscaled = pipe.image_upscale("media/girl.jpg")
upscaled[0].show()
Ejemplo independiente de uso del VAE para upscale 2x:
import torch
import numpy as np
from diffusers import AsymmetricAutoencoderKL
from typing import List, Union
from PIL import Image
vae = AsymmetricAutoencoderKL.from_pretrained(
"AiArtLab/sdxs-1b",
subfolder="vae"
).cuda().half()
device = "cuda"
@torch.no_grad()
def image_upscale(
image: Union[str, Image.Image, List[Union[str, Image.Image]]],
batch_size: int = 1
) -> List[Image.Image]:
images = [image] if isinstance(image, (str, Image.Image)) else image
batch_data = []
for img in images:
if isinstance(img, str):
img = Image.open(img)
if img.mode == "RGBA":
img = Image.alpha_composite(Image.new("RGBA", img.size, (255, 255, 255)), img)
img = img.convert("RGB")
w, h = img.size
pw, ph = (8 - w % 8) % 8, (8 - h % 8) % 8
if pw or ph:
padded = Image.new("RGB", (w + pw, h + ph), (255, 255, 255))
padded.paste(img)
img = padded
t = torch.from_numpy(np.array(img).astype(np.float32) / 127.5 - 1.0).permute(2, 0, 1)
batch_data.append((t.to(device, torch.float16), w, h))
unique_shapes = {t.shape for t, _, _ in batch_data}
step = batch_size if len(unique_shapes) == 1 else 1
output_images = []
for i in range(0, len(batch_data), step):
chunk = batch_data[i : i + step]
tensors = torch.stack([c[0] for c in chunk])
latents = vae.encode(tensors).latent_dist.mean
decoded = vae.decode(latents.to(vae.dtype))[0]
decoded = (decoded.clamp(-1, 1) + 1) / 2
for j, tensor in enumerate(decoded):
w, h = chunk[j][1], chunk[j][2]
arr = tensor.cpu().permute(1, 2, 0).float().numpy()
arr = arr[:h * 2, :w * 2]
output_images.append(Image.fromarray((arr * 255).astype("uint8")))
return output_images
up = image_upscale("1.jpg")
up[0].show()
Funcionalidades
- Generación texto-a-imagen mediante Diffusers.
- UNet tipo Stable Diffusion 1.5, aproximadamente 2x el tamaño de SD1.5, con más canales finales para mejorar detalles.
- Codificador de texto Qwen3.5-2B con hasta 250 tokens y mecanismo opcional de refinamiento de prompts.
- VAE asimétrico integrado con escalado 2x true-to-source, pensado para preservar estilo y detalles sin inventar contenido nuevo.
- Modelo enfocado en arte, ilustración y anime; incluye una pequeña proporción de fotografía, recomendando usar "photo" en el prompt negativo si se desea evitar ese estilo.
- Entrenado con datasets relativamente pequeños, alrededor de 1 a 2 millones de ejemplos, lo que limita la cobertura de conceptos.
- Licencia modified-mit y pesos en formato Safetensors.
Casos de uso
- Crear imágenes artísticas, ilustraciones y contenido de estilo anime a partir de prompts de texto.
- Probar una arquitectura de difusión compacta orientada a entrenamiento con GPU de consumo.
- Refinar prompts automáticamente con el codificador de texto integrado.
- Escalar imágenes 2x con el VAE asimétrico preservando el estilo y los detalles originales.
- Experimentar con pipelines Diffusers personalizados y entrenamiento open-source de modelos de difusión.