|
from typing import Any |
|
from diffusers import DiffusionPipeline |
|
from os import path |
|
import torch |
|
from backend.models.lcmdiffusion_setting import LCMDiffusionSetting |
|
import numpy as np |
|
from constants import DEVICE |
|
|
|
|
|
if DEVICE == "cpu": |
|
from backend.lcmdiffusion.pipelines.openvino.lcm_ov_pipeline import ( |
|
OVLatentConsistencyModelPipeline, |
|
) |
|
from backend.lcmdiffusion.pipelines.openvino.lcm_scheduler import ( |
|
LCMScheduler, |
|
) |
|
|
|
|
|
class LCMTextToImage: |
|
def __init__( |
|
self, |
|
device: str = "cpu", |
|
) -> None: |
|
self.pipeline = None |
|
self.use_openvino = False |
|
self.device = None |
|
self.previous_model_id = None |
|
|
|
def _get_lcm_diffusion_pipeline_path(self) -> str: |
|
script_path = path.dirname(path.abspath(__file__)) |
|
file_path = path.join( |
|
script_path, |
|
"lcmdiffusion", |
|
"pipelines", |
|
"latent_consistency_txt2img.py", |
|
) |
|
return file_path |
|
|
|
def init( |
|
self, |
|
model_id: str, |
|
use_openvino: bool = False, |
|
device: str = "cpu", |
|
use_local_model: bool = False, |
|
) -> None: |
|
self.device = device |
|
self.use_openvino = use_openvino |
|
if self.pipeline is None or self.previous_model_id != model_id: |
|
if self.use_openvino and DEVICE == "cpu": |
|
if self.pipeline: |
|
del self.pipeline |
|
scheduler = LCMScheduler.from_pretrained( |
|
model_id, |
|
subfolder="scheduler", |
|
) |
|
self.pipeline = OVLatentConsistencyModelPipeline.from_pretrained( |
|
model_id, |
|
scheduler=scheduler, |
|
compile=False, |
|
local_files_only=use_local_model, |
|
) |
|
else: |
|
if self.pipeline: |
|
del self.pipeline |
|
|
|
self.pipeline = DiffusionPipeline.from_pretrained( |
|
model_id, |
|
custom_pipeline=self._get_lcm_diffusion_pipeline_path(), |
|
custom_revision="main", |
|
local_files_only=use_local_model, |
|
) |
|
self.pipeline.to( |
|
torch_device=self.device, |
|
torch_dtype=torch.float32, |
|
) |
|
self.previous_model_id = model_id |
|
|
|
def generate( |
|
self, |
|
lcm_diffusion_setting: LCMDiffusionSetting, |
|
reshape: bool = False, |
|
) -> Any: |
|
if lcm_diffusion_setting.use_seed: |
|
cur_seed = lcm_diffusion_setting.seed |
|
if self.use_openvino: |
|
np.random.seed(cur_seed) |
|
else: |
|
torch.manual_seed(cur_seed) |
|
|
|
if self.use_openvino and DEVICE == "cpu": |
|
print("Using OpenVINO") |
|
if reshape: |
|
print("Reshape and compile") |
|
self.pipeline.reshape( |
|
batch_size=1, |
|
height=lcm_diffusion_setting.image_height, |
|
width=lcm_diffusion_setting.image_width, |
|
num_images_per_prompt=lcm_diffusion_setting.number_of_images, |
|
) |
|
self.pipeline.compile() |
|
|
|
if not lcm_diffusion_setting.use_safety_checker: |
|
self.pipeline.safety_checker = None |
|
|
|
result_images = self.pipeline( |
|
prompt=lcm_diffusion_setting.prompt, |
|
num_inference_steps=lcm_diffusion_setting.inference_steps, |
|
guidance_scale=lcm_diffusion_setting.guidance_scale, |
|
width=lcm_diffusion_setting.image_width, |
|
height=lcm_diffusion_setting.image_height, |
|
output_type="pil", |
|
num_images_per_prompt=lcm_diffusion_setting.number_of_images, |
|
).images |
|
|
|
return result_images |
|
|