
Inferência de difusão e fluxo estáveis em C/C ++ puro
Implementação simples de C/C ++ com base no GGML, trabalhando da mesma maneira que llama.cpp
Super leve e sem dependências externas
SD1.X, SD2.X, SDXL e SD3/SD3.5 Suporte
Suporte de fluxo-dev/flux-schnell
Suporte SD-Turbo e SDXL-Turbo
Suporte de fabricante de fotoma.
Suporte de flutuação de 16 bits e 32 bits
Suporte de quantização inteira inteiro inteiro de 2 bits, 3 bits, 4 bits, 5 bits, 5 bits
Inferência de CPU acelerada com eficiência de memória
Suporte AVX, AVX2 e AVX512 para arquiteturas x86
Full CUDA, Metal, Vulkan e Sycl Backend para aceleração da GPU.
Pode carregar modelos/pontos de verificação CKPT, Safetetens e difusores. Modelos Vaes independentes
.ggml ou .gguf mais!Flash atenção para otimização de uso da memória
Modo txt2img e img2img original
Prompt negativo
Tokenizador de estilo de difusão-difusão estável (nem todos os recursos, apenas ponderação de token por enquanto)
Suporte de Lora, o mesmo que a difusão estável-webui
Suporte aos modelos de consistência latente (LCM/LCM-LORA)
Decodificação latente mais rápida e com eficiência de memória
Imagens de luxo geradas com Esrgan
Vae Processamento de ladrilhos para reduzir o uso da memória
Suporte líquido de controle com SD 1.5
Método de amostragem
Euler AEulerHeunDPM2DPM++ 2MDPM++ 2M v2DPM++ 2S aLCM Reprodutibilidade de plataforma cruzada ( --rng cuda , consistente com o stable-diffusion-webui GPU RNG )
Parâmetros de geração de incorporação na saída PNG como string de texto compatível com Webui
Plataformas suportadas
Para a maioria dos usuários, você pode baixar o programa executável construído a partir da versão mais recente. Se o produto construído não atender aos seus requisitos, você poderá construí -lo 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
Faça o download de pesos originais (.ckpt ou .Sesetensors). Por exemplo
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
Isso fornece aceleração blas usando os núcleos CUDA da sua GPU da NVIDIA. Certifique -se de instalar o kit de ferramentas CUDA. Você pode baixá-lo no seu gerenciador de pacotes do seu Linux Distro (por apt install nvidia-cuda-toolkit ) ou daqui: kit de ferramentas CUDA. Recomendado ter pelo menos 4 GB de VRAM.
cmake .. -DSD_CUBLAS=ON
cmake --build . --config Release
Isso fornece aceleração blas usando os núcleos ROCM da sua GPU AMD. Certifique -se de instalar o ROCM Toolkit.
O usuário do Windows consulte o docs/hipblas_on_windows.md para um guia abrangente.
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
O uso do metal faz com que a computação seja executada na GPU. Atualmente, existem alguns problemas com o Metal ao executar operações em matrizes muito grandes, tornando -o altamente ineficiente no momento. As melhorias de desempenho são esperadas em um futuro próximo.
cmake .. -DSD_METAL=ON
cmake --build . --config Release
Instale o vulkan sdk em https://www.lunarg.com/vulkan-sdk/.
cmake .. -DSD_VULKAN=ON
cmake --build . --config Release
O uso do SYCL faz com que o cálculo seja executado na GPU Intel. Certifique -se de instalar o driver relacionado e o Intel® OneApi Base Toolkit antes do início. Mais detalhes e etapas podem se referir ao back -end da LLAMA.CPP SYCL.
# 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
Exemplo de text2img usando o back -end do SYCL:
Faça o download do peso do modelo stable-diffusion , consulte o peso do download.
run ./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"

Permitir a atenção do flash para o modelo de difusão reduz o uso da memória por quantidades variadas de MB. por exemplo:
Para a maioria dos back -ends, diminui as coisas, mas para Cuda geralmente acelera também. No momento, ele é suportado apenas para alguns modelos e alguns back -end (como CPU, CUDA/ROCM, Metal).
Acrescentando --diffusion-fa aos argumentos e observe:
[INFO ] stable-diffusion.cpp:312 - Using flash attention in the diffusion model
e o buffer de computação encolher no log de depuração:
[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 -vO uso de formatos de diferentes precisões produzirá resultados de qualidade variável.
| F32 | F16 | Q8_0 | Q5_0 | Q5_1 | Q4_0 | Q4_1 |
|---|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
./output.png é a imagem gerada a partir do pipeline txt2img acima ./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

Esses projetos envolvem stable-diffusion.cpp para facilitar o uso em outros idiomas/estruturas.
Esses projetos usam stable-diffusion.cpp como um back-end para sua geração de imagens.
Obrigado a todas as pessoas que já contribuíram para o stable-difusão.cpp!