色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

利用OpenVINO? 部署 HuggingFace預訓練模型的方法與技巧

SDNLAB ? 來源:SDNLAB ? 2023-06-14 17:44 ? 次閱讀

利用 OpenVINO 部署

HuggingFace 預訓練模型的方法與技巧

背 景

作為深度學習領域的 “github”,HuggingFace 已經共享了超過 100,000 個預訓練模型,10,000 個數據集,其中就包括了目前 AIGC 領域非常熱門的“文生圖”,“圖生文”任務范式,例如 ControlNet, StableDiffusion, Blip 等。通過 HuggingFace 開源的 Transformers, Diffu---sers 庫,只需要要調用少量接口函數,入門開發者也可以非常便捷地微調和部署自己的大模型任務,你甚至不需要知道什么是 GPT,BERT 就可以用他的模型,開發者不需要從頭開始構建模型任務,大大簡化了工作流程。從下面的例子中可以看到,在引入 Transformer 庫以后只需要5行代碼就可以構建一個基于 GPT2 的問答系統,期間 HuggingFace 會為你自動下載 Tokenizer 詞向量庫與預訓練模型。

7e68899a-0a96-11ee-962d-dac502259ad0.png

圖:HuggingFace 預訓練模型任務調用示例

但也正因為 Transformer, Diffusers 這些庫具有非常高的易用性,很多底層的代碼與模型任務邏輯也被隱藏了起來,如果開發者想針對某個硬件平臺做特定的優化,則需要將這些庫底層流水行進行拆解再逐個進行模型方面的優化。下面這張圖就展示了利用 HuggingFace 庫在調用 ControlNet 接口時的邏輯, 和他底層實際的流水線結構:

7e962116-0a96-11ee-962d-dac502259ad0.png

圖:ControlNet 接口調用邏輯

7ebeadac-0a96-11ee-962d-dac502259ad0.png

圖:ControlNet 實際運行邏輯

OpenVINO簡介

用于高性能深度學習的英特爾發行版 OpenVINO 工具套件基于 oneAPI 而開發,以期在從邊緣到云的各種英特爾平臺上,幫助用戶更快地將更準確的真實世界結果部署到生產系統中。通過簡化的開發工作流程,OpenVINO 可賦能開發者在現實世界中部署高性能應用程序和算法

在推理后端,得益于 OpenVINO 工具套件提供的“一次編寫,任意部署”的特性,轉換后的模型能夠在不同的英特爾硬件平臺上運行,而無需重新構建,有效簡化了構建與遷移過程。此外,為了支持更多的異構加速單元,OpenVINO 的runtime API底層采用了插件式的開發架構,基于 oneAPI 中的 oneDNN 等函數計算加速庫,針對通用指令集進行深度優化,為不同的硬件執行單元分別實現了一套完整的高性能算子庫,充分提升模型在推理運行時的整體性能表現。

可以說,如果開發者希望在英特爾平臺上實現最佳的推理性能,并具備多平臺適配和兼容性,OpenVINO是不可或缺的部署工具首選。因此接下來的方案也是在探討如何利用 OpenVINO 來加速 HuggingFace 預訓練模型。

OpenVINO 部署方案

簡單來說目前有兩種方案可以實現利用 OpenVINO 加速 Huggingface 模型部署任務,分別是使用 Optimum-Intel 插件以及導出 ONNX 模型部署的方式,兩種方案均有不同的優缺點。

7ed9aa30-0a96-11ee-962d-dac502259ad0.png

圖:OpenVINO 部署 HuggingFace 模型路徑

方案一:使用 Optimum-Intel 推理后端

Optimum-Intel 用于在英特爾平臺上加速 HuggingFace 的端到端流水線。它的 API 和Transformers或是 Diffusers 的原始 API 極其相似,因此所需代碼改動很小。目前Optimum-Intel已經集成了OpenVINO 作為其推理任務后端,在大部分 HuggingFace 預訓練模型的部署任務中,開發者只需要替換少量代碼,就可以實現將 HuggingFace Pipeline 中的模型通過 OpenVINO 部署在 Intel CPU 上,并加速推理任務,OpenVINO 會自動優化 bfloat16 模型,優化后的平均延遲下降到了 16.7 秒,相當不錯的 2 倍加速。從下圖可以看到在調用 OpenVINO 的推理后端后,我們可以最大化 Stable Diffusion 系列任務在 Intel CPU 上的推理性能。

7efbc7f0-0a96-11ee-962d-dac502259ad0.png

圖:Huggingface 不同后端在 CPU 上的性能比較

項目地址:

https://github.com/huggingface/optimum-intel7f289c9e-0a96-11ee-962d-dac502259ad0.png

圖:只需2行代碼替換,利用 OpenVINO 部署文本分類任務

此外 Optimum-Intel 也可以支持在 Intel GPU 上部署模型:

7f565d32-0a96-11ee-962d-dac502259ad0.png

圖:在 Intel GPU 上加載 Huggingface 模型

Optimum Intel 和 OpenVINO 安裝方式如下:

$ pip install optimum[openvino]

在部署Stable Diffusion 模型任務時,我們也只需要將StableDiffusion Pipeline 替換為 OVStableDiffusionPipeline 即可。

from optimum.intel.openvino import OVStableDiffusionPipeline


ov_pipe=OVStableDiffusionPipeline.from_pretrained(model_id,export=True)

除此以外 Optimum-Intel 還引入了對 OpenVINO 模型壓縮工具 NNCF 組件的支持,NNCF 目前可以支持 Post-training static quantization (訓練后量化)和 Quantization-aware training (訓練感知量化)兩種模型壓縮模式,前者需要引入少量不帶標簽的樣本數據來校準模型輸入的數據分布,定制量化參數,后者則可以在保證模型準確性的情況下,進行量化重訓練。將 HuggingFace 中豐富的數據集資源作為校準數據或是重訓練數據,我們可以輕松完成對預訓練模型的 Int8 在線量化與推理,具體示例如下:

7f840016-0a96-11ee-962d-dac502259ad0.png

圖:后訓練量化示例

方案二:使用 OpenVINO runtime 進行部署

當然 Optimum-Intel 庫在提供極大便捷性的同時,也有一定的不足,例如對于新模型的支持存在一定的滯后性,并且對 HuggingFace 庫存在依賴性,因此第二種方案就是將 HuggingFace 的預訓練模型直接導出為 ONNX 格式,再直接通過 OpenVINO 的原生推理接口重構整個 pipeline,以此來達到部署代碼輕量化,以及對新模型 pipeline enable 的目的。

這里提供三種導出模型的方案:

1. 使用 Optimum-Intel 接口直接導出 OpenVINO 的 IR 格式模型:

7fa8ea70-0a96-11ee-962d-dac502259ad0.png

圖:使用 Optimum-Intel 直接導出 IR 文件

2. 使用 HuggingFace 原生工具導出 ONNX 格式模型:

HuggingFace 的部分庫中是包含 ONNX 模型導出工具的,以 Transformer 庫為例,我們可以參考其官方文檔實現 ONNX 模型的導出。

使用方法:

https://huggingface.co/docs/transformers/index

3. 使用 PyTorch 底層接口導出 ONNX 格式模型:

如果是 Optimum-Intel 還不支持的模型,同時 HuggingFace 庫也沒有提供模型導出工具的話,我們就要通過基礎訓練框架對其進行解析,由于 Transformer 等庫的底層是基于 PyTorch 框架進行構建,如何從 PyTorch 框架導出 ONNX 模型的通用方法,可以參考官方的說明文檔:https://docs.openvino.ai/latest/openvino_docs_MO_DG_prepare_model_convert_model_Convert_Model_From_PyTorch.html

這里我們再以 ControlNet 的姿態任務作為示例,從本文背景章節中的任務流程圖中我們不難發現 ControlNet 任務是基于多個模型構建而成,他的 HuggingFace 測試代碼可以分為以下幾個部分:

項目倉庫:https://huggingface.co/lllyasviel/sd-controlnet-openpose

1) 加載并構建 OpenPose 模型任務

openpose = OpenposeDetector.from_pretrained('lllyasviel/ControlNet')

2) 運行 OpenPose 推理任務,獲得人體關鍵點結構

image = openpose(image)

3) 加載并構建 ControlNet 模型任務

controlnet = ControlNetModel.from_pretrained( "lllyasviel/sd-controlnet-openpose", torch_dtype=torch.float16)

4) 下載并構建 Stable Diffusion 系列模型任務,并將 ControlNet 對象集成到 StableDiffusion 原始的 pipeline 中

pipe = StableDiffusionControlNetPipeline.from_pretrained( "runwayml/stable-diffusion-v1-5", controlnet=controlnet, safety_checker=None, torch_dtype=torch.float16)

5) 運行整個 pipeline 獲取生成的結果圖像

image = pipe("chef in the kitchen", image, num_inference_steps=20).images[0]

可以看到在1,3,4步任務中夠封裝了模型的下載,因此我們需要對這些接口進行“逆向工程”,找出其中的 PyTorch 的模型對象,并利用 PyTorch 自帶的 ONNX 轉換接口 torch.onnx.export(model, (dummy_input, ), 'model.onnx'),將這些對象導出為ONNX格式,在這個接口最重要的兩個參數分別為 torch.nn.Module 模型對象 model,和一組模擬的輸入數據 dummy_input,由于 PyTorch 是支持動態的 input shape,輸入沒有固定的 shape,因此我們需要根據實際情況,找到每個模型的 input shape,然后再創建模擬輸入數據。在這個過程這里我們分別需要找到這個幾個接口所對應庫的源碼,再進行重構:

1) OpenPose 模塊

首先是人體姿態關鍵點檢測任務的代碼倉庫:

https://github.com/patrickvonplaten/controlnet_aux/tree/master/src/controlnet_aux/open_pose

通過解析推理時實際調用的模型對象,我們可以了解到,這個模型的 PyTorch 對象類為 class bodypose_model(nn.Module),輸入為 NCHW 格式的圖像 tensor,而他在 controlnet_aux 庫推理過程中抽象出的實例是 OpenposeDetector.body_estimation.model,因此我們可以通過以下方法將他導出為 ONNX 格式:

torch.onnx.export(openpose.body_estimation.model, torch.zeros([1, 3, 184, 136]), OPENPOSE_ONNX_PATH)

因為 OpenVINO 支持動態的 input shape,所以 export 函數中對于輸入的長和寬可以隨機定義。

2) StableDiffusionControlNetPipeline 模塊

我們可以把第3和第4步中用到的模型放在一起來看:

https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_controlnet.py#L188

7fcc6342-0a96-11ee-962d-dac502259ad0.png

圖:StableDiffusionControlNetPipeline 對象初始化參數

可以看到在構建 StableDiffusionControlNetPipeline 的時候,會初始化4個 torch.nn.Module 模型對象,分別是 vae, text_encoder, unet, controlnet, 因此我們在重構任務的過程中也需要手動導出這幾個模型對象,此時你必須知道每一個模型的 input shape,以此來構建模擬輸入數據,這里比較常規的做法是:直接調取 pipeline 中的成員函數進行單個模型的推理任務作為 torch.onnx.export 函數中的 model 實例。

pipe.text_encoder(
      uncond_input.input_ids.to(device),
      attention_mask=attention_mask,
)

單獨調取 text_encoder 推理任務

遍歷 StableDiffusionControlNetPipeline__call__ 函數,我們也不難發現,多個模型之間存在串聯關系。因此我們也可以模仿 StableDiffusionControlNetPipeline 的調用任務,構建自己的 pipeline,并通過運行這個 pipeline 找到每個模型的 input shape。直白來說就是先重構任務,再導出模型。

(https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_controlnet.py#L188)

7fec37d0-0a96-11ee-962d-dac502259ad0.png

圖:ControlNet 和 Unet 串聯

為了更方便地搜索出每個模型的輸入數據維度信息,我們也可以為每個模型單獨創建一個“鉤子”腳本,用于替換原始任務中的推理部分的代碼,“鉤取”原始任務的輸入數據結構。以 ControlNet 模型為例。

3) 查詢原始模型的輸入參數,將以對應到實際任務的輸入參數。

801e8424-0a96-11ee-962d-dac502259ad0.png

https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_controlnet.py#L188

4) 創建鉤子腳本

class controlnet_input_shape??(object): def __init__(self, model) -> None: super().__init__() self.model = model self.dtype = model.dtype def __call__(self,latent_model_input, t, encoder_hidden_states, controlnet_cond, return_dict): print("sample:" + str(latent_model_input.shape), "timestep:" + str(t.shape), "encoder_hidden_states:" + str(encoder_hidden_states.shape), "controlnet_cond:" + str(controlnet_cond.shape)) def to(self, device):self.model.to(device)

5) 將鉤子對象替換原來的 controlnet 模型對象,并運行原始的 pipeline 任務

hooker = controlnet_input_shape--(pipe.controlnet)pipe.controlnet=hooker

6)----運行結果

$ “sample:torch.Size([2, 4, 96, 64]) timestep:torch.Size([]) encoder_hidden_states:torch.Size([2, 77, 768]) controlnet_cond:torch.Size([2, 3, 768, 512])”

模型導出以及重構部分的完整演示代碼可以參考以下示例,這里有一點需要額外注意因為 OpenVINO 的推理接口只支持 numpy 數據輸入,而 Diffuers 的示例任務是以 Torch Tensor 進行數據傳遞,所以這里建議開發用 numpy 來重新實現模型的前后處理任務,或是在 OpenVINO 模型輸入和輸入側提前完成格式轉換。

完整項目地址:

https://github.com/openvinotoolkit/openvino_notebooks/blob/main/notebooks/235-controlnet-stable-diffusion/235-controlnet-stable-diffusion.ipynb

總 結

作為當下最火的預訓練模型倉庫之一,HuggingFace 可以幫助我們快速實現 AIGC 類模型 的部署,通過引入 Optimum-Intel 以及 OpenVINO 工具套件,開發者可以更進一步提升這個預訓練模型在英特爾平臺上的任務性能。以下是這兩種方案的優缺點比較:

802f73ec-0a96-11ee-962d-dac502259ad0.png ?

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

    關注

    3

    文章

    4333

    瀏覽量

    62708
  • 模型
    +關注

    關注

    1

    文章

    3254

    瀏覽量

    48894
  • 深度學習
    +關注

    關注

    73

    文章

    5504

    瀏覽量

    121246

原文標題:開發者實戰 | 利用 OpenVINO? 部署 HuggingFace 預訓練模型的方法與技巧

文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    如何使用OpenVINO C++ API部署FastSAM模型

    象的位置和邊界。本文將介紹如何使用 OpenVINO C++ API 部署 FastSAM 模型,以實現快速高效的語義分割。在前文中我們發表了《基于 OpenVINO Python A
    的頭像 發表于 11-17 09:53 ?935次閱讀
    如何使用<b class='flag-5'>OpenVINO</b> C++ API<b class='flag-5'>部署</b>FastSAM<b class='flag-5'>模型</b>

    【大語言模型:原理與工程實踐】大語言模型訓練

    大語言模型的核心特點在于其龐大的參數量,這賦予了模型強大的學習容量,使其無需依賴微調即可適應各種下游任務,而更傾向于培養通用的處理能力。然而,隨著學習容量的增加,對訓練數據的需求也相
    發表于 05-07 17:10

    基于訓練模型和長短期記憶網絡的深度學習模型

    語義槽填充是對話系統中一項非常重要的任務,旨在為輸入句子的毎個單詞標注正確的標簽,其性能的妤壞極大地影響著后續的對話管理模塊。目前,使用深度學習方法解決該任務時,一般利用隨機詞向量或者訓練
    發表于 04-20 14:29 ?19次下載
    基于<b class='flag-5'>預</b><b class='flag-5'>訓練</b><b class='flag-5'>模型</b>和長短期記憶網絡的深度學習<b class='flag-5'>模型</b>

    探索OpenVINO? 手寫字符使用方法

    針對性的數據集與訓練,然后才得到比較好的識別精度。 OpenVINO 在2021.4 版本中已經加入了手寫數字識別的訓練模型,開始支持手寫
    的頭像 發表于 07-28 09:23 ?1379次閱讀

    如何實現更綠色、經濟的NLP訓練模型遷移

    NLP中,訓練模型Finetune是一種非常常見的解決問題的范式。利用在海量文本上訓練得到
    的頭像 發表于 03-21 15:33 ?2219次閱讀

    利用視覺語言模型對檢測器進行訓練

    訓練通常被用于自然語言處理以及計算機視覺領域,以增強主干網絡的特征提取能力,達到加速訓練和提高模型泛化性能的目的。該方法亦可以用于場景文本
    的頭像 發表于 08-08 15:33 ?1414次閱讀

    在C++中使用OpenVINO工具包部署YOLOv5模型

    下載并轉換YOLOv5訓練模型的詳細步驟,請參考:《基于OpenVINO?2022.2和蝰蛇峽谷優化并部署YOLOv5
    的頭像 發表于 02-15 16:53 ?4709次閱讀

    什么是訓練 AI 模型

    訓練 AI 模型是為了完成特定任務而在大型數據集上訓練的深度學習模型。這些模型既可以直接使用,
    的頭像 發表于 04-04 01:45 ?1461次閱讀

    利用OpenVINO?部署HuggingFace訓練模型方法與技巧

    作為深度學習領域的 “github”,HuggingFace 已經共享了超過 100,000 個訓練模型
    的頭像 發表于 05-19 15:57 ?947次閱讀
    <b class='flag-5'>利用</b><b class='flag-5'>OpenVINO</b>?<b class='flag-5'>部署</b><b class='flag-5'>HuggingFace</b><b class='flag-5'>預</b><b class='flag-5'>訓練</b><b class='flag-5'>模型</b>的<b class='flag-5'>方法</b>與技巧

    什么是訓練AI模型

    訓練 AI 模型是為了完成特定任務而在大型數據集上訓練的深度學習模型。這些模型既可以直接使用,
    的頭像 發表于 05-25 17:10 ?1056次閱讀

    訓練Pytorch模型使用OpenVINO?優化并部署在AI愛克斯開發板

    本文章將依次介紹如何將 Pytorch 自訓練模型經過一系列變換變成 OpenVINO IR 模型形式,而后使用 OpenVINO Pyth
    的頭像 發表于 05-26 10:23 ?952次閱讀
    自<b class='flag-5'>訓練</b>Pytorch<b class='flag-5'>模型</b>使用<b class='flag-5'>OpenVINO</b>?優化并<b class='flag-5'>部署</b>在AI愛克斯開發板

    使用OpenVINO優化并部署訓練好的YOLOv7模型

    在《英特爾銳炫 顯卡+ oneAPI 和 OpenVINO 實現英特爾 視頻 AI 計算盒訓推一體-上篇》一文中,我們詳細介紹基于英特爾 獨立顯卡搭建 YOLOv7 模型訓練環境,并完成了 YOLOv7
    的頭像 發表于 08-25 11:08 ?1541次閱讀
    使用<b class='flag-5'>OpenVINO</b>優化并<b class='flag-5'>部署</b><b class='flag-5'>訓練</b>好的YOLOv7<b class='flag-5'>模型</b>

    OpenVINO場景文字檢測與文字識別教程

    OpenVINO是英特爾推出的深度學習模型部署框架,當前最新版本是OpenVINO2023版本。OpenVINO2023自帶各種常見視覺任務
    的頭像 發表于 09-24 15:31 ?1629次閱讀
    <b class='flag-5'>OpenVINO</b>場景文字檢測與文字識別教程

    基于OpenVINO Python API部署RT-DETR模型

    平臺實現 OpenVINO 部署 RT-DETR 模型實現深度學習推理加速, 在本文中,我們將首先介紹基于 OpenVINO Python API
    的頭像 發表于 10-20 11:15 ?997次閱讀
    基于<b class='flag-5'>OpenVINO</b> Python API<b class='flag-5'>部署</b>RT-DETR<b class='flag-5'>模型</b>

    基于OpenVINO C# API部署RT-DETR模型

    RT-DETR 是在 DETR 模型基礎上進行改進的,一種基于 DETR 架構的實時端到端檢測器,它通過使用一系列新的技術和算法,實現了更高效的訓練和推理,在前文我們發表了《基于 OpenVINO
    的頭像 發表于 11-10 16:59 ?767次閱讀
    基于<b class='flag-5'>OpenVINO</b> C# API<b class='flag-5'>部署</b>RT-DETR<b class='flag-5'>模型</b>
    主站蜘蛛池模板: 欧美Av无码高清在线| 亚洲成AV人电影在线观看| 中文国产在线观看| 久久免费特黄毛片| 8x8x我要打机飞在线观看| 年轻的女职工在线观看| 国产VA精品午夜福利视频| 亚洲日韩乱码人人爽人人澡人| 久久免费高清| 俄罗斯摘花| 一攻多受h嗯啊巨肉bl巨污| 欧美国产一区二区三区激情无套| 国产69精品久久久久无码麻豆| 亚洲日本天堂在线| 全免费午夜一级毛片| 果冻传媒2021精品在线观看| 91嫩草视频在线观看| 无人区大片中文字幕在线| 久久亚洲伊人中字综合精品| YELLOW免费观看2019| 亚洲性无码av在线| 人人听力网mp3下载| 娇妻玩4P被三个男人伺候电影| 99热这里只有精品视频2| 亚洲 欧美 综合 高清 在线| 男生扒开美女尿口戳戳| 国产中文在线观看| 9国产露脸精品国产麻豆| 亚洲精品高清在线| 欧美牲交视频免费观看K8经典| 国产人妻系列无码专区97SS| 9420高清完整版在线电影免费观看 | 女人的选择hd| 国产中文在线| 超碰在线vip| 征服艳妇后宫春色| 小蝌蚪视频在线观看免费观看WWW 小货SAO边洗澡边CAO你动漫 | 日韩欧美一区二区三区免费观看| 寂寞少妇直播| 国产精品高清视频在线| 99视频在线观看视频|