import torch from PIL.Image import Image from diffusers import StableDiffusionXLPipeline from pipelines.models import TextToImageRequest from diffusers import DDIMScheduler from torch import Generator from loss import SchedulerWrapper from utils import register_parallel_pipeline_orig, register_faster_orig_forward, register_time from onediffx import compile_pipe, save_pipe, load_pipe import numpy as np def callback_dynamic_cfg(pipe, step_index, timestep, callback_kwargs): if step_index == int(pipe.num_timesteps * 0.78): callback_kwargs['prompt_embeds'] = callback_kwargs['prompt_embeds'].chunk(2)[-1] callback_kwargs['add_text_embeds'] = callback_kwargs['add_text_embeds'].chunk(2)[-1] callback_kwargs['add_time_ids'] = callback_kwargs['add_time_ids'].chunk(2)[-1] pipe._guidance_scale = 0.0 return callback_kwargs def load_pipeline(pipeline=None) -> StableDiffusionXLPipeline: if not pipeline: pipeline = StableDiffusionXLPipeline.from_pretrained( "stablediffusionapi/newdream-sdxl-20", torch_dtype=torch.float16, ).to("cuda") pipeline.scheduler = SchedulerWrapper(DDIMScheduler.from_config(pipeline.scheduler.config)) register_parallel_pipeline_orig(pipeline) register_faster_orig_forward(pipeline.unet) register_time(pipeline.unet, 0) pipeline = compile_pipe(pipeline) # load_pipe(pipeline, dir="/home/sandbox/.cache/huggingface/hub/models--RobertML--cached-pipe-02/snapshots/58d70deae87034cce351b780b48841f9746d4ad7") np.save('count_array.npy', [0]) for _ in range(1): deepcache_output = pipeline(prompt="telestereography, unstrengthen, preadministrator, copatroness, hyperpersonal, paramountness, paranoid, guaniferous", output_type="pil", num_inference_steps=20) pipeline.scheduler.prepare_loss() # for _ in range(2): # pipeline(prompt="telestereography, unstrengthen, preadministrator, copatroness, hyperpersonal, paramountness, paranoid, guaniferous", output_type="pil", num_inference_steps=20) return pipeline def infer(request: TextToImageRequest, pipeline: StableDiffusionXLPipeline) -> Image: global image_count if request.seed is None: generator = None else: generator = Generator(pipeline.device).manual_seed(request.seed) step = np.load('count_array.npy')[0] register_time(pipeline.unet, step) print("step is : ", step) step+=1; np.save('count_array.npy', [step]) # register_time(pipeline.unet, image_count) return pipeline( prompt=request.prompt, negative_prompt=request.negative_prompt, width=request.width, height=request.height, generator=generator, num_inference_steps=20, # cache_interval=1, # cache_layer_id=1, # cache_block_id=0, eta=1.0, guidance_scale = 5.0, guidance_rescale = 0.0, # callback_on_step_end=callback_dynamic_cfg, # callback_on_step_end_tensor_inputs=['prompt_embeds', 'add_text_embeds', 'add_time_ids'], ).images[0]