Views
No views yet
| Large (40 steps) | Turbo (4 steps) | Merged (6 steps) 🎉 |
|---|---|---|
![]() | ![]() | ![]() |
1from diffusers import StableDiffusion3Pipeline
2import torch
3
4pipeline = StableDiffusion3Pipeline.from_pretrained(
5 "ariG23498/sd-3.5-merged", torch_dtype=torch.bfloat16
6).to("cuda")
7
8prompt = "a tiny astronaut hatching from an egg on the moon"
9image = pipeline(
10 prompt=prompt,
11 guidance_scale=1.0,
12 num_inference_steps=6, # Run faster ⚡️
13 generator=torch.manual_seed(0),
14).images[0]
15image.save("sd-3.5-merged.png")Note: Turbo variant runs faster with fewer steps, while Large variant requires more steps (around 50) but provides better detail. With the merged model you would need to play withnum_inference_stepsandguidance_scaleto get the perfect balance of speed and quality. Below I show a grid of scale and step changes and its corresponding generations.

huggingface_cli login to let your system know
who you are and whether you have access to the models!1from diffusers import SD3Transformer2DModel
2from huggingface_hub import snapshot_download
3from accelerate import init_empty_weights
4from diffusers.models.model_loading_utils import load_model_dict_into_meta
5import safetensors.torch
6from huggingface_hub import upload_folder
7import glob
8import torch
9
10large_model_id = "stabilityai/stable-diffusion-3.5-large"
11turbo_model_id = "stabilityai/stable-diffusion-3.5-large-turbo"
12
13with init_empty_weights():
14 config = SD3Transformer2DModel.load_config(large_model_id, subfolder="transformer")
15 model = SD3Transformer2DModel.from_config(config)
16
17large_ckpt = snapshot_download(repo_id=large_model_id, allow_patterns="transformer/*")
18turbo_ckpt = snapshot_download(repo_id=turbo_model_id, allow_patterns="transformer/*")
19
20large_shards = sorted(glob.glob(f"{large_ckpt}/transformer/*.safetensors"))
21turbo_shards = sorted(glob.glob(f"{turbo_ckpt}/transformer/*.safetensors"))
22
23merged_state_dict = {}
24guidance_state_dict = {}
25
26for i in range(len((large_shards))):
27 state_dict_large_temp = safetensors.torch.load_file(large_shards[i])
28 state_dict_turbo_temp = safetensors.torch.load_file(turbo_shards[i])
29
30 keys = list(state_dict_large_temp.keys())
31 for k in keys:
32 if "guidance" not in k:
33 merged_state_dict[k] = (state_dict_large_temp.pop(k) + state_dict_turbo_temp.pop(k)) / 2
34 else:
35 guidance_state_dict[k] = state_dict_large_temp.pop(k)
36
37 if len(state_dict_large_temp) > 0:
38 raise ValueError(f"There should not be any residue but got: {list(state_dict_large_temp.keys())}.")
39 if len(state_dict_turbo_temp) > 0:
40 raise ValueError(f"There should not be any residue but got: {list(state_dict_turbo_temp.keys())}.")
41
42merged_state_dict.update(guidance_state_dict)
43load_model_dict_into_meta(model, merged_state_dict)
44
45model.to(torch.bfloat16).save_pretrained("transformer")
46
47upload_folder(
48 repo_id="ariG23498/sd-3.5-merged",
49 folder_path="transformer",
50 path_in_repo="transformer",
51)upload_folder.