量化(Quantization)的定義是什麼? #
眾所週知,現實世界是連續的狀態,而電腦的世界則是離散的。透過下圖,可以看見左邊的馬力歐呈現像素化的狀態,可以看作是「離散」的狀態,右邊的馬力歐則是高清畫面,可以看作是「連續」狀態。所以對電腦而言,圖片若想要越來越清楚,就是要使圖片格子數越大越好。
畫素的多寡影響著圖片的清晰度,但這些清晰度對人眼來說,辨識也是有限的。譬如原本是800萬畫素的圖片,但手機呈現的是200萬畫素,再不局部放大的情況下,人眼很難瞬間辨認出兩者的差異。
AI量化也是這個道理。若將AI模型比擬為800萬畫素的圖片,量化就是要將這圖片縮小成30萬畫素,並不被人眼看出差異。也就是將模型的浮點數換算成整數,即「浮點(float)運算」轉換成「整數(integer)運算」。簡單來說,量化是讓模型進行forward整數運算進行加速推理,直接對模型進行壓縮成為整數。
Post-training Quantization是什麼? #
Post-train Quantization,就是AI模型的權重訓練(浮點數)好之後,直接將模型權重轉換成整數。
以INT4為例。如果不考慮負號,最簡單的最簡單的方式就是把「浮點數的值域最大值轉換成15」,「浮點數的值域最小值轉換成0」。
那浮點數最大最小值轉換成0和15後,中間的浮點數字要怎麼轉換?INT4中,整數為0到16,而每個數字的間隔都是1,所以最簡單的方式是浮點數也想辦法切成15格。這邊運用的是最簡單的方式,有就是將每一格的ㄉ錒小都默認相同,所以只需要將浮點的值域(最大值–最小值)除上15即可,而在浮點數上每一格子的大小也稱為Scale。
切好的格子中,每格大小都是固定的Scale,每格內的數字都會與INT4對應。例如:最左邊橘線內的數子,轉換至整數後,結果為0;黃線內的數子,轉換至整數後,結果為5(皆四捨五入)
此即Post-train Quantization。
AI模型做量化有什麼差別或是好處? #
單精度浮點數32bit在電腦一個數字就4 Byte,而八位元(INT8)的整數只占1 Byte,所以123.456789在電腦儲存用一個4 Byte的FP32,而123只需要1 Byte。從4 Byte變成1 Byte似乎沒有差異很大,但是AI模型大小通常都是幾百萬幾千萬的參數。舉例來說,ResNet18的參數高達3千多萬,如果用用FP32來儲存,換算一下就需要126MB來儲存,而用INT8呢?模型可以壓縮到1/4,也就是31.5MB左右。計算元和儲存的memory之間溝通的資料減少了,大幅減少頻帶寬需求,最重要的是內存的頻帶寬需求也會減少。
因此訓練後的模型如要部署在比較邊緣的設備上,大多會選擇採用整數來進行。因為如果採用伺服器訓練好的浮點運算模型,邊緣設備的硬體運算資源就會不夠,而為了解決儲存、運算以及耗能的相關問題,、就會採用整數進行部署。
延伸閱讀