前言:這篇部落格中涉及到的是網路在做int8 infer時候涉及到的量化方法,這裡並不涉及到int8訓練的東西,這篇文章涉及到的量化方法主要來自於:quantizing deep convolutional networks for efficient inference: a white*****。深度學習中網路的加速主要有如下的幾種方式:
在上面的方法中最簡單的方法就是降低模型運算過程中的bits數量,降低到16bits、8bits甚至2bits。這樣做具有如下的優點:
將範圍在(xm
in,x
max)
(x_,x_)
(xmin
,xma
x)之間的浮點數字對映到規定的範圍(0,
nlev
els−
1),n
leve
ls=256fo
r8bi
ts(0,n_-1),n_=256\ for\ 8\ bits
(0,nle
vels
−1)
,nle
vels
=25
6for
8bit
s。這是需要特殊指定兩個引數:對映步長比δ
\delta
δ(scale),對映的零點z
zz(zero-point),其中對映的零點是很關鍵的,以排除像0值padding對量化造成的錯誤。
對於單側的分布,浮點分布(xm
in,x
max)
(x_,x_)
(xmin
,xma
x)會被對映去包含0點。例如將範圍為(
2.1,
3.5)
(2.1,3.5)
(2.1,3
.5)對映到(0,
3.5)
(0,3.5)
(0,3.5
),這樣就可能會導致精度的損失。
在scale與zero-point確定之後,量化的正向運算可以描述為:
其中的cla
mpclamp
clam
p操作被描述為:
那麼對應的反向操作則是:
這個量化演算法將上面量化演算法中的零點直接設定為:z=0
z=0z=
0,從而方便了計算。因而前向的量化過程可以描述為:
對於反向的過程描述為:
這個量化方法是在前面第乙個量化方法的基礎上引入服從(−1
2,12
)(-\frac,\frac)
(−21,
21)
上均勻分布的變數,從而其量化過程可以描述為:
這樣做的好處是使得在計算梯度的時候具有良好的性質,但是這樣的量化方法在inference的時候對現有的硬體相容不是很好。
對於已經訓練好的模型進行量化的方式有兩種:只量化權重和量化權重和啟用。這兩種量化策略在下面的內容會講到。文中經過證實採用逐通道(per-channel)與非對稱範圍的量化的模型精度與浮點型是比較接近的。
只量化權值是只將權值資料量化到8bits上,因而不需要量化校準集。這樣量化方式只適用於對效能要求不高且要求模型大小比較高的場景下,這種方法一般不予以採納。
這裡除了對權重引數進行per-channel的量化之外,還需要額外準備校準資料集,以提供對啟用的量化引數的確定,這樣的方法其量化的結果也是比較好的。在tensorrt中也是採用了這樣的量化方式進行網路的量化技術,也達到了很不錯的效能。
只量化權重對效能的影響,其中包含量化粒度的對比(per-channel、per-layer):
權重與啟用都量化對於效能的影響:
基於上述實驗結果,得到如下的結論:
django中使用memcache的一些注意事項
最近寫django專案時在儲存驗證碼方面要用到memcached,於是便檢視了一些教程進行操作,結果確遇到了一系列問題,以下是一些容易遇到的雷區 1.windows下memcached安裝 windows下memcached安裝包是乙個exe檔案,然而安裝並不是直接雙擊exe檔案進行安裝,而是要通過...
關於訊號量的一些使用
一 編寫一些關於訊號量的 1.用signal 實現sleep 1 include include include typedef void handler int sig void myhandler int sig int mysleep int second int main 2 makefil...
分類中使用的一些評價指標
敏感性 sen 敏感性指由金標準確診為有病地實驗組內所檢測出陽性病例數的比率 即實驗診斷的真陽性率。其敏感性越高,假陰率也就越低。假陰率等於漏診率,因此,敏感性高的實驗診斷用於疾病診斷時,其值越高,漏診的機會就越小。所以敏感性和假陰性率具有互補性。即 敏感性 真陽性 陽性病例數 特異性 spe 是指...