Vitis AI - 量化流程詳解

目錄

1. 簡介

2. 具體流程

2.1 校準激活

2.2?量化感知訓練

2.3?量化校準配置

2.4?quantization 函數

3. 總結


1. 簡介

想象一下,你有一個非常聰明的機器人朋友,它可以幫你做很多事情,比如預測天氣。但是,這個機器人的大腦(我們可以把它想象成一個神經網絡模型)需要很多能量和空間來思考(也就是進行計算和存儲數據)。現在,如果我們想讓這個機器人更小巧,更省電,還能快速做出預測,我們就需要采用一些特殂的技巧。

這時,Vitis AI 量化器就像一個魔法工具,它可以幫助機器人的大腦變得更高效。原來,機器人的大腦用一種非常詳細(32位浮點)的方式來記住信息,這種方式雖然精確,但是需要很多空間和能量。Vitis AI 量化器通過一種叫做“量化”的魔法,把這些詳細的信息轉換成更簡單(8位整數)的形式。這樣做雖然會讓信息變得不那么精確,但是我們可以通過一些技巧,讓機器人的預測能力幾乎不受影響。

這個魔法包括幾個步驟:

  • 自定義操作檢查:先檢查一下機器人的大腦里是否有些特殊的思考方式是我們需要特別注意的。
  • 量化:用魔法把復雜的信息變成簡單的形式。
  • 校準:調整一下這個簡化后的大腦,確保它還能準確地做出預測。
  • 微調:進一步調整和優化,讓機器人的大腦運行得更順暢。
  • 模型轉換:最后,把這個優化后的大腦轉換成一種特殊的格式,這樣它就可以更容易地被部署到不同的地方,比如小巧的設備上。

通過這個過程,機器人的大腦變得更小,更省電,而且還能快速做出準確的預測。這樣,我們就可以把這個聰明的機器人帶到更多的地方去,讓它幫助更多的人。

2. 具體流程

2.1 校準激活

當我們談論“校準激活”這個過程時,我們實際上在討論的是一個將神經網絡模型調整為更高效版本的關鍵步驟,這一步驟是在所謂的后訓練量化過程中進行的。讓我們一步一步地詳細解釋這個過程:

  • 選擇數據樣本

首先,我們需要從原始的訓練數據中挑選出一個子集。這個子集不需要很大,通常包含100到1000個樣本,而且不需要樣本的標簽(即我們不需要知道這些數據的正確答案是什么)。這個子集的目的是幫助我們理解模型在處理不同數據時的行為模式。

  • 前向傳播

接下來,我們將這個數據子集通過神經網絡進行前向傳播。前向傳播簡單來說,就是讓數據通過網絡的每一層,從輸入層開始,一直到輸出層。在這個過程中,網絡的每一層都會對數據進行一些計算和轉換,這些轉換是由該層的權重(即該層學習到的參數)和激活函數(一種特定的數學函數,用于決定神經元是否應該被激活)控制的。

  • 分析激活分布

當數據通過網絡前向傳播時,我們會分析網絡中每一層的“激活分布”。激活分布基本上是指,在數據通過網絡層時,神經元輸出值的分布情況。這是非常重要的信息,因為它可以幫助我們了解數據是如何在網絡中流動的,以及每一層是如何對數據進行處理的。

  • 量化權重和激活

一旦我們有了關于激活分布的信息,我們就可以開始將權重和激活值從32位浮點數轉換為8位整數值。這個過程稱為量化。通過量化,我們可以顯著減小模型的大小和計算需求,同時盡量保持模型的預測準確性不變。

2.2?量化感知訓練

QAT(Quantization-Aware Training,量化感知訓練)是一種特殊的神經網絡訓練方法,它在訓練過程中就考慮到了模型最終會被量化(即權重和激活值會被轉換成較低精度格式,如8位整數)的事實。通過這種方式,QAT旨在訓練出一個在量化后仍能保持高性能的模型。

QAT的工作原理

  1. 在傳統的訓練過程中,模型通常在浮點數(如32位浮點數)環境下進行訓練和優化。然而,當模型被量化(為了部署在資源受限的設備上)時,模型的性能可能會因為精度損失而下降。為了緩解這個問題,QAT采用了一種在訓練過程中就模擬量化效果的方法。
  2. 模擬量化:在訓練過程中,QAT通過在前向傳播和反向傳播時模擬權重和激活值的量化效果,使模型“意識到”其將在低精度環境中運行。這意味著模型的訓練不僅要考慮如何最小化誤差,還要學會在量化帶來的限制條件下保持性能。
  3. 微調和優化:通過這種訓練方式,模型可以在量化的約束下學習到更魯棒的特征表示。此外,訓練過程中還可以對量化操作進行微調和優化,比如調整量化參數(比如量化的比例因子),以進一步減小量化帶來的誤差。
  4. 減少性能損失:最終,通過QAT訓練的模型在被量化到低精度格式后,其性能損失會比傳統訓練后直接量化的模型小很多。這意味著可以在保持較高預測精度的同時,享受量化帶來的好處(如模型尺寸更小,推理速度更快,功耗更低)。

QAT的優勢

  1. 高效的模型部署:通過QAT,可以更有效地將深度學習模型部署到資源受限的硬件上,如移動設備、嵌入式系統等。
  2. 性能和精度的平衡:QAT提供了一種有效的方法來平衡模型的性能和精度,使得在量化后的模型仍能保持接近其原始浮點數模型的預測精度。
  3. 加速推理過程:由于量化后的模型有更小的模型尺寸和更快的推理速度,QAT有助于加速模型的推理過程,使其更適合實時應用場景。

2.3?量化校準配置

量化校準配置文件的目錄在?config_file = "./configs/mix_precision_config.json"

配置名解釋選項
convert_relu6_to_relu是否將ReLU6轉換為ReLUtrue、false
include_cle是否使用跨層均衡(cross layer equalization)true、false
include_bias_corr是否使用偏差校正true、false
keep_first_last_layer_accuracy是否跳過對第一層和最后一層進行量化(未啟用)FALSE
keep_add_layer_accuracy是否跳過對"add"層進行量化(未啟用)FALSE
target_device部署量化模型的設備DPU、CPU、GPU
quantizable_data_type模型中要進行量化的張量類型 
datatype用于量化的數據類型int、bfloat16、float16、float32
   
bit_width用于量化的比特寬度 
method用于校準量化的方法maxmin、percentile、entropy、mse、diffs
round_mode量化過程中的舍入方法half_even、half_up、half_down、std_round
symmetry是否使用對稱量化true、false
per_channel是否使用通道級別的量化true、false
signed是否使用有符號量化true、false
narrow_range是否對有符號量化使用對稱整數范圍true、false
scale_type量化過程中使用的尺度類型float、poweroftwo
calib_statistic_method如果使用多批次數據獲得不同的尺度,用于選擇一個最優尺度的方法modal、max、mean、median

2.4?quantization 函數

使用PyTorch框架和Xilinx Vitis AI量化工具(通過pytorch_nndct模塊)的一個示例:

# 創建量化器對象,并獲取量化模型
from pytorch_nndct.apis import torch_quantizer
quantizer = torch_quantizer(quant_mode, model, (dummy_input), device=device, quant_config_file=config_file, target=target)
quant_model = quantizer.quant_modelloss_fn = torch.nn.CrossEntropyLoss().to(device)
val_loader, _ = load_data(…)if finetune == True:ft_loader, _ = load_data(…)if quant_mode == 'calib':quantizer.fast_finetune(evaluate, (quant_model, ft_loader, loss_fn))elif quant_mode == 'test':quantizer.load_ft_param()acc1_gen, acc5_gen, loss_gen = evaluate(quant_model, val_loader, loss_fn)if quant_mode == 'calib':quantizer.export_quant_config()
if deploy:quantizer.export_torch_script()quantizer.export_onnx_model()quantizer.export_xmodel()

?代碼的主要功能和步驟包括:

  1. 創建量化器對象:使用torch_quantizer函數創建一個量化器對象,這個對象用于管理模型的量化過程。這里需要指定量化模式(quant_mode),可以是calib(校函量化模式)或test(測試量化模型性能模式),模型本身,一個虛擬輸入(dummy_input)用于模型推理,以及其他配置如設備(device),量化配置文件(quant_config_file)和目標平臺(target)。
  2. 獲取量化模型:通過量化器對象的quant_model屬性獲取量化后的模型。這個模型將用于后續的校準、微調和評估。
  3. 加載數據:加載驗證數據集(val_loader),如果需要微調(finetune為True),也會加載微調數據集(ft_loader)。
  4. 微調和校準:如果設置了微調,根據量化模式執行相應的操作。在calib模式下,使用fast_finetune方法進行快速微調,以優化模型的量化參數;在test模式下,使用load_ft_param方法加載已經微調過的參數。
  5. 評估量化模型性能:使用evaluate函數評估量化模型在驗證數據集上的性能,包括準確率(acc1_gen和acc5_gen)和損失(loss_gen)。
  6. 導出量化配置和模型:如果是calib模式,使用export_quant_config方法導出量化配置。此外,如果設置了部署(deploy為True),則會導出用于部署的模型,包括Torch Script(export_torch_script)、ONNX模型(export_onnx_model)和Xilinx特定的xmodel(export_xmodel)。

3. 總結

在當今技術快速發展的時代,我們追求的不僅是智能設備的高性能,同時也強調其能效和便攜性。Vitis AI量化器便是在這樣的背景下應運而生的一個工具,它通過將神經網絡模型的數據精度從32位浮點數降低到8位整數,極大地縮減了模型的體積和計算需求,而通過精心設計的校準和微調過程,又能確保模型的預測準確性基本不受影響。這一過程不僅包括了校準激活、量化感知訓練等關鍵步驟,還提供了詳細的量化校準配置和實用的量化函數,以適應不同的部署需求。通過這種方式,Vitis AI量化器使得深度學習模型能夠更加輕松地被部署到資源受限的設備上,無論是在移動設備、嵌入式系統還是其他平臺,都能夠實現快速、高效的智能計算,為用戶帶來更加豐富和流暢的體驗。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38929.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38929.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38929.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

01 數據采集層 流量分發第一步規范采集海量數據

《易經》:“初九:潛龍勿用”。潛龍的意思是隱藏,陽氣潛藏,陽爻位于最下方稱為“初九”,龍潛于淵,是學而未成的階段,此時需要打好基礎。 而模塊一我們就是講解推薦系統有關的概念、基礎數據體系…

基于SpringBoot+Vue商戶點評管理與數據分析系統設計和實現(源碼+LW+調試文檔+講解等)

💗博主介紹:?全網粉絲10W,CSDN作者、博客專家、全棧領域優質創作者,博客之星、平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰?💗 Java精品實戰案例《1000套》 2025-2026年最值得選擇的Java畢業設計選題大全&#xff…

使用 Vanna 生成準確的 SQL 查詢:工作原理和性能分析

Vanna工作原理 從本質上講,Vanna 是一個 Python 包,它使用檢索增強功能來幫助您使用 LLM 為數據庫生成準確的 SQL 查詢。 Vanna 的工作分為兩個簡單的步驟 - 在您的數據上訓練 RAG“模型”,然后提出問題,這些問題將返回可設置為在您的數據庫上自動運行的 SQL 查詢。 vn.t…

【后端面試題】【中間件】【NoSQL】MongoDB提高可用性的方案(主從結構、仲裁節點、分片、寫入語義)

主從結構 MongoDB的高可用和別的中間件的高可用方案基本類似。比如在MySQL里,接觸了分庫分表和主從同步;在Redis里,Redis也有主從結構;在Kafka里,分區也是有主從結構的。 所以先介紹啟用了主從同步 我們的系統有一個關…

基于Java的微信記賬小程序【附源碼】

摘 要 隨著我國經濟迅速發展,人們對手機的需求越來越大,各種手機軟件也都在被廣泛應用,但是對于手機進行數據信息管理,對于手機的各種軟件也是備受用戶的喜愛,記賬微信小程序被用戶普遍使用,為方便用戶能夠…

算法題中常用的C++功能

文章目錄 集合優先隊列雙端隊列排序時自定義比較函數最大數值字符串追加:刪除:子串: 元組vector查找創建和初始化賦值: 字典map引入頭文件定義和初始化插入元素訪問元素更新元素刪除元素檢查元素存在遍歷元素int和string轉換 集合…

Ubuntu20.04更新GLIBC到2.35版本

目錄 1 背景2 增加源2.1 標準源2.2 鏡像源 3 更新 1 背景 Ubuntu20.04默認GLIBC庫版本是2.31.今天碰到一個軟件需要2.35版本的GLIBC。 升級GLIBC庫有兩種方式: 下載高版本庫源碼,編譯后替換系統中低版本庫。由于GLIBC庫是Linux系統中最基礎庫&#xff…

你想活出怎樣的人生?

hi~好久不見,距離上次發文隔了有段時間了,這段時間,我是裸辭去感受了一下前端市場的水深火熱,那么這次咱們不聊技術,就說一說最近這段時間的經歷和一些感觸吧。 先說一下自己的個人情況,目前做前端四年&am…

深圳技術大學oj C : 生成r子集

Description 輸出給定序列按字典序的 � 組合,按照所有 � 個元素出現與否的 01 標記串 ����?1,...,�1 的字典序輸出. 此處01串的字典序指:先輸入的數字對應低位&#x…

移動智能終端數據安全管理方案

隨著信息技術的飛速發展,移動設備已成為企業日常運營不可或缺的工具。特別是隨著智能手機和平板電腦等移動設備的普及,這些設備存儲了大量的個人和敏感數據,如銀行信息、電子郵件等。員工通過智能手機和平板電腦訪問企業資源,提高…

【HICE】web服務搭建3

端口號的不同進行監聽 1.下載httpd協議&#xff1a;dnf install httpd -y 2.編輯vhost.conf cd /etc/httpd cd /conf.d [rootlocalhost conf.d]# cat 1.conf listen 9090 listen 9091 listen 9092 <directory /www> allowoverride none require all granted </d…

【機器學習】Datawhale-AI夏令營分子性質AI預測挑戰賽

參賽鏈接&#xff1a;零基礎入門 Ai 數據挖掘競賽-速通 Baseline - 飛槳AI Studio星河社區 一、賽事背景 在當今科技日新月異的時代&#xff0c;人工智能&#xff08;AI&#xff09;技術正以前所未有的深度和廣度滲透到科研領域&#xff0c;特別是在化學及藥物研發中展現出了巨…

SpringBoot+Vue集成AOP系統日志

新建logs表 添加aop依賴 <!-- aop依賴--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency> 新建獲取ip地址工具類 import javax.servlet.http.H…

React 函數式組件里面有生命周期嗎?沒有怎么辦?

React 函數式組件沒有像類組件那樣傳統的生命周期方法&#xff0c;但是通過 React Hooks&#xff0c;可以在函數式組件中實現類似的生命周期行為。 useEffect: 可以看作是類組件里的 componentDidMount, componentDidUpdate 和 componentWillUnmount 的結合體。它允許你在函數組…

在Linux環境下使用sqlite3時,如果嘗試對一個空表進行操作(例如插入數據),可能會遇到表被鎖定的問題。

在Linux環境下使用sqlite3時&#xff0c;如果嘗試對一個空表進行操作&#xff08;例如插入數據&#xff09;&#xff0c;可能會遇到表被鎖定的問題。這通常是因為sqlite3在默認情況下會對空表進行“延遲創建”&#xff0c;即在實際需要寫入數據之前&#xff0c;表不會被真正創建…

React Native V0.74 — 穩定版已發布

嗨,React Native開發者們, React Native 世界中令人興奮的消息是,V0.74剛剛在幾天前發布,有超過 1600 次提交。亮點如下: Yoga 3.0New Architecture: Bridgeless by DefaultNew Architecture: Batched onLayout UpdatesYarn 3 for New Projects讓我們深入了解每一個新亮點…

java 利用 gdal 生成遙感tif的縮略圖

簡要說明 在java&#xff0c;簡單使用gdal生成tif文件的縮略圖 maven依賴 <!--需要安裝完gdal后&#xff0c;本地install gdal包才能使用 --><!--gdal安裝可參考 https://blog.csdn.net/qq_41613913/article/details/135743562 --><dependency><groupI…

Docker精華篇 - 常用命令大全,入門到精通!

大家好,我是CodeQi! 我們都知道 Docker 的重要性,以及 Docker 如何在軟件開發生命周期中發揮重要作用 。 說實話,學習 Docker 很有趣,至少在我看來是這樣。 一旦掌握了基礎知識,這并不難。 困難的是記住所有這些命令。 因此,在這篇文章中,我收集了所有命令,或者更…

Patch embed 的映射矩陣多大?

假設我們有一個圖像&#xff0c;其大小為 (H \times W \times C)&#xff0c;其中 (H) 是圖像的高度&#xff0c;(W) 是圖像的寬度&#xff0c;(C) 是圖像的通道數&#xff08;例如&#xff0c;RGB 圖像的通道數為 3&#xff09;。 將圖像劃分成 patches: 假設我們將圖像劃分成…

命令可以不通過數據綁定進行配置

命令可以不通過數據綁定進行配置。在某些情況下&#xff0c;可能希望直接在代碼隱藏文件中處理命令邏輯&#xff0c;而不是通過數據綁定。以下是一個完整的例子&#xff0c;展示了如何在不使用數據綁定的情況下實現命令。 ### 1. 定義命令 首先&#xff0c;我們定義一個簡單的…