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

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

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

Segment Anything量化加速有多強(qiáng)!

英特爾物聯(lián)網(wǎng) ? 來源:OpenVINO 中文社區(qū) ? 2023-06-11 14:24 ? 次閱讀

前言

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

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

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

66ebdbbc-05f2-11ee-962d-dac502259ad0.png

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

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

01

量化介紹

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

673320bc-05f2-11ee-962d-dac502259ad0.png

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

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

67543ebe-05f2-11ee-962d-dac502259ad0.png

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

02

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

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

1. 準(zhǔn)備校驗(yàn)數(shù)據(jù)集

這里的校驗(yàn)數(shù)據(jù)僅用作量化過程中對數(shù)據(jù)表示范圍與分布的計算,因此不需要額外的標(biāo)簽數(shù)據(jù),例如在圖像識別任務(wù)中,我們僅需要送入 200-300 張左右的圖片文件即可。此外我們還需要定義 DataLoader 對象與 transform_fn 數(shù)據(jù)轉(zhuǎn)換函數(shù), DataLoader 用于讀取校驗(yàn)數(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. 運(yùn)行模型量化

首先需要導(dǎo)入模型對象,然后通過 nncf.quantize() 接口,將模型對象與校驗(yàn)數(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.(可選)準(zhǔn)確性控制模式

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

04

Segment Anything + NNCF 實(shí)戰(zhàn)

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

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

本示例使用 coco128 作為校驗(yàn)數(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ù)加載器。

class COCOLoader(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)
    return image
  
  def __len__(self):
    return len(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ù),我們需要先將其強(qiáng)制轉(zhuǎn)化為 numpy 格式。

def transform_fn(image_data):
  image = image_data.numpy()
  processed_image = preprocess_image(np.squeeze(image))
  return processed_image


calibration_dataset = nncf.Dataset(calibration_loader, transform_fn)

向右滑動查看完整代碼

3. 運(yùn)行 NNCF 量化

為了確保量化后的模型準(zhǔn)確性,這里我們使用原始的 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)先保證模型的準(zhǔn)確性。

preset量化模式,默認(rèn)為 PERFORMANCE,使用對卷積的權(quán)重和偏置均采用對稱量化算法,有助于提升模型性能,此處為了提升模型準(zhǔ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ù),適當(dāng)降低校驗(yàn)數(shù)據(jù)數(shù)量。

4. 模型準(zhǔn)確性比較

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

67cee254-05f2-11ee-962d-dac502259ad0.png6813cb08-05f2-11ee-962d-dac502259ad0.png

左右滑動查看 prompt 模式 FP16 – INT8 結(jié)果比較

6851442e-05f2-11ee-962d-dac502259ad0.jpg6872bcda-05f2-11ee-962d-dac502259ad0.jpg

左右滑動查看 auto 模式 FP16 – INT8 結(jié)果比較

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

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

5. 性能比較

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

[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:      60 iterations
[ INFO ] Duration:     75716.93 ms
[ INFO ] Latency:
[ INFO ]  Median:    14832.33 ms
[ INFO ]  Average:    14780.77 ms
[ INFO ]  Min:      10398.47 ms
[ INFO ]  Max:      16725.65 ms
[ INFO ] Throughput:  0.79 FPS

Benchmark結(jié)果(FP16)

[ INFO ] Execution Devices:['CPU']
[ INFO ] Count:      72 iterations
[ INFO ] Duration:     68936.14 ms
[ INFO ] Latency:
[ INFO ]  Median:    11281.87 ms
[ INFO ]  Average:    11162.87 ms
[ INFO ]  Min:      6736.09 ms
[ INFO ]  Max:      12547.48 ms
[ INFO ] Throughput:  1.04 FPS

Benchmark 結(jié)果 (INT8)

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

05

總結(jié)

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




審核編輯:劉清

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

    關(guān)注

    44

    文章

    3553

    瀏覽量

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

    關(guān)注

    1789

    文章

    46354

    瀏覽量

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

    關(guān)注

    0

    文章

    111

    瀏覽量

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

    關(guān)注

    0

    文章

    6

    瀏覽量

    920

原文標(biāo)題:分割一切?Segment Anything量化加速有多強(qiáng)!

文章出處:【微信號:英特爾物聯(lián)網(wǎng),微信公眾號:英特爾物聯(lián)網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    5G輕量化網(wǎng)關(guān)是什么

    5G輕量化網(wǎng)關(guān):物聯(lián)網(wǎng)的新引擎 隨著5G技術(shù)的不斷發(fā)展和普及,物聯(lián)網(wǎng)(IoT)領(lǐng)域迎來了新的變革。5G輕量化網(wǎng)關(guān),作為這一變革中的關(guān)鍵角色,正逐漸成為連接人、機(jī)、物的重要橋梁。本文將深入探討5G
    的頭像 發(fā)表于 09-04 15:17 ?207次閱讀
    5G輕<b class='flag-5'>量化</b>網(wǎng)關(guān)是什么

    深度神經(jīng)網(wǎng)絡(luò)模型量化的基本方法

    深度神經(jīng)網(wǎng)絡(luò)模型量化是深度學(xué)習(xí)領(lǐng)域中的一種重要優(yōu)化技術(shù),旨在通過減少模型參數(shù)的精度(即從高精度浮點(diǎn)數(shù)如32位浮點(diǎn)數(shù)FP32降低到低精度整數(shù)如8位整數(shù)INT8或更低)來降低模型的計算和存儲需求,同時
    的頭像 發(fā)表于 07-15 11:26 ?526次閱讀

    深度學(xué)習(xí)模型量化方法

    深度學(xué)習(xí)模型量化是一種重要的模型輕量化技術(shù),旨在通過減少網(wǎng)絡(luò)參數(shù)的比特寬度來減小模型大小和加速推理過程,同時盡量保持模型性能。從而達(dá)到把模型部署到邊緣或者低算力設(shè)備上,實(shí)現(xiàn)降本增效的目標(biāo)。
    的頭像 發(fā)表于 07-15 11:01 ?413次閱讀
    深度學(xué)習(xí)模型<b class='flag-5'>量化</b>方法

    存內(nèi)計算技術(shù)工具鏈——量化

    本篇文章將重點(diǎn)講述存內(nèi)計算技術(shù)工具鏈之“量化”,我們將從面向存內(nèi)計算芯片的深度學(xué)習(xí)編譯工具鏈、神經(jīng)網(wǎng)絡(luò)中的量化(包括訓(xùn)練后量化量化感知訓(xùn)練)、基于存內(nèi)計算芯片硬件特性的
    的頭像 發(fā)表于 05-16 12:35 ?1012次閱讀
    存內(nèi)計算技術(shù)工具鏈——<b class='flag-5'>量化</b>篇

    Keil5提示__segment_end未定義是哪里的問題?

    編譯后的錯誤信息如下: .ObjectsGD_LiteOSTest.axf: Error: L6218E: Undefined symbol __segment_end (referred
    發(fā)表于 04-03 07:10

    超級電容的環(huán)保性、壽命、充電速度有多強(qiáng)?

    超級電容的環(huán)保性、壽命、充電速度有多強(qiáng)? 超級電容是一種具有極高能量密度和電荷/放電速度的電子設(shè)備,它在環(huán)保性、壽命和充電速度方面都具有令人印象深刻的優(yōu)勢。在本篇文章中,我們將詳細(xì)探討超級電容在這
    的頭像 發(fā)表于 02-02 10:19 ?731次閱讀

    低比特量化技術(shù)如何幫助LLM提升性能

    針對大語言模型 (LLM) 在部署過程中的性能需求,低比特量化技術(shù)一直是優(yōu)化效果最佳的方案之一,本文將探討低比特量化技術(shù)如何幫助 LLM 提升性能,以及新版 OpenVINO 對于低比特量化技術(shù)的支持。
    的頭像 發(fā)表于 12-08 15:26 ?1011次閱讀
    低比特<b class='flag-5'>量化</b>技術(shù)如何幫助LLM提升性能

    5G RedCap規(guī)模商用在即!輕量化5G打開物聯(lián)網(wǎng)“中間市場”

    ,要打造5G輕量化完整產(chǎn)業(yè)體系,實(shí)現(xiàn)新產(chǎn)品、新模式不斷涌現(xiàn),融合應(yīng)用規(guī)模上量,安全能力同步增強(qiáng)。這不僅吹響了5G輕量化(RedCap)技術(shù)規(guī)模商用的號角,也必將加速
    的頭像 發(fā)表于 12-01 14:00 ?499次閱讀
    5G RedCap規(guī)模商用在即!輕<b class='flag-5'>量化</b>5G打開物聯(lián)網(wǎng)“中間市場”

    解讀大模型FP量化的解決方案

    在 LLaMA, BERT 以及 ViTs 模型上,4-bit 量化皆取得了遠(yuǎn)超 SOTA 的結(jié)果。特別是,這篇文章展示了 4-bit 量化的 LLaMA-13B 模型,在零樣本推理任務(wù)上達(dá)到平均
    發(fā)表于 11-24 11:15 ?837次閱讀
    解讀大模型FP<b class='flag-5'>量化</b>的解決方案

    Yolo系列模型的部署、精度對齊與int8量化加速

    在基于PytorchQuantization導(dǎo)出的含有QDQ節(jié)點(diǎn)的onnx時,我們發(fā)現(xiàn)盡管量化版本的torch模型精度很高,但是在TensorRT部署時精度卻很低,TRT部署收精度損失很嚴(yán)重,通過
    的頭像 發(fā)表于 11-23 16:40 ?1110次閱讀

    ADC的量化噪音如何考慮?

    ADC的量化噪音如何考慮? ADC(模數(shù)轉(zhuǎn)換器)是將模擬信號轉(zhuǎn)換成數(shù)字信號的設(shè)備。在轉(zhuǎn)換過程中,由于各種不確定性的影響,ADC會引入一定的量化噪音。這篇文章將詳細(xì)討論ADC的量化噪音及其影響。 首先
    的頭像 發(fā)表于 11-09 09:50 ?919次閱讀

    基于紫光同創(chuàng)FPGA的多路視頻采集與AI輕量化加速的實(shí)時目標(biāo)檢測系統(tǒng)

    基于紫光同創(chuàng)FPGA的多路視頻采集與AI輕量化加速的實(shí)時目標(biāo)檢測系統(tǒng)#2023集創(chuàng)賽#紫光同創(chuàng)#小眼睛科技助力紫光同創(chuàng)高校生態(tài)建設(shè)@小眼睛科技 獲獎作品展示:華南理工大學(xué)+CR8_Pro隊
    發(fā)表于 11-02 17:51

    rt1052性能有多強(qiáng)?

    rt1052性能有多強(qiáng)
    發(fā)表于 10-27 06:17