|
"""This is an experimental pipeline used to test AI PC NPU and GPU""" |
|
|
|
from pathlib import Path |
|
|
|
from diffusers import EulerDiscreteScheduler,LCMScheduler |
|
from huggingface_hub import snapshot_download |
|
from PIL import Image |
|
from backend.openvino.stable_diffusion_engine import ( |
|
StableDiffusionEngineAdvanced, |
|
LatentConsistencyEngineAdvanced |
|
) |
|
|
|
|
|
class OvHcStableDiffusion: |
|
"OpenVINO Heterogeneous compute Stablediffusion" |
|
|
|
def __init__( |
|
self, |
|
model_path, |
|
device: list = ["GPU", "NPU", "GPU", "GPU"], |
|
): |
|
model_dir = Path(snapshot_download(model_path)) |
|
self.scheduler = EulerDiscreteScheduler( |
|
beta_start=0.00085, |
|
beta_end=0.012, |
|
beta_schedule="scaled_linear", |
|
) |
|
self.ov_sd_pipleline = StableDiffusionEngineAdvanced( |
|
model=model_dir, |
|
device=device, |
|
) |
|
|
|
def generate( |
|
self, |
|
prompt: str, |
|
neg_prompt: str, |
|
init_image: Image = None, |
|
strength: float = 1.0, |
|
): |
|
image = self.ov_sd_pipleline( |
|
prompt=prompt, |
|
negative_prompt=neg_prompt, |
|
init_image=init_image, |
|
strength=strength, |
|
num_inference_steps=25, |
|
scheduler=self.scheduler, |
|
) |
|
image_rgb = image[..., ::-1] |
|
return Image.fromarray(image_rgb) |
|
|
|
|
|
class OvHcLatentConsistency: |
|
""" |
|
OpenVINO Heterogeneous compute Latent consistency models |
|
For the current Intel Cor Ultra, the Text Encoder and Unet can run on NPU |
|
Supports following - Text to image , Image to image and image variations |
|
""" |
|
|
|
def __init__( |
|
self, |
|
model_path, |
|
device: list = ["NPU", "NPU", "GPU"], |
|
): |
|
|
|
model_dir = Path(snapshot_download(model_path)) |
|
|
|
self.scheduler = LCMScheduler( |
|
beta_start=0.001, |
|
beta_end=0.01, |
|
) |
|
self.ov_sd_pipleline = LatentConsistencyEngineAdvanced( |
|
model=model_dir, |
|
device=device, |
|
) |
|
|
|
def generate( |
|
self, |
|
prompt: str, |
|
neg_prompt: str, |
|
init_image: Image = None, |
|
num_inference_steps=4, |
|
strength: float = 0.5, |
|
): |
|
image = self.ov_sd_pipleline( |
|
prompt=prompt, |
|
init_image = init_image, |
|
strength = strength, |
|
num_inference_steps=num_inference_steps, |
|
scheduler=self.scheduler, |
|
seed=None, |
|
) |
|
|
|
return image |
|
|