0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

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

3天內(nèi)不再提示

分割一切?Segment Anything量化加速實戰(zhàn)

SDNLAB ? 來源:OpenVINO 中文社區(qū) ? 2023-06-16 16:47 ? 次閱讀

01 一、前言

“分割一切,大家一起失業(yè)!”——近期,這樣一句話在社交媒體上大火!這講的就是Segment Anything Model(簡稱 “SAM” )。SAM 到底是什么?它具備哪些功能?它真的有這么強大嗎?讓我們一起通過本文了解詳情!

SAM 是一個由 Meta AI 實驗室推出的強大人工智能圖像分割應(yīng)用,可以自動識別哪些圖像像素屬于一個對象,并且對圖像中各個對象進行自動風(fēng)格處理,可廣泛用于分析科學(xué)圖像、編輯照片等。

SAM 的完整應(yīng)用由一個圖片編碼器模型(encoder)以及掩碼解碼(mask decoder) + 提示編碼模型(prompt encoder)構(gòu)成,這兩部分都可以被解析為獨立的靜態(tài)模型。其中大部分的算力負載和推理延時都集中在圖片編碼器任務(wù),因此如果進一步提升圖片編碼器部分的執(zhí)行效率,就成為了 SAM 應(yīng)用的主要優(yōu)化方向之一。

b7ddf76a-0c20-11ee-962d-dac502259ad0.png

圖:SAM 模型任務(wù)pipeline

本次分享講重點演示如何通過 OpenVINO 的 NNCF 模型壓縮工具實現(xiàn)對 SAM 編碼器部分的量化壓縮,實現(xiàn)在 CPU 側(cè)的性能提升。

02 量化介紹

在正式開始實戰(zhàn)之前,我們不得不提一下量化的概念,量化是指在不改變模型結(jié)構(gòu)的情況下,將模型參數(shù)的表達區(qū)間從 FP32 映射到 INT8 或是 INT4 范圍,用更小數(shù)值位寬來表示相同的信息,實現(xiàn)對于模型體積的壓縮,降低內(nèi)存消耗,同時在模型網(wǎng)絡(luò)的執(zhí)行過程中,系統(tǒng)會自動調(diào)用硬件平臺專門針對低比特數(shù)據(jù)優(yōu)化的指令集或 kernel 函數(shù),提升性能。

b845906e-0c20-11ee-962d-dac502259ad0.png

圖:不同精度數(shù)據(jù)的表示位寬

Intel AVX512 VNNI 擴展指令集實現(xiàn)了將原本需要3個時鐘周期才能完成的INT8矩陣點乘與加法運算壓縮到一個時鐘周期,而在最新的 AMX 指令集更是將多個 VNNI 模塊進行堆疊實現(xiàn)了單周期內(nèi)成倍的性能提升。

b8746380-0c20-11ee-962d-dac502259ad0.png

圖:INT8 矩陣點乘與加法運算指令集優(yōu)化

03 NNCF 訓(xùn)練后量化模式

NNCF 工具的全稱是 Neural Network Compression Framework,是 OpenVINO 工具鏈中專門用于模型壓縮加速的方案實現(xiàn),包含量化,剪枝,二值化等多種模型壓縮算法,調(diào)用方式又可以分化為訓(xùn)練后量化 (PTQ) 和 訓(xùn)練時壓縮 (QAT) 兩種模式,訓(xùn)練時壓縮要需要引入原始的訓(xùn)練腳本和數(shù)據(jù)集,而訓(xùn)練后量化則可以直接針對訓(xùn)練生成模型文件進行壓縮,無需額外的訓(xùn)練腳本和標注數(shù)據(jù)集參與,這也是 NNCF 在 OpenVINO 2023.0 正式發(fā)布的新功能特性, 而這個模式也僅僅需要以下兩步便可實現(xiàn):

1.準備校驗數(shù)據(jù)集,這里的校驗數(shù)據(jù)僅用作量化過程中對數(shù)據(jù)表示范圍與分布的計算,因此不需要額外的標簽數(shù)據(jù),例如在圖像識別任務(wù)中,我們僅需要送入200-300張左右的圖片文件即可。此外我們還需要定義 DataLoader 對象與 transform_fn 數(shù)據(jù)轉(zhuǎn)換函數(shù), DataLoader 用于讀取校驗數(shù)據(jù)集中的每一個元素,transform_fn 用于將讀取的元素轉(zhuǎn)化為 OpenVINO 模型推理的直接輸入數(shù)據(jù)。

import nncf

calibration_loader = torch.utils.data.DataLoader(...)

def transform_fn(data_item):

images, _ = data_item

return images

calibration_dataset = nncf.Dataset(calibration_loader,transform_fn)

2.運行模型量化,首先需要導(dǎo)入模型對象,然后通過 nncf.quantize() 接口,將模型對象與校驗數(shù)據(jù)集綁定開啟量化任務(wù), NNCF 工具可以支持多種模型對象類型,包含openvino.runtime.Model, torch.nn.Module, onnx.ModelProto以及 tensorflow.Module

model = ... #OpenVINO/ONNX/PyTorch/TF object

quantized_model = nncf.quantize(model, calibration_dataset)

3.(可選)準確性控制模式,如果發(fā)現(xiàn) NNCF 在默認模式下的導(dǎo)出的模型準確性下降超過預(yù)期,我們也可以使用準確性控制模式(accuracy control)完成訓(xùn)練后量化,此時我們需要加入帶標簽的測試集數(shù)據(jù),用來評估模型在量化過程中哪些 layer 對模型準確性損失的影響(敏感度)比較大,并作為排序依據(jù),依次將這些 layer 回退至原始精度,直到模型符合預(yù)期準確性表現(xiàn)。通過這個模式,我們可以在保證模型準確性的情況下,盡可能壓縮模型體積,實現(xiàn)性能和準確性之間的平衡。具體方法可以參考以下鏈接:

https://docs.openvino.ai/nightly/quantization_w_accuracy_control.html

04 Segment Anything + NNCF實戰(zhàn)

接下來讓我們具體一步步看下如何使用 NNCF 的 PTQ 模式完成 SAM encoder 的量化。

1.定義數(shù)據(jù)加載器

本示例使用 coco128 作為校驗數(shù)據(jù)集,其中包含 128 張 .jpg 格式的圖片。由于在量化 ONNX 或 IR 靜態(tài)模型的情況下,數(shù)據(jù)加載器必須是一個 torch 的 DataLoader 類,因此這里我們需要繼承 torch.utils.data.Dataset 并重新構(gòu)建一個數(shù)據(jù)集類,其中必須包含__getitem__方法,用于遍歷數(shù)據(jù)集中的每一個對象,__len__用于獲取數(shù)據(jù)集的對象數(shù)量,最后再通過 torch.utils.data.DataLoader 方法生成數(shù)據(jù)加載器。

classCOCOLoader(data.Dataset):

def__init__(self, images_path):

self.images =list(Path(images_path).iterdir())

def__getitem__(self, index):

image_path =self.images[index]

image =cv2.imread(str(image_path))

image =cv2.cvtColor(image, cv2.COLOR_BGR2RGB)

returnimage

def__len__(self):

returnlen(self.images)

coco_dataset =COCOLoader(OUT_DIR /'coco128/images/train2017')

calibration_loader =torch.utils.data.DataLoader(coco_dataset)

2.定義數(shù)據(jù)格式轉(zhuǎn)化模塊

下一步是定義數(shù)據(jù)轉(zhuǎn)化模塊,我們可以調(diào)用之前定義 preprocess_image 函數(shù)完成數(shù)據(jù)的預(yù)處理,值得注意的是由于 calibration_loader 模塊返回的單個數(shù)據(jù)對象為 torch tensor 類型 ,而 OpenVINO 的 Python 接口不支持該類型數(shù)據(jù),我們需要先將其強制轉(zhuǎn)化為 numpy 格式。

deftransform_fn(image_data):

image=image_data.numpy()

processed_image=preprocess_image(np.squeeze(image))

returnprocessed_image

calibration_dataset=nncf.Dataset(calibration_loader,transform_fn)

3.運行 NNCF 量化

為了確保量化后的模型準確性,這里我們使用原始的 FP32 ONNX 格式模型作為輸入對象,而不是 FP16 的 IR 格式模型,然后再將該對象送入 nncf.quantize 接口執(zhí)行量化,該函數(shù)接口中有幾個比較重要的額外參數(shù):

# Load FP32 ONNX model

model=core.read_model(onnx_encoder_path)

quantized_model=nncf.quantize(model,

calibration_dataset,

model_type=nncf.parameters.ModelType.TRANSFORMER,

preset=nncf.common.quantization.structs.QuantizationPreset.MIXED)

ov_encoder_path_int8="sam_image_encoder_int8.xml"

serialize(quantized_model,ov_encoder_path_int8)

model_type:模型類別,用于開啟特殊的量化策略,例如在類 Transformer 模型中,我們需要優(yōu)先保證模型的準確性。

preset:量化模式,默認為 PERFORMANCE,使用對卷積的權(quán)重和偏置均采用對稱量化算法,有助于提升模型性能,此處為了提升模型準確性,我們采用 MIXED 模式,采用權(quán)重對稱量化,偏置非對稱量化的方法,適合模型中包含非 Relu 或者非對稱的激活層。

由于 SAM encoder 模型的網(wǎng)絡(luò)結(jié)構(gòu)比較復(fù)雜,而量化過程中我們需要多次遍歷模型每一個 layer 的參數(shù),所以量化耗時相對會長一些,請大家耐心等待。這邊建議使用 32G 以上內(nèi)存的硬件設(shè)備,如果遇到內(nèi)存不夠的情況,可以通過 subset_size=100 參數(shù),適當降低校驗數(shù)據(jù)數(shù)量。

4.模型準確性比較

接下來我們比較下 INT8 和 FP16 模型的推理結(jié)果:

b8988dbe-0c20-11ee-962d-dac502259ad0.png

圖:prompt 模式 FP16 – INT8 結(jié)果比較

b8e36906-0c20-11ee-962d-dac502259ad0.png

圖:auto 模式 FP16 – INT8 結(jié)果比較

可以看到在 prompt 和 auto 模式下,INT8 模型的準確性相較 FP16 模型,幾乎沒有任何變化。

注:auto 模式下,mask 將使用隨機生成的顏色。

5.性能比較

最后我們通過 OpenVINO 自帶的 benchmark_app 工具比較下性能指標:

b92ab662-0c20-11ee-962d-dac502259ad0.png

圖:Benchmark 結(jié)果 (FP16)

b93dcfc2-0c20-11ee-962d-dac502259ad0.png

圖:Benchmark 結(jié)果 (INT8)

可以看到在 CPU 端,INT8 模型相較 FP16 提升了大約 30%, 體積從原本的 350MB 壓縮到了 100MB 不到。

05 總結(jié)

鑒于 SAM 出色的自動化分割能力,相信未來會有越來越多應(yīng)用場景會部署這項技術(shù),而在產(chǎn)業(yè)化落地的過程中,開發(fā)者往往最關(guān)注的就是性能和準確性之間的平衡,以此獲取成本更優(yōu)的方案。OpenVINO NNCF 工具通過對 Segment Anything encoder 部分的量化壓縮,在幾乎沒有影響模型準確性的情況下,顯著提升模型的運行效率,降低模型占用空間。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 編碼器
    +關(guān)注

    關(guān)注

    44

    文章

    3529

    瀏覽量

    133316
  • 人工智能
    +關(guān)注

    關(guān)注

    1787

    文章

    46062

    瀏覽量

    235082
  • SAM
    SAM
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    33452
  • 類加載器
    +關(guān)注

    關(guān)注

    0

    文章

    6

    瀏覽量

    918

原文標題:開發(fā)者實戰(zhàn) | 分割一切?Segment Anything量化加速實戰(zhàn)

文章出處:【微信號:SDNLAB,微信公眾號:SDNLAB】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    一切從游戲開始_python

    一切從游戲開始_python
    發(fā)表于 03-19 11:23 ?7次下載

    芯片緊缺,正在影響一切硬件

    芯片緊缺,正在影響一切硬件,大到汽車,小到產(chǎn)線上的每個充電器、藍牙耳機。
    的頭像 發(fā)表于 12-29 14:22 ?4519次閱讀

    FemtoFET MOSFETs:沙粒般渺小,一切盡在間距

    FemtoFET MOSFETs:沙粒般渺小,一切盡在間距
    發(fā)表于 11-02 08:16 ?0次下載
    FemtoFET MOSFETs:沙粒般渺小,<b class='flag-5'>一切</b>盡在間距

    在使用負載開關(guān)時,時序決定一切!

    在使用負載開關(guān)時,時序決定一切!
    發(fā)表于 11-03 08:04 ?0次下載
    在使用負載開關(guān)時,時序決定<b class='flag-5'>一切</b>!

    定時決定一切:抖動技術(shù)規(guī)范

    定時決定一切:抖動技術(shù)規(guī)范
    發(fā)表于 11-04 09:52 ?0次下載
    定時決定<b class='flag-5'>一切</b>:抖動技術(shù)規(guī)范

    定時決定一切:如何使用部分 PLL 創(chuàng)建調(diào)制波形

    定時決定一切:如何使用部分 PLL 創(chuàng)建調(diào)制波形
    發(fā)表于 11-04 09:52 ?0次下載
    定時決定<b class='flag-5'>一切</b>:如何使用部分 PLL 創(chuàng)建調(diào)制波形

    AI分割一切——用OpenVINO?加速Meta SAM大模型

    物體分割是計算機視覺中的核心任務(wù)之,旨在識別圖像中屬于特定對象的像素。通常實現(xiàn)圖像分割的方法有兩種,即交互式分割和自動分割。交互式
    的頭像 發(fā)表于 04-23 11:16 ?1105次閱讀
    AI<b class='flag-5'>分割</b><b class='flag-5'>一切</b>——用OpenVINO?<b class='flag-5'>加速</b>Meta SAM大模型

    海爾智家:一切皆為用戶體驗!

    一切從用戶需求出發(fā),一切為了用戶的智慧家庭生活體驗。
    的頭像 發(fā)表于 04-25 13:35 ?479次閱讀

    通用AI大模型Segment Anything在醫(yī)學(xué)影像分割的性能究竟如何?

    為了全面評估分析SAM在醫(yī)學(xué)影像分割上的表現(xiàn),團隊收集并標準化了52個公共數(shù)據(jù)集,最終整理構(gòu)建了個包含16種影像模態(tài)和68種生物醫(yī)學(xué)領(lǐng)域分割目標(表1)的大型醫(yī)學(xué)影像分割數(shù)據(jù)集COS
    的頭像 發(fā)表于 05-06 09:57 ?1517次閱讀
    通用AI大模型<b class='flag-5'>Segment</b> <b class='flag-5'>Anything</b>在醫(yī)學(xué)影像<b class='flag-5'>分割</b>的性能究竟如何?

    AI+制造業(yè):機器視覺開啟掘金新大陸

    4月6日,Meta官方博客宣布推出新AI模型 Segment Anything Model(SAM)分割一切模型,提出能夠?qū)θ魏螆D像或視頻中的任何物體進行識別、圖像
    的頭像 發(fā)表于 05-15 16:32 ?1258次閱讀
    AI+制造業(yè):機器視覺開啟掘金新大陸

    近期分割大模型發(fā)展情況

    SAM(Segment Anything Model)Meta 的 FAIR 實驗室發(fā)布的種最先進的圖像分割模型,該模型將自然語言處理領(lǐng)域的prompt范式引入計算機視覺領(lǐng)域,可以通
    的頭像 發(fā)表于 05-22 16:26 ?756次閱讀
    近期<b class='flag-5'>分割</b>大模型發(fā)展情況

    Segment Anything量化加速有多強!

    分割一切,大家起失業(yè)!”——近期,這樣句話在社交媒體上大火!這講的就是 Segment Anythi
    的頭像 發(fā)表于 06-11 14:24 ?965次閱讀
    <b class='flag-5'>Segment</b> <b class='flag-5'>Anything</b><b class='flag-5'>量化</b><b class='flag-5'>加速</b>有多強!

    YOLOv8最新版本支持SAM分割一切

    分割任何模型 (Segment Anything Model - SAM) 是種突破性的圖像分割模型,可實現(xiàn)具有實時性能的快速
    的頭像 發(fā)表于 06-18 11:42 ?1476次閱讀
    YOLOv8最新版本支持SAM<b class='flag-5'>分割</b><b class='flag-5'>一切</b>

    中科院提出FastSAM快速分割一切模型!比Meta原版提速50倍!

    通過將分割?任務(wù)重新劃分為全實例分割和提?指導(dǎo)選擇兩個?任務(wù),?帶實例分割分?的常規(guī) CNN 檢測器以?出50倍的運?速度實現(xiàn)了與SAM?法相當?shù)男阅?,?個實時
    的頭像 發(fā)表于 06-28 14:33 ?1470次閱讀
    中科院提出FastSAM快速<b class='flag-5'>分割</b><b class='flag-5'>一切</b>模型!比Meta原版提速50倍!

    文件系統(tǒng)-一切皆文件的設(shè)計理念

    所謂一切皆文件就是指計算機操作系統(tǒng)將一切計算機的可用資源都映射成文件形式向使用者提供統(tǒng)的操作方式。
    的頭像 發(fā)表于 10-11 10:10 ?413次閱讀