Views
No views yet
diffusers, transformers, and Intel's optimum-intel libraries.1pip install "optimum-intel[openvino,diffusers]>=1.27.0" \
2 "openvino>=2025.2.0" \
3 "diffusers>=0.31.0" \
4 "transformers>=4.45.0" \
5 "accelerate" \
6 "nncf"1import os
2import gc
3import shutil
4import torch
5from huggingface_hub import hf_hub_download
6from safetensors.torch import load_file
7from diffusers import StableDiffusionXLPipeline, UNet2DConditionModel, EulerDiscreteScheduler
8from optimum.intel import OVStableDiffusionXLPipeline
9
10base = "cagliostrolab/animagine-xl-4.0"
11repo = "ByteDance/SDXL-Lightning"
12ckpt = "sdxl_lightning_4step_unet.safetensors"
13ov_output_dir = "./animagine_sdxl_lightning_ov"
14
15# 1. Load Lightning UNet
16unet = UNet2DConditionModel.from_config(base, subfolder="unet")
17unet.load_state_dict(load_file(hf_hub_download(repo, ckpt), device="cpu"), strict=True)
18
19# 2. Assemble PyTorch Pipeline
20pipe = StableDiffusionXLPipeline.from_pretrained(
21 base, unet=unet, torch_dtype=torch.float32, use_safetensors=True
22)
23pipe.scheduler = EulerDiscreteScheduler.from_config(
24 pipe.scheduler.config, timestep_spacing="trailing",
25 beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear"
26)
27
28# Save temporary PyTorch model
29tmp_pt_dir = "./tmp_pt"
30pipe.save_pretrained(tmp_pt_dir, safe_serialization=True)
31del unet, pipe; gc.collect()
32
33# 3. Convert to OpenVINO IR (INT8 for CPU RAM optimization)
34ov_pipe = OVStableDiffusionXLPipeline.from_pretrained(
35 tmp_pt_dir,
36 export=True,
37 compile=False,
38 weight_format="int8", # Recommended for Intel CPU to save RAM and speed up inference
39 ov_config={
40 "PERFORMANCE_HINT": "LATENCY",
41 "NUM_STREAMS": "1",
42 "INFERENCE_NUM_THREADS": "4",
43 "DYNAMIC_QUANTIZATION_GROUP_SIZE": "32"
44 }
45)
46
47# 4. Save OpenVINO model
48ov_pipe.save_pretrained(ov_output_dir)
49shutil.rmtree(tmp_pt_dir)
50print("Export completed successfully!")
511import os
2import torch
3from optimum.intel import OVStableDiffusionXLPipeline
4from diffusers import EulerDiscreteScheduler
5
6# Optimize OpenMP for Intel CPU
7os.environ["OMP_WAIT_POLICY"] = "PASSIVE"
8os.environ["KMP_BLOCKTIME"] = "0"
9
10model_dir = "./animagine_sdxl_lightning_ov"
11
12# 1. Load OpenVINO model
13ov_pipe = OVStableDiffusionXLPipeline.from_pretrained(
14 model_dir,
15 device="CPU",
16 ov_config={
17 "PERFORMANCE_HINT": "LATENCY",
18 "NUM_STREAMS": "1",
19 "INFERENCE_NUM_THREADS": "4",
20 "DYNAMIC_QUANTIZATION_GROUP_SIZE": "32"
21 }
22)
23
24# 2. Set Scheduler (Required for SDXL-Lightning)
25ov_pipe.scheduler = EulerDiscreteScheduler.from_config(
26 ov_pipe.scheduler.config,
27 timestep_spacing="trailing",
28 beta_start=0.00085, beta_end=0.012, beta_schedule="scaled_linear"
29)
30
31# 3. Run inference
32prompt = "1girl, smiling, looking at viewer, anime style, high quality, masterpiece"
33negative_prompt = "lowres, bad anatomy, bad hands, text, error, worst quality, low quality"
34
35image = ov_pipe(
36 prompt=prompt,
37 negative_prompt=negative_prompt,
38 num_inference_steps=4, # Lightning model requires 4 steps
39 guidance_scale=0.0, # Lightning model recommends guidance_scale=0
40 width=1024,
41 height=1024,
42 generator=torch.Generator("cpu").manual_seed(42)
43).images[0]
44
45image.save("output_openvino.png")
46print("Image saved to output_openvino.png")
47