身為一個人工智慧(AI)從業人員,好不容易費盡千辛萬苦訓練好一個模型並且得到不錯的推論準確度後,總會遇到客戶抱怨「這個模型太大塞不進我的硬體,這個推論的速度不能再快一些嗎?」。當換了一個較小、速度快一點的模型,又被抱怨「這個推論的準確度不能再高一點嗎?」。此時腦中總會想起星爺的電影「九品芝蔴官」豹子頭的那句經典台詞「我全都要」,難道就沒有折衷一點的辦法,讓我在AI推論速度、準確度和模型大小都能滿足嗎?
Intel OpenVINO算是聽到大家的心聲了吧,日前推出了「Post-Training Optimization Tool (以下簡稱POT)」來幫助大家,在不用重新訓練模型的情況下,只需執行幾個簡單的命令,模型瞬間縮小,且在僅僅損失一點點推論準確度情況下就能得到1.1到3.3倍左右推論速度的提升!
POT究竟用了何種方式才能達成這個結果,接下來就從「何謂量化(Quantization)」、「量化算法(Quantization Algorithms)」、「使用DL Workbench快速優化」、「安裝POT相依套件」等面向來作一些簡單說明,最後再用一個「影像分類MobileNet模型優化」實際案例說明其執行方式及優化結果,希望能讓大家有更愉快的AI落地開發體驗。
何謂量化 (Quantization)
相信大家平常都有在拍數位照片,一張1920x1080(俗稱200萬畫素)解析度全彩的照片原始檔案大小就要6,220.8KB,如果不經過壓縮,大概拍沒幾張記憶卡就爆了,所以就有破壞性壓縮的影像格式產生,如JPG格式。同樣一張照片經過破壞性壓縮後,檔案就只剩不到200KB(不同影像壓縮比例不同),檔案大小縮小了30倍以上,但人眼卻很難察覺其中的差異,而其中最大的功臣就是「量化(Quantization)」及「編碼(Encoding)」技術。於是就有人想到是否可以套用這樣的概念到AI模型壓縮上。
那什麼是量化呢?首先要先了解為什麼要量化。在真實世界中大部份的物理量(如色彩、亮度、音量等)都是連續數值(類比信號),我們很難完整直接記錄所有的內容,於是就有了把類比信號轉換成數位信號再記錄的方式產生。而影響數位信號是否能完美還原成類比信號的兩大參數就是「解析度」及「取樣頻率」。
其中「解析度」又可分為純整數及整數加小數點表示。前者會以2的n次方來表示,而為了配合電腦運算,n通常為8, 16, 32, 64,又可寫作INT8, INT16, INT32及INT64。而後者為了表示小數點,通常採用浮點數表示,常見有半精度(FP16)、單精度(FP32)及倍精度(FP64)浮點數。
這裡明顯可看出不同的數值表示方式,在儲存空間及解析能力有明顯的差異。以INT8和FP32來舉例比較,INT8只需8個bit來表示整數,最多只能表示2的8次方256位階(+127到-128或者0到255)。而FP32需要32bit來表示整數加小數點,其中1 bit表示正負值,8 bit表示指數(-128到+127),23 bit表示數值,整體可表現的動態範圍大約是在-1.410-45到+3.410+38。
因此資料壓縮最快速的方式就是改變連續(類比)數值「量化」方式,而最直覺的想法就是把高解析度降到低解度,把浮點數降到整數,那儲存空間馬上大幅減少。以FP32轉成INT8來看,儲存空間從32 bit變成8 bit,一下就少了3/4(相當於75%)。而計算從浮點數轉換成整數後,更可透過INTEL CPU的單指令多資料(Single Instruction Multiple Data, SIMD)平行計算指令集(如SSE4.2, AVX2, AVX512等)加速運算,讓計算速度提升數倍到數十倍。如Fig. 1所示。
只需不到短短一分鐘...
輸入您的信箱與ID註冊即可享有一切福利!
會員福利
免費電子報
會員搶先看
主題訂閱
好文收藏