|
"""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
|
|
|