fp16是指采用2字節(jié)(16位)進(jìn)行編碼存儲(chǔ)的一種數(shù)據(jù)類型;
fp32是指采用4字節(jié)(32位);
fp16和fp32相比對(duì)訓(xùn)練的優(yōu)化:
- 1.內(nèi)存占用減少:應(yīng)用fp16內(nèi)存占用比原來更小,可以設(shè)置更大的batch_size
- 2.加速計(jì)算:加速計(jì)算只在最近的一些新gpu中,這一塊我還沒有體驗(yàn)到好處...有論文指出fp16訓(xùn)練速度可以是fp32的2-8倍
數(shù)據(jù)類型 |
取值范圍 |
float16 |
-65504 ~ 65504 |
float32 |
-2^31 ~ 2^31-1 |
int8 |
-2^7 ~ 2^7-1 (-128 ~ 127) |
uint8 |
0 ~ 2^8-1 (0~255) |
1.量化目的
????????在開發(fā)機(jī)器學(xué)習(xí)應(yīng)用程序時(shí),有效利用服務(wù)器端和設(shè)備上的計(jì)算資源非常重要。為了支持在服務(wù)器和邊緣設(shè)備上更高效的部署,對(duì)模型量化的支持將變的更加重要。
??量化利用8位整數(shù)(int8)指令來減小模型大小并更快地運(yùn)行推斷(減少延遲),并且可以是實(shí)現(xiàn)服務(wù)質(zhì)量目標(biāo)或甚至適合移動(dòng)設(shè)備上可用資源的模型之間的差異。即使在資源不太受限的情況下,它也可以使您部署更大、更準(zhǔn)確的模型。
????????量化主要是一種加快推理速度的技術(shù),并且只支持量化運(yùn)算符的前向傳遞。在深度學(xué)習(xí)中,量化指的是使用更少的bit來存儲(chǔ)原本以浮點(diǎn)數(shù)存儲(chǔ)的tensor,以及使用更少的bit來完成原本以浮點(diǎn)數(shù)完成的計(jì)算。
?
2.量化簡介
??量化主要是一種加速推理的技術(shù),量化運(yùn)算符僅支持前向傳遞。量化是指使用精度較低的數(shù)據(jù)進(jìn)行計(jì)算和內(nèi)存訪問的技術(shù),與浮點(diǎn)實(shí)現(xiàn)相比,通常是int8。
可以在幾個(gè)重要領(lǐng)域?qū)崿F(xiàn)性能提升:
????????模型尺寸縮小 4 倍;
????????內(nèi)存帶寬減少 2-4 倍;
由于內(nèi)存帶寬的節(jié)省和使用int8算法更快計(jì)算,推理速度提高了2-4倍。
??然而,量化并非沒有額外代價(jià)。從根本上說,量化意味著引入近似值,由此產(chǎn)生的網(wǎng)絡(luò)精度略低。這些技術(shù)試圖最小化完整浮點(diǎn)精度和量化精度之間的差距。????
3.量化方式
3.1 Dynamic Quantization - 動(dòng)態(tài)量化
??PyTorch支持的最簡單的量化方法稱為動(dòng)態(tài)量化。這不僅涉及將權(quán)重轉(zhuǎn)換為int8,而且還涉及在執(zhí)行計(jì)算之前將激活轉(zhuǎn)換為int 8(因此為“動(dòng)態(tài)”)。因此,將使用高效的int8矩陣乘法和卷積實(shí)現(xiàn)來執(zhí)行計(jì)算,從而實(shí)現(xiàn)更快的計(jì)算。然而,激活是以浮點(diǎn)格式讀取和寫入內(nèi)存的。
3.2 Post-Training Static Quantization - 訓(xùn)練后靜態(tài)量化
??通過將網(wǎng)絡(luò)轉(zhuǎn)換為同時(shí)使用整數(shù)算術(shù)和int8內(nèi)存訪問,可以進(jìn)一步提高性能(延遲)。靜態(tài)量化執(zhí)行額外的步驟,首先通過網(wǎng)絡(luò)輸入數(shù)據(jù)批,并計(jì)算不同激活的結(jié)果分布。該信息用于確定不同的激活應(yīng)該在推斷時(shí)量化的具體程度。重要的是,這一附加步驟允許我們?cè)诓僮髦g傳遞量化值,而不是在每個(gè)操作之間將這些值轉(zhuǎn)換為浮點(diǎn)值,然后再轉(zhuǎn)換為整數(shù),從而大大加快了速度。
3.3 Quantization Aware Training - 量化感知訓(xùn)練
??量化感知訓(xùn)練(QAT)是這三種方法中精度最高的一種。使用QAT,所有權(quán)重和激活在訓(xùn)練的前向和后向過程中都是“偽量化”的:也就是說,浮點(diǎn)值被舍入為模擬int8值,但所有計(jì)算仍然使用浮點(diǎn)數(shù)字完成。因此,訓(xùn)練期間的所有權(quán)重調(diào)整都是在“感知到”模型最終將被量化這一事實(shí)的情況下進(jìn)行的;因此,在量化之后,該方法通常比其他兩種方法產(chǎn)生更高的精度。
4.PTQ 和 QAT 簡介
????????依據(jù)是否要對(duì)量化后的參數(shù)進(jìn)行調(diào)整可將量化方法分為量化感知訓(xùn)練(QAT)和訓(xùn)練后量化(PTQ)。 這兩種方法的操作區(qū)別如下圖所示(圖左為QAT,圖右為PTQ):
????
量化感知訓(xùn)練 QAT 是將訓(xùn)練過的模型量化后又再進(jìn)行重訓(xùn)練。由于定點(diǎn)數(shù)值無法用于反向梯度計(jì)算,實(shí)際操作過程是在某些op前插入偽量化節(jié)點(diǎn)(fake quantization nodes), 用于在訓(xùn)練時(shí)獲取流經(jīng)該op的數(shù)據(jù)的截?cái)嘀?,便于在部署量化模型時(shí)對(duì)節(jié)點(diǎn)進(jìn)行量化時(shí)使用。我們需要在訓(xùn)練中通過不斷優(yōu)化精度來獲取最佳的量化參數(shù)。由于它需要對(duì)模型進(jìn)行訓(xùn)練, 對(duì)操作人員技術(shù)要求較高。
??訓(xùn)練后量化 PTQ 是使用一批校準(zhǔn)數(shù)據(jù)對(duì)訓(xùn)練好的模型進(jìn)行校準(zhǔn), 將訓(xùn)練過的FP32網(wǎng)絡(luò)直接轉(zhuǎn)換為定點(diǎn)計(jì)算的網(wǎng)絡(luò),過程中無需對(duì)原始模型進(jìn)行任何訓(xùn)練。只對(duì)幾個(gè)超參數(shù)調(diào)整就可完成量化過程, 且過程簡單快速, 無需訓(xùn)練, 因此此方法已被廣泛應(yīng)用于大量的端側(cè)和云側(cè)部署場景。
模型類型 |
首選方案 |
為什么 |
LSTM/RNN |
動(dòng)態(tài)量化 |
吞吐量由權(quán)重的計(jì)算/內(nèi)存帶寬決定 |
BERT/Transformer |
動(dòng)態(tài)量化 |
吞吐量由權(quán)重的計(jì)算/內(nèi)存帶寬決定 |
CNN |
靜態(tài)量化 |
吞吐量受激活的內(nèi)存帶寬限制 |
CNN |
量化感知訓(xùn)練文章來源:http://www.zghlxwxcb.cn/news/detail-568781.html |
在靜態(tài)量化無法達(dá)到精度的情況下文章來源地址http://www.zghlxwxcb.cn/news/detail-568781.html |
到了這里,關(guān)于深度學(xué)習(xí)模型量化、剪枝、壓縮的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!