在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

用OpenVINO?在英特爾13th Gen CPU上運行SDXL-Turbo文本圖像生成模型

英特爾物聯網 ? 來源:英特爾物聯網 ? 2024-01-18 17:13 ? 次閱讀

本文基于第 13 代英特爾 酷睿 i5-13490F 型號CPU 驗證,對于量化后模型,你只需要在16G 的筆記本電腦上就可體驗生成過程(最佳體驗為 32G 內存)。

SDXL-Turbo 是一個快速的生成式文本到圖像模型,可以通過單次網絡評估從文本提示中合成逼真的圖像。SDXL-Turbo 采用了一種稱為 Adversarial Diffusion Distillation (ADD) 的新型訓練方法(詳見技術報告),該方法可以在 1 到 4 個步驟中對大規模基礎圖像擴散模型進行采樣,并保持高質量的圖像。通過最新版本(2023.2)OpenVINO工具套件的強大推理能力及NNCF 的高效神經網絡壓縮能力,我們能夠在兩秒內實現SDXL-Turbo 圖像的高速、高質量生成。

01

環境安裝

在開始之前,我們需要安裝所有環境依賴:

%pip install --extra-index-url https://download.pytorch.org/whl/cpu 
torch transformers diffusers nncf optimum-intel gradio openvino==2023.2.0 onnx 
"git+https://github.com/huggingface/optimum-intel.git"

02

下載、轉換模型

首先我們要把huggingface 下載的原始模型轉化為OpenVINO IR,以便后續的NNCF 工具鏈進行量化工作。轉換完成后你將得到對應的text_encode、unet、vae 模型。

from pathlib import Path


model_dir = Path("./sdxl_vino_model")
sdxl_model_id = "stabilityai/sdxl-turbo"
skip_convert_model = model_dir.exists()

import os
if not skip_convert_model:
  # 設置下載路徑到當前文件夾,并加速下載
  os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
  os.system(f'optimum-cli export openvino --model {sdxl_model_id} --task stable-diffusion-xl {model_dir} --fp16')
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
tae_id = "madebyollin/taesdxl"
save_path = './taesdxl'
os.system(f'huggingface-cli download --resume-download {tae_id} --local-dir {save_path}')

import torch
import openvino as ov
from diffusers import AutoencoderTiny
import gc


class VAEEncoder(torch.nn.Module):
  def __init__(self, vae):
    super().__init__()
    self.vae = vae


  def forward(self, sample):
    return self.vae.encode(sample)
  
class VAEDecoder(torch.nn.Module):
  def __init__(self, vae):
    super().__init__()
    self.vae = vae


  def forward(self, latent_sample):
    return self.vae.decode(latent_sample)


def convert_tiny_vae(save_path, output_path):
  tiny_vae = AutoencoderTiny.from_pretrained(save_path)
  tiny_vae.eval()
  vae_encoder = VAEEncoder(tiny_vae)
  ov_model = ov.convert_model(vae_encoder, example_input=torch.zeros((1,3,512,512)))
  ov.save_model(ov_model, output_path / "vae_encoder/openvino_model.xml")
  tiny_vae.save_config(output_path / "vae_encoder")
  vae_decoder = VAEDecoder(tiny_vae)
  ov_model = ov.convert_model(vae_decoder, example_input=torch.zeros((1,4,64,64)))
  ov.save_model(ov_model, output_path / "vae_decoder/openvino_model.xml")
  tiny_vae.save_config(output_path / "vae_decoder")  


convert_tiny_vae(save_path, model_dir)

03

從文本到圖像生成

現在,我們就可以進行文本到圖像的生成了,我們使用優化后的openvino pipeline 加載轉換后的模型文件并推理;只需要指定一個文本輸入,就可以生成我們想要的圖像結果。

from optimum.intel.openvino import OVStableDiffusionXLPipeline
device='AUTO' # 這里直接指定AUTO,可以寫成CPU
model_dir = "./sdxl_vino_model"
text2image_pipe = OVStableDiffusionXLPipeline.from_pretrained(model_dir, device=device)

import numpy as np
prompt = "cute cat"
image = text2image_pipe(prompt, num_inference_steps=1, height=512, width=512, guidance_scale=0.0, generator=np.random.RandomState(987)).images[0]
image.save("cat.png")
image

# 清除資源占用
import gc
del text2image_pipe
gc.collect()

04

從圖片到圖片生成

我們還可以實現從圖片到圖片的擴散模型生成,將剛才產出的文生圖圖片進行二次圖像生成即可。

from optimum.intel import OVStableDiffusionXLImg2ImgPipeline
model_dir = "./sdxl_vino_model"
device='AUTO' # 'CPU'
image2image_pipe = OVStableDiffusionXLImg2ImgPipeline.from_pretrained(model_dir, device=device)

  Compiling the vae_decoder to AUTO ...
  Compiling the unet to AUTO ...
  Compiling the vae_encoder to AUTO ...
  Compiling the text_encoder_2 to AUTO ...
  Compiling the text_encoder to AUTO ...

photo_prompt = "a cute cat with bow tie"
photo_image = image2image_pipe(photo_prompt, image=image, num_inference_steps=2, generator=np.random.RandomState(511), guidance_scale=0.0, strength=0.5).images[0]
photo_image.save("cat_tie.png")
photo_image

05

量化

NNCF(Neural Network Compression Framework) 是一款神經網絡壓縮框架,通過對 OpenVINO IR 格式模型的壓縮與量化以便更好的提升模型在英特爾設備上部署的推理性能。

[NNCF]:

https://github.com/openvinotoolkit/nncf/

[NNCF] 通過在模型圖中添加量化層,并使用訓練數據集的子集來微調這些額外的量化層的參數,實現了后訓練量化。量化后的權重結果將是INT8 而不是FP32/FP16,從而加快了模型的推理速度。

根據SDXL-Turbo Model 的結構,UNet 模型占據了整個流水線執行時間的重要部分。現在我們將展示如何使用[NNCF] 對UNet 部分進行優化,以減少計算成本并加快流水線速度。至于其余部分不需要量化,因為并不能顯著提高推理性能,但可能會導致準確性的大幅降低。

量化過程包含以下步驟:

- 為量化創建一個校準數據集。

- 運行nncf.quantize() 來獲取量化模型。

- 使用openvino.save_model() 函數保存INT8 模型。

注:由于量化需要一定的硬件資源(64G 以上的內存),之后我直接附上了量化后的模型,你可以直接下載使用。

from pathlib import Path
import openvino as ov
from optimum.intel.openvino import OVStableDiffusionXLPipeline
import os


core = ov.Core()
model_dir = Path("./sdxl_vino_model")
UNET_INT8_OV_PATH = model_dir / "optimized_unet" / "openvino_model.xml"


import datasets
import numpy as np
from tqdm import tqdm
from transformers import set_seed
from typing import Any, Dict, List


set_seed(1)


class CompiledModelDecorator(ov.CompiledModel):
  def __init__(self, compiled_model: ov.CompiledModel, data_cache: List[Any] = None):
    super().__init__(compiled_model)
    self.data_cache = data_cache if data_cache else []


  def __call__(self, *args, **kwargs):
    self.data_cache.append(*args)
    return super().__call__(*args, **kwargs)


def collect_calibration_data(pipe, subset_size: int) -> List[Dict]:
  original_unet = pipe.unet.request
  pipe.unet.request = CompiledModelDecorator(original_unet)
  dataset = datasets.load_dataset("conceptual_captions", split="train").shuffle(seed=42)


  # Run inference for data collection
  pbar = tqdm(total=subset_size)
  diff = 0
  for batch in dataset:
    prompt = batch["caption"]
    if len(prompt) > pipe.tokenizer.model_max_length:
      continue
    _ = pipe(
      prompt,
      num_inference_steps=1,
      height=512,
      width=512,
      guidance_scale=0.0,
      generator=np.random.RandomState(987)
    )
    collected_subset_size = len(pipe.unet.request.data_cache)
    if collected_subset_size >= subset_size:
      pbar.update(subset_size - pbar.n)
      break
    pbar.update(collected_subset_size - diff)
    diff = collected_subset_size


  calibration_dataset = pipe.unet.request.data_cache
  pipe.unet.request = original_unet
  return calibration_dataset

if not UNET_INT8_OV_PATH.exists():
  text2image_pipe = OVStableDiffusionXLPipeline.from_pretrained(model_dir)
  unet_calibration_data = collect_calibration_data(text2image_pipe, subset_size=200)

import nncf
from nncf.scopes import IgnoredScope


UNET_OV_PATH = model_dir / "unet" / "openvino_model.xml"
if not UNET_INT8_OV_PATH.exists():
  unet = core.read_model(UNET_OV_PATH)
  quantized_unet = nncf.quantize(
    model=unet,
    model_type=nncf.ModelType.TRANSFORMER,
    calibration_dataset=nncf.Dataset(unet_calibration_data),
    ignored_scope=IgnoredScope(
      names=[
        "__module.model.conv_in/aten::_convolution/Convolution",
        "__module.model.up_blocks.2.resnets.2.conv_shortcut/aten::_convolution/Convolution",
        "__module.model.conv_out/aten::_convolution/Convolution"
      ],
    ),
  )
  ov.save_model(quantized_unet, UNET_INT8_OV_PATH)

06

運行量化后模型

由于量化unet 的過程需要的內存可能比較大,且耗時較長,我提前導出了量化后unet 模型,此處給出下載地址:

鏈接: https://pan.baidu.com/s/1WMAsgFFkKKp-EAS6M1wK1g

提取碼: psta

下載后解壓到目標文件夾`sdxl_vino_model` 即可運行量化后的int8 unet 模型。

從文本到圖像生成

from pathlib import Path
import openvino as ov
from optimum.intel.openvino import OVStableDiffusionXLPipeline
import numpy as np


core = ov.Core()
model_dir = Path("./sdxl_vino_model")
UNET_INT8_OV_PATH = model_dir / "optimized_unet" / "openvino_model.xml"
int8_text2image_pipe = OVStableDiffusionXLPipeline.from_pretrained(model_dir, compile=False)
int8_text2image_pipe.unet.model = core.read_model(UNET_INT8_OV_PATH)
int8_text2image_pipe.unet.request = None


prompt = "cute cat"
image = int8_text2image_pipe(prompt, num_inference_steps=1, height=512, width=512, guidance_scale=0.0, generator=np.random.RandomState(987)).images[0]
display(image)

 Compiling the text_encoder to CPU ...
  Compiling the text_encoder_2 to CPU ...




   0%|     | 0/1 [00:00

import gc
del int8_text2image_pipe
gc.collect()

從圖片到圖片生成

from optimum.intel import OVStableDiffusionXLImg2ImgPipeline
int8_image2image_pipe = OVStableDiffusionXLImg2ImgPipeline.from_pretrained(model_dir, compile=False)
int8_image2image_pipe.unet.model = core.read_model(UNET_INT8_OV_PATH)
int8_image2image_pipe.unet.request = None


photo_prompt = "a cute cat with bow tie"
photo_image = int8_image2image_pipe(photo_prompt, image=image, num_inference_steps=2, generator=np.random.RandomState(511), guidance_scale=0.0, strength=0.5).images[0]
display(photo_image)

  Compiling the text_encoder to CPU ...
  Compiling the text_encoder_2 to CPU ...
  Compiling the vae_encoder to CPU ...




   0%|     | 0/1 [00:00

我們可以對比量化后的unet 模型大小減少,可以看到量化對模型大小的壓縮是非常顯著的

from pathlib import Path


model_dir = Path("./sdxl_vino_model")
UNET_OV_PATH = model_dir / "unet" / "openvino_model.xml"
UNET_INT8_OV_PATH = model_dir / "optimized_unet" / "openvino_model.xml"


fp16_ir_model_size = UNET_OV_PATH.with_suffix(".bin").stat().st_size / 1024
quantized_model_size = UNET_INT8_OV_PATH.with_suffix(".bin").stat().st_size / 1024


print(f"FP16 model size: {fp16_ir_model_size:.2f} KB")
print(f"INT8 model size: {quantized_model_size:.2f} KB")
print(f"Model compression rate: {fp16_ir_model_size / quantized_model_size:.3f}")  

  FP16 model size: 5014578.27 KB
  INT8 model size: 2513501.39 KB
  Model compression rate: 1.995

運行下列代碼可以對量化前后模型推理速度進行簡單比較,我們可以發現速度幾乎加速了一倍,NNCF 使我們在 CPU 上生成一張圖的時間縮短到兩秒之內:

FP16 pipeline latency: 3.148
INT8 pipeline latency: 1.558
Text-to-Image generation speed up: 2.020

import time
def calculate_inference_time(pipe):
  inference_time = []
  for prompt in ['cat']*10:
    start = time.perf_counter()
    _ = pipe(
      prompt,
      num_inference_steps=1,
      guidance_scale=0.0,
      generator=np.random.RandomState(23)
    ).images[0]
    end = time.perf_counter()
    delta = end - start
    inference_time.append(delta)
  return np.median(inference_time)

int8_latency = calculate_inference_time(int8_text2image_pipe)
text2image_pipe = OVStableDiffusionXLPipeline.from_pretrained(model_dir)
fp_latency = calculate_inference_time(text2image_pipe)
print(f"FP16 pipeline latency: {fp_latency:.3f}")
print(f"INT8 pipeline latency: {int8_latency:.3f}")
print(f"Text-to-Image generation speed up: {fp_latency / int8_latency:.3f}")

07

可交互前端demo

最后,為了方便推理使用,這里附上了gradio 前端運行demo,你可以利用他輕松生成你想要生成的圖像,并嘗試不同組合。

import gradio as gr
from pathlib import Path
import openvino as ov
import numpy as np


core = ov.Core()
model_dir = Path("./sdxl_vino_model")


# 如果你只有量化前模型,請使用這個地址并注釋 optimized_unet 地址:
# UNET_PATH = model_dir / "unet" / "openvino_model.xml"
UNET_PATH = model_dir / "optimized_unet" / "openvino_model.xml"


from optimum.intel.openvino import OVStableDiffusionXLPipeline
text2image_pipe = OVStableDiffusionXLPipeline.from_pretrained(model_dir)
text2image_pipe.unet.model = core.read_model(UNET_PATH)
text2image_pipe.unet.request = core.compile_model(text2image_pipe.unet.model)


def generate_from_text(text, seed, num_steps, height, width):
  result = text2image_pipe(text, num_inference_steps=num_steps, guidance_scale=0.0, generator=np.random.RandomState(seed), height=height, width=width).images[0]
  return result


with gr.Blocks() as demo:
  with gr.Column():
    positive_input = gr.Textbox(label="Text prompt")
    with gr.Row():
      seed_input = gr.Number(precision=0, label="Seed", value=42, minimum=0)
      steps_input = gr.Slider(label="Steps", value=1, minimum=1, maximum=4, step=1)
      height_input = gr.Slider(label="Height", value=512, minimum=256, maximum=1024, step=32)
      width_input = gr.Slider(label="Width", value=512, minimum=256, maximum=1024, step=32)
      btn = gr.Button()
    out = gr.Image(label="Result (Quantized)" , type="pil", width=512)
    btn.click(generate_from_text, [positive_input, seed_input, steps_input, height_input, width_input], out)
    gr.Examples([
      ["cute cat", 999], 
      ["underwater world coral reef, colorful jellyfish, 35mm, cinematic lighting, shallow depth of field, ultra quality, masterpiece, realistic", 89],
      ["a photo realistic happy white poodle dog playing in the grass, extremely detailed, high res, 8k, masterpiece, dynamic angle", 1569],
      ["Astronaut on Mars watching sunset, best quality, cinematic effects,", 65245],
      ["Black and white street photography of a rainy night in New York, reflections on wet pavement", 48199]
    ], [positive_input, seed_input])


try:
  demo.launch(debug=True)
except Exception:
  demo.launch(share=True, debug=True)

08

總結

利用最新版本的OpenVINO優化,我們可以很容易實現在家用設備上高效推理圖像生成AI 的能力,加速生成式AI 在世紀場景下的落地應用;歡迎您與我們一同體驗OpenVINO與NNCF 在生成式AI 場景上的強大威力。






審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 英特爾
    +關注

    關注

    61

    文章

    10135

    瀏覽量

    173521
  • OpenVINO
    +關注

    關注

    0

    文章

    111

    瀏覽量

    379

原文標題:用 OpenVINO? 在英特爾 13th Gen CPU 上運行 SDXL-Turbo 文本圖像生成模型 | 開發者實戰

文章出處:【微信號:英特爾物聯網,微信公眾號:英特爾物聯網】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    英特爾酷睿Ultra AI PC上部署多種圖像生成模型

    全新英特爾酷睿Ultra 200V系列處理器對比上代Meteor Lake,升級了模塊化結構、封裝工藝,采用全新性能核與能效核、英特爾硬件線程調度器、Xe2微架構銳炫GPU、第四代NPU等,由此也帶來了CPU性能提升18%,GP
    的頭像 發表于 04-02 15:47 ?252次閱讀
    <b class='flag-5'>在</b><b class='flag-5'>英特爾</b>酷睿Ultra AI PC上部署多種<b class='flag-5'>圖像</b><b class='flag-5'>生成</b><b class='flag-5'>模型</b>

    為什么無法檢測到OpenVINO?工具套件中的英特爾?集成圖形處理單元?

    Ubuntu* Desktop 22.04 安裝了 英特爾? Graphics Driver 版本并OpenVINO? 2023.1。 運行
    發表于 03-05 08:36

    請問OpenVINO?工具套件英特爾?Distribution是否與Windows? 10物聯網企業版兼容?

    無法基于 Windows? 10 物聯網企業版的目標系統使用 英特爾? Distribution OpenVINO? 2021* 版本推斷模型
    發表于 03-05 08:32

    安裝OpenVINO?適用于Raspberry Pi64位操作系統的工具套件2022.3.1,配置英特爾?NCS2時出錯怎么解決?

    安裝OpenVINO?適用于 Raspberry Pi* 64 位操作系統的工具套件 2022.3.1。 配置英特爾? NCS2時出錯: CMake Error at CMakeLists.txt
    發表于 03-05 07:27

    英特爾?獨立顯卡與OpenVINO?工具套件結合使用時,無法運行推理怎么解決?

    使用英特爾?獨立顯卡與OpenVINO?工具套件時無法運行推理
    發表于 03-05 06:56

    為什么Ubuntu20.04使用YOLOv3比Yocto操作系統的推理快?

    使用 2021.4 OpenVINO?中的 GPU 插件運行帶有 YOLOv3 模型的 對象檢測 C++ 演示 。 使用 英特爾? 酷睿? i5-1145G7E、
    發表于 03-05 06:48

    英特爾?NCS2運行演示時“無法啟動后找到啟動設備”怎么解決?

    使用 英特爾? NCS2 運行 推斷管道演示腳本 。 首次嘗試中成功運行演示應用程序。 從第二次嘗試開始遇到錯誤:E: [ncAPI] [ 150951] [security_ba
    發表于 03-05 06:48

    為什么Caffe模型可以直接與OpenVINO?工具套件推斷引擎API一起使用,而無法轉換為中間表示 (IR)?

    推斷 Caffe 模型直接基于 英特爾? 神經電腦棒 2 (英特爾? NCS2)。 無法確定為什么 Caffe 模型可以直接與OpenVINO
    發表于 03-05 06:31

    英特爾OpenVINO 2025.0正式發布

    生成式AI(GenAI)模型質量與應用范圍上持續爆發式增長,DeepSeek 等頂尖模型已引發行業熱議,這種勢頭預計將在 2025年延續。本次更新聚焦性能提升、更多
    的頭像 發表于 02-21 10:20 ?542次閱讀
    <b class='flag-5'>英特爾</b><b class='flag-5'>OpenVINO</b> 2025.0正式發布

    英特爾的開發板評測

    作者: 隋曉金 收到英特爾的開發板-小挪吒,正好手中也有oak相機,反正都是 OpenVINO?一套玩意,進行評測一下,竟然默認是個Windows系統,刷機成Linux系統比較方便。 我們先刷個刷成
    的頭像 發表于 01-24 09:37 ?761次閱讀
    <b class='flag-5'>英特爾</b>的開發板評測

    使用PyTorch英特爾獨立顯卡訓練模型

    《PyTorch 2.5重磅更新:性能優化+新特性》中的一個新特性就是:正式支持英特爾獨立顯卡訓練模型
    的頭像 發表于 11-01 14:21 ?1662次閱讀
    使用PyTorch<b class='flag-5'>在</b><b class='flag-5'>英特爾</b>獨立顯卡<b class='flag-5'>上</b>訓練<b class='flag-5'>模型</b>

    英特爾IT的發展現狀和創新動向

    AI大模型的爆發,客觀給IT的發展帶來了巨大的機會。作為把IT發展上升為戰略高度的英特爾,自然推動IT發展中注入了強勁動力。英特爾IT不
    的頭像 發表于 08-16 15:22 ?793次閱讀

    英特爾助力京東云CPU加速AI推理,以大模型構建數智化供應鏈

    英特爾助力京東云CPU加速AI推理,以大模型構建數智化供應鏈
    的頭像 發表于 05-27 11:50 ?727次閱讀
    <b class='flag-5'>英特爾</b>助力京東云<b class='flag-5'>用</b><b class='flag-5'>CPU</b>加速AI推理,以大<b class='flag-5'>模型</b>構建數智化供應鏈

    華擎推出AI QuickSet軟件,支持英特爾銳炫Arc A系列顯卡

    今日,華擎宣布將AI QuickSet軟件工具擴展至英特爾銳炫Arc A系列顯卡,使其能夠便捷地安裝Stable Diffusion web UI OpenVINO,結合英特爾OpenVINO
    的頭像 發表于 05-11 10:58 ?830次閱讀

    已有超過500款AI模型英特爾酷睿Ultra處理器上得以優化運行

    近日,英特爾宣布全新英特爾 酷睿 Ultra處理器,有超過500款AI模型得以優化運行
    的頭像 發表于 05-11 09:31 ?983次閱讀
    主站蜘蛛池模板: 日韩午夜r电影在线观看 | 日本高清免费一本视频在线观看 | 免费国产在线视频 | 婷婷毛片 | 全黄毛片| 免费在线a视频 | 午夜影院a | 操黄色| 三级黄色在线视频 | 久久影视免费体验区午夜啪啪 | 我不卡老子影院午夜伦我不卡四虎 | 亚洲zscs综合网站 | 五月婷婷电影 | 成人5252色| 三级网站免费看 | 狠狠狠色丁香婷婷综合久久五月 | 四虎永久影院 | 一级毛片无毒不卡直接观看 | 免费一看一级毛片 | 老熟女毛片 | 免费国产高清精品一区在线 | 一级特级片 | 在线免费观看h视频 | 日韩种子 | 国产小视频在线高清播放 | 扒开末成年粉嫩的流白浆视频 | 狠狠操狠狠干 | 午夜色视频在线观看 | 四虎在线视频 | 国产资源在线视频 | 小优视频在线 | 色免费在线 | 日本a级三级三级三级久久 日本a级影院 | 日本免费色网站 | 激情久久久久久久久久 | www.天天干.com| 日本黄在线 | 天天干夜夜爽 | 天天天天天干 | 中文天堂在线视频 | 亚洲人成人网毛片在线播放 |