
Inférence de la diffusion et du flux stables en pur C / C ++
Implémentation simple C / C ++ basée sur GGML, travaillant de la même manière que Llama.cpp
Super léger et sans dépendances externes
SD1.X, SD2.X, SDXL et SD3 / SD3.5
Flux-DEV / Flux-Schnell Support
Prise en charge SD-Turbo et SDXL-Turbo
Support de photomaker.
Prise en charge du flotteur 16 bits et 32 bits
Support de quantification entier 2 bits, 3 bits, 4 bits, 5 bits et 8 bits
Inférence du processeur économe en mémoire accélérée
Prise en charge AVX, AVX2 et AVX512 pour les architectures x86
Backend CUDA, métal, vulkan et sycl complet pour l'accélération du GPU.
Peut charger le CKPT, les safettensers et les modèles / points de contrôle des diffuseurs. Modèles Vaes autonomes
.ggml ou .gguf !Attention au flash pour l'optimisation de l'utilisation de la mémoire
Mode txt2img et img2img
Invite négative
Tokenizer de style stable-diffusion-webui (pas toutes les fonctionnalités, seulement la pondération de jeton pour l'instant)
Support de Lora, identique à la diffusion stable-webui
Prise en charge des modèles de cohérence latente (LCM / LCM-LORA)
Décodage latent plus rapide et efficace de la mémoire avec Taesd
Images haut de gamme générées avec ESRGAN
Traitement de carrelage VAE pour réduire l'utilisation de la mémoire
Contrôler le support net avec SD 1.5
Méthode d'échantillonnage
Euler AEulerHeunDPM2DPM++ 2MDPM++ 2M v2DPM++ 2S aLCM Reproductibilité multiplateforme ( --rng cuda , cohérente avec le stable-diffusion-webui GPU RNG )
Embedds Generation Paramètres dans la sortie PNG en tant que chaîne de texte compatible avec webui
Plates-formes prises en charge
Pour la plupart des utilisateurs, vous pouvez télécharger le programme exécutable construit à partir de la dernière version. Si le produit construit ne répond pas à vos besoins, vous pouvez choisir de le construire manuellement.
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
Téléchargez des poids originaux (.ckpt ou .safetenseurs). Par exemple
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
Cela fournit une accélération BLAS en utilisant les noyaux CUDA de votre GPU NVIDIA. Assurez-vous d'installer la boîte à outils CUDA. Vous pouvez le télécharger à partir de votre gestionnaire de packages de votre Linux Distro (par apt install nvidia-cuda-toolkit ) ou d'ici: Cuda Toolkit. Recommandé d'avoir au moins 4 Go de VRAM.
cmake .. -DSD_CUBLAS=ON
cmake --build . --config Release
Cela fournit une accélération BLAS en utilisant les noyaux ROCM de votre GPU AMD. Assurez-vous d'installer la boîte à outils ROCM.
L'utilisateur de Windows se réfère à Docs / Hipblas_on_windows.md pour un guide complet.
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
L'utilisation du métal fait fonctionner le calcul sur le GPU. Actuellement, il y a des problèmes avec le métal lors de l'exécution d'opérations sur de très grandes matrices, ce qui le rend très inefficace pour le moment. Des améliorations des performances sont attendues dans un avenir proche.
cmake .. -DSD_METAL=ON
cmake --build . --config Release
Installez le SDK Vulkan à partir de https://www.lunarg.com/vulkan-sdk/.
cmake .. -DSD_VULKAN=ON
cmake --build . --config Release
L'utilisation de SYCL fait fonctionner le calcul sur le GPU Intel. Veuillez vous assurer que vous avez installé le pilote connexe et la boîte à outils de base Intel® ONEAPI avant de démarrer. Plus de détails et d'étapes peuvent se référer au backend SYCL LLAMA.CPP.
# 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
Exemple de text2img en utilisant le backend SYCL:
Téléchargez le poids du modèle stable-diffusion , reportez-vous au poids de téléchargement.
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"

L'activation du flash pour le modèle de diffusion réduit l'utilisation de la mémoire par différentes quantités de MB. par exemple:
Pour la plupart des backends, cela ralentit les choses, mais pour Cuda, il accélère généralement aussi. Pour le moment, il n'est pris en charge que pour certains modèles et certains backends (comme CPU, CUDA / ROCM, Metal).
Exécuté en ajoutant --diffusion-fa aux arguments et surveillez:
[INFO ] stable-diffusion.cpp:312 - Using flash attention in the diffusion model
Et le tampon de calcul rétrécit dans le journal de débogage:
[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 -vL'utilisation de formats de différentes précisions donnera des résultats de qualité variable.
| F32 | F16 | Q8_0 | Q5_0 | Q5_1 | Q4_0 | Q4_1 |
|---|---|---|---|---|---|---|
![]() | ![]() | ![]() | ![]() | ![]() | ![]() | ![]() |
./output.png est l'image générée à partir du pipeline TXT2IMG ci-dessus ./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

Ces projets enveloppent stable-diffusion.cpp pour une utilisation plus facile dans d'autres langues / frameworks.
Ces projets utilisent stable-diffusion.cpp comme backend pour leur génération d'images.
Merci à toutes les personnes qui ont déjà contribué à stable-diffusion.cpp!