
Inferencia de difusión estable y flujo en C/C ++ puro
Implementación simple de C/C ++ basada en GGML, trabajando de la misma manera que Llama.cpp
Súper liviano y sin dependencias externas
Soporte de SD1.X, SD2.X, SDXL y SD3/SD3.5
Soporte de Flux-Dev/Flux-Schnell
Soporte SD-TURBO y SDXL-TURBO
Soporte de fotomatos.
Soporte flotante de 16 bits y 32 bits
Soporte de cuantificación entera de 2 bits, 3 bits, 4 bits, 5 bits y 8 bits
Inferencia acelerada de CPU eficiente en la memoria
Soporte AVX, AVX2 y AVX512 para arquitecturas X86
Backend completo de Cuda, Metal, Vulkan y Sycl para la aceleración de GPU.
Puede cargar CKPT, modelos/puntos de control de seguros y difusores. Modelos VAES independientes
.ggml o .gguf !Atención para flashear para la optimización del uso de la memoria
Modo original txt2img e img2img
Indicador negativo
Tokenizer de estilo estable-difusión-webui (no todas las características, solo ponderación de tokens por ahora)
Soporte de Lora, igual que la difusión estable-webui
Soporte de modelos de consistencia latente (LCM/LCM-Lora)
Decodificación latente más rápida y eficiente con memoria con TAESD
Imágenes exclusivas generadas con Esrgan
Procesamiento de mosaicos de VAE para reducir el uso de la memoria
Soporte de red de control con SD 1.5
Método de muestreo
Euler AEulerHeunDPM2DPM++ 2MDPM++ 2M v2DPM++ 2S aLCM Reproducibilidad multiplataforma ( --rng cuda , consistente con el stable-diffusion-webui GPU RNG )
Parámetros de generación de incrustaciones en la salida PNG como cadena de texto compatible con WebUI
Plataformas compatibles
Para la mayoría de los usuarios, puede descargar el programa ejecutable creado desde la última versión. Si el producto construido no cumple con sus requisitos, puede optar por construirlo manualmente.
git clone --recursive https://github.com/leejet/stable-diffusion.cpp
cd stable-diffusion.cpp
cd stable-diffusion.cpp
git pull origin master
git submodule init
git submodule update
Descargue pesas originales (.ckpt o .safetensors). Por ejemplo
curl -L -O https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt
# curl -L -O https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
# curl -L -O https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-nonema-pruned.safetensors
# curl -L -O https://huggingface.co/stabilityai/stable-diffusion-3-medium/resolve/main/sd3_medium_incl_clips_t5xxlfp16.safetensorsmkdir build
cd build
cmake ..
cmake --build . --config Release cmake .. -DGGML_OPENBLAS=ON
cmake --build . --config Release
Esto proporciona aceleración BLAS utilizando los núcleos CUDA de su GPU NVIDIA. Asegúrese de instalar el kit de herramientas CUDA. Puede descargarlo desde su Administrador de paquetes de Linux Distro (por apt install nvidia-cuda-toolkit ) o desde aquí: CUDA Toolkit. Recomendado tener al menos 4 GB de VRAM.
cmake .. -DSD_CUBLAS=ON
cmake --build . --config Release
Esto proporciona aceleración BLAS utilizando los núcleos ROCM de su GPU AMD. Asegúrese de instalar el kit de herramientas ROCM.
El usuario de Windows se refiere a Docs/Hipblas_on_windows.md para una guía completa.
cmake .. -G "Ninja" -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DSD_HIPBLAS=ON -DCMAKE_BUILD_TYPE=Release -DAMDGPU_TARGETS=gfx1100
cmake --build . --config Release
El uso de metal hace que el cálculo se ejecute en la GPU. Actualmente, hay algunos problemas con el metal al realizar operaciones en matrices muy grandes, lo que lo hace muy ineficiente en este momento. Se esperan mejoras de rendimiento en el futuro cercano.
cmake .. -DSD_METAL=ON
cmake --build . --config Release
Instale Vulkan SDK desde https://www.lunarg.com/vulkan-sdk/.
cmake .. -DSD_VULKAN=ON
cmake --build . --config Release
El uso de SYCL hace que el cálculo se ejecute en la GPU Intel. Asegúrese de haber instalado el controlador relacionado y el kit de herramientas base Intel® Onapi antes del inicio. Más detalles y pasos pueden referirse a Llama.cpp Sycl Backend.
# Export relevant ENV variables
source /opt/intel/oneapi/setvars.sh
# Option 1: Use FP32 (recommended for better performance in most cases)
cmake .. -DSD_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx
# Option 2: Use FP16
cmake .. -DSD_SYCL=ON -DCMAKE_C_COMPILER=icx -DCMAKE_CXX_COMPILER=icpx -DGGML_SYCL_F16=ON
cmake --build . --config Release
Ejemplo de Text2Img usando Sycl Backend:
Descargue el peso del modelo stable-diffusion , consulte Download-Weight.
ejecutado ./bin/sd -m ../models/sd3_medium_incl_clips_t5xxlfp16.safetensors --cfg-scale 5 --steps 30 --sampling-method euler -H 1024 -W 1024 --seed 42 -p "fantasy medieval village world inside a glass sphere , high detail, fantasy, realistic, light effect, hyper detail, volumetric lighting, cinematic, macro, depth of field, blur, red light and clouds from the back, highly detailed epic cinematic concept art cg render made in maya, blender and photoshop, octane render, excellent composition, dynamic dramatic cinematic lighting, aesthetic, very inspirational, world inside a glass sphere by james gurney by artgerm with james jean, joe fenton and tristan eaton by ross tran, fine details, 4k resolution"

Habilitar la atención de flash para el modelo de difusión reduce el uso de la memoria mediante cantidades variables de MB. p.ej.:
Para la mayoría de los backends, ralentiza las cosas, pero para CUDA generalmente también lo acelera. Por el momento, solo es compatible con algunos modelos y algunos backends (como CPU, CUDA/ROCM, Metal).
Ejecute agregando --diffusion-fa a los argumentos y observar:
[INFO ] stable-diffusion.cpp:312 - Using flash attention in the diffusion model
y el búfer de cómputo se encoge en el registro de depuración:
[DEBUG] ggml_extend.hpp:1004 - flux compute buffer size: 650.00 MB(VRAM)
usage: ./bin/sd [arguments]
arguments:
-h, --help show this help message and exit
-M, --mode [MODEL] run mode (txt2img or img2img or convert, default: txt2img)
-t, --threads N number of threads to use during computation (default: -1)
If threads <= 0, then threads will be set to the number of CPU physical cores
-m, --model [MODEL] path to full model
--diffusion-model path to the standalone diffusion model
--clip_l path to the clip-l text encoder
--clip_g path to the clip-l text encoder
--t5xxl path to the the t5xxl text encoder
--vae [VAE] path to vae
--taesd [TAESD_PATH] path to taesd. Using Tiny AutoEncoder for fast decoding (low quality)
--control-net [CONTROL_PATH] path to control net model
--embd-dir [EMBEDDING_PATH] path to embeddings
--stacked-id-embd-dir [DIR] path to PHOTOMAKER stacked id embeddings
--input-id-images-dir [DIR] path to PHOTOMAKER input id images dir
--normalize-input normalize PHOTOMAKER input id images
--upscale-model [ESRGAN_PATH] path to esrgan model. Upscale images after generate, just RealESRGAN_x4plus_anime_6B supported by now
--upscale-repeats Run the ESRGAN upscaler this many times (default 1)
--type [TYPE] weight type (f32, f16, q4_0, q4_1, q5_0, q5_1, q8_0, q2_k, q3_k, q4_k)
If not specified, the default is the type of the weight file
--lora-model-dir [DIR] lora model directory
-i, --init-img [IMAGE] path to the input image, required by img2img
--control-image [IMAGE] path to image condition, control net
-o, --output OUTPUT path to write result image to (default: ./output.png)
-p, --prompt [PROMPT] the prompt to render
-n, --negative-prompt PROMPT the negative prompt (default: "")
--cfg-scale SCALE unconditional guidance scale: (default: 7.0)
--strength STRENGTH strength for noising/unnoising (default: 0.75)
--style-ratio STYLE-RATIO strength for keeping input identity (default: 20%)
--control-strength STRENGTH strength to apply Control Net (default: 0.9)
1.0 corresponds to full destruction of information in init image
-H, --height H image height, in pixel space (default: 512)
-W, --width W image width, in pixel space (default: 512)
--sampling-method {euler, euler_a, heun, dpm2, dpm++2s_a, dpm++2m, dpm++2mv2, ipndm, ipndm_v, lcm}
sampling method (default: "euler_a")
--steps STEPS number of sample steps (default: 20)
--rng {std_default, cuda} RNG (default: cuda)
-s SEED, --seed SEED RNG seed (default: 42, use random seed for < 0)
-b, --batch-count COUNT number of images to generate
--schedule {discrete, karras, exponential, ays, gits} Denoiser sigma schedule (default: discrete)
--clip-skip N ignore last layers of CLIP network; 1 ignores none, 2 ignores one layer (default: -1)
<= 0 represents unspecified, will be 1 for SD1.x, 2 for SD2.x
--vae-tiling process vae in tiles to reduce memory usage
--vae-on-cpu keep vae in cpu (for low vram)
--clip-on-cpu keep clip in cpu (for low vram)
--diffusion-fa use flash attention in the diffusion model (for low vram)
Might lower quality, since it implies converting k and v to f16.
This might crash if it is not supported by the backend.
--control-net-cpu keep controlnet in cpu (for low vram)
--canny apply canny preprocessor (edge detection)
--color Colors the logging tags according to level
-v, --verbose print extra info
./bin/sd -m ../models/sd-v1-4.ckpt -p " a lovely cat "
# ./bin/sd -m ../models/v1-5-pruned-emaonly.safetensors -p "a lovely cat"
# ./bin/sd -m ../models/sd_xl_base_1.0.safetensors --vae ../models/sdxl_vae-fp16-fix.safetensors -H 1024 -W 1024 -p "a lovely cat" -v
# ./bin/sd -m ../models/sd3_medium_incl_clips_t5xxlfp16.safetensors -H 1024 -W 1024 -p 'a lovely cat holding a sign says "Stable Diffusion CPP"' --cfg-scale 4.5 --sampling-method euler -v
# ./bin/sd --diffusion-model ../models/flux1-dev-q3_k.gguf --vae ../models/ae.sft --clip_l ../models/clip_l.safetensors --t5xxl ../models/t5xxl_fp16.safetensors -p "a lovely cat holding a sign says 'flux.cpp'" --cfg-scale 1.0 --sampling-method euler -v
# ./bin/sd -m ..modelssd3.5_large.safetensors --clip_l ..modelsclip_l.safetensors --clip_g ..modelsclip_g.safetensors --t5xxl ..modelst5xxl_fp16.safetensors -H 1024 -W 1024 -p 'a lovely cat holding a sign says "Stable diffusion 3.5 Large"' --cfg-scale 4.5 --sampling-method euler -vEl uso de formatos de diferentes precisiones producirá resultados de calidad variable.
| F32 | f16 | Q8_0 | Q5_0 | Q5_1 | Q4_0 | Q4_1 |
|---|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
./output.png es la imagen generada en la tubería TXT2IMG de arriba ./bin/sd --mode img2img -m ../models/sd-v1-4.ckpt -p "cat with blue eyes" -i ./output.png -o ./img2img_output.png --strength 0.4

Estos proyectos envuelven stable-diffusion.cpp para más fácil usar en otros idiomas/marcos.
Estos proyectos utilizan stable-diffusion.cpp como backend para su generación de imágenes.
¡Gracias a todas las personas que ya han contribuido a Stable-Diffusion.cpp!