mirror of
https://github.com/leejet/stable-diffusion.cpp.git
synced 2026-02-04 10:53:34 +00:00
138 lines
5.4 KiB
Markdown
138 lines
5.4 KiB
Markdown
# Running distilled models: SSD1B, Vega and SDx.x with tiny U-Nets
|
|
|
|
## Preface
|
|
|
|
These models feature a reduced U-Net architecture. Unlike standard SDXL models, the SSD-1B and Vega U-Net contains only one middle block and fewer attention layers in its up- and down-blocks, resulting in significantly smaller file sizes. Using these models can reduce inference time by more than 33%. For more details, refer to Segmind's paper: https://arxiv.org/abs/2401.02677v1.
|
|
Similarly, SD1.x- and SD2.x-style models with a tiny U-Net consist of only 6 U-Net blocks, leading to very small files and time savings of up to 50%. For more information, see the paper: https://arxiv.org/pdf/2305.15798.pdf.
|
|
|
|
## SSD1B
|
|
|
|
Note that not all of these models follow the standard parameter naming conventions. However, several useful SSD-1B models are available online, such as:
|
|
|
|
* https://huggingface.co/segmind/SSD-1B/resolve/main/SSD-1B-A1111.safetensors
|
|
* https://huggingface.co/hassenhamdi/SSD-1B-fp8_e4m3fn/resolve/main/SSD-1B_fp8_e4m3fn.safetensors
|
|
|
|
Useful LoRAs are also available:
|
|
|
|
* https://huggingface.co/seungminh/lora-swarovski-SSD-1B/resolve/main/pytorch_lora_weights.safetensors
|
|
* https://huggingface.co/kylielee505/mylcmlorassd/resolve/main/pytorch_lora_weights.safetensors
|
|
|
|
## Vega
|
|
|
|
Segmind's Vega model is available online here:
|
|
|
|
* https://huggingface.co/segmind/Segmind-Vega/resolve/main/segmind-vega.safetensors
|
|
|
|
VegaRT is an example for an LCM-LoRA:
|
|
|
|
* https://huggingface.co/segmind/Segmind-VegaRT/resolve/main/pytorch_lora_weights.safetensors
|
|
|
|
Both files can be used out-of-the-box, unlike the models described in next sections.
|
|
|
|
|
|
## SD1.x, SD2.x with tiny U-Nets
|
|
|
|
These models require conversion before use. You will need a Python script provided by the diffusers team, available on GitHub:
|
|
|
|
* https://raw.githubusercontent.com/huggingface/diffusers/refs/heads/main/scripts/convert_diffusers_to_original_stable_diffusion.py
|
|
|
|
### SD2.x
|
|
|
|
NotaAI provides the following model online:
|
|
|
|
* https://huggingface.co/nota-ai/bk-sdm-v2-tiny
|
|
|
|
Creating a .safetensors file involves two steps. First, run this short Python script to download the model from Hugging Face:
|
|
|
|
```python
|
|
from diffusers import StableDiffusionPipeline
|
|
pipe = StableDiffusionPipeline.from_pretrained("nota-ai/bk-sdm-v2-tiny",cache_dir="./")
|
|
```
|
|
|
|
Second, create the .safetensors file by running:
|
|
|
|
```bash
|
|
python convert_diffusers_to_original_stable_diffusion.py \
|
|
--model_path models--nota-ai--bk-sdm-v2-tiny/snapshots/68277af553777858cd47e133f92e4db47321bc74 \
|
|
--checkpoint_path bk-sdm-v2-tiny.safetensors --half --use_safetensors
|
|
```
|
|
|
|
This will generate the **file bk-sdm-v2-tiny.safetensors**, which is now ready for use with sd.cpp.
|
|
|
|
### SD1.x
|
|
|
|
Several Tiny SD 1.x models are available online, such as:
|
|
|
|
* https://huggingface.co/segmind/tiny-sd
|
|
* https://huggingface.co/segmind/portrait-finetuned
|
|
* https://huggingface.co/nota-ai/bk-sdm-tiny
|
|
|
|
These models also require conversion, partly because some tensors are stored in a non-contiguous manner. To create a usable checkpoint file, follow these simple steps:
|
|
Download and prepare the model using Python:
|
|
|
|
##### Download the model using Python on your computer, for example this way:
|
|
|
|
```python
|
|
import torch
|
|
from diffusers import StableDiffusionPipeline
|
|
pipe = StableDiffusionPipeline.from_pretrained("segmind/tiny-sd")
|
|
unet=pipe.unet
|
|
for param in unet.parameters():
|
|
param.data = param.data.contiguous() # <- important here
|
|
pipe.save_pretrained("segmindtiny-sd", safe_serialization=True)
|
|
```
|
|
|
|
##### Run the conversion script:
|
|
|
|
```bash
|
|
python convert_diffusers_to_original_stable_diffusion.py \
|
|
--model_path ./segmindtiny-sd \
|
|
--checkpoint_path ./segmind_tiny-sd.ckpt --half
|
|
```
|
|
|
|
The file segmind_tiny-sd.ckpt will be generated and is now ready for use with sd.cpp. You can follow a similar process for the other models mentioned above.
|
|
|
|
|
|
##### Another available .ckpt file:
|
|
|
|
* https://huggingface.co/ClashSAN/small-sd/resolve/main/tinySDdistilled.ckpt
|
|
|
|
To use this file, you must first adjust its non-contiguous tensors:
|
|
|
|
```python
|
|
import torch
|
|
ckpt = torch.load("tinySDdistilled.ckpt", map_location=torch.device('cpu'))
|
|
for key, value in ckpt['state_dict'].items():
|
|
if isinstance(value, torch.Tensor):
|
|
ckpt['state_dict'][key] = value.contiguous()
|
|
torch.save(ckpt, "tinySDdistilled_fixed.ckpt")
|
|
```
|
|
|
|
|
|
### SDXS-512
|
|
|
|
Another very tiny and **incredibly fast** model is SDXS by IDKiro et al. The authors refer to it as *"Real-Time One-Step Latent Diffusion Models with Image Conditions"*. For details read the paper: https://arxiv.org/pdf/2403.16627 . Once again the authors removed some more blocks of U-Net part and unlike other SD1 models they use an adjusted _AutoEncoderTiny_ instead of default _AutoEncoderKL_ for the VAE part.
|
|
|
|
##### 1. Download the diffusers model from Hugging Face using Python:
|
|
|
|
```python
|
|
from diffusers import StableDiffusionPipeline
|
|
pipe = StableDiffusionPipeline.from_pretrained("IDKiro/sdxs-512-dreamshaper")
|
|
pipe.save_pretrained(save_directory="sdxs")
|
|
```
|
|
##### 2. Create a safetensors file
|
|
|
|
```bash
|
|
python convert_diffusers_to_original_stable_diffusion.py \
|
|
--model_path sdxs --checkpoint_path sdxs.safetensors --half --use_safetensors
|
|
```
|
|
|
|
##### 3. Run the model as follows:
|
|
|
|
```bash
|
|
~/stable-diffusion.cpp/build/bin/sd-cli -m sdxs.safetensors -p "portrait of a lovely cat" \
|
|
--cfg-scale 1 --steps 1
|
|
```
|
|
|
|
Both options: ``` --cfg-scale 1 ``` and ``` --steps 1 ``` are mandatory here.
|