Specifikimi i kuantizimit të LiteRT 8-bit

Dokumenti i mëposhtëm përshkruan specifikimet për skemën e kuantizimit 8-bit të LiteRT. Kjo synon të ndihmojë zhvilluesit e harduerit në ofrimin e mbështetjes harduerike për konkluzionet me modelet e kuantizuara LiteRT.

Përmbledhja e specifikimeve

Ne po ofrojmë një specifikim dhe mund të japim disa garanci për sjelljen vetëm nëse ndiqet specifikimi. Ne gjithashtu kuptojmë se hardueri i ndryshëm mund të ketë preferenca dhe kufizime që mund të shkaktojnë devijime të lehta gjatë zbatimit të specifikave që rezultojnë në zbatime që nuk janë pak të sakta. Ndërsa kjo mund të jetë e pranueshme në shumicën e rasteve (dhe ne do të ofrojmë një sërë testesh që sipas njohurive tona përfshijnë tolerancat për operacion që kemi mbledhur nga disa modele), natyra e mësimit të makinerive (dhe të mësuarit të thellë në rastin më të zakonshëm) e bën të pamundur ofrimin e ndonjë garancie të fortë.

Kuantizimi 8-bit përafron vlerat e pikës lundruese duke përdorur formulën e mëposhtme.

\[real\_value = (int8\_value - zero\_point) \times scale\]

Për bosht (i njohur ndryshe si për kanal në Conv ops) ose peshat për tensor përfaqësohen nga vlerat e plotësimit int8 two në diapazonin [-127, 127] me pikë zero të barabartë me 0. Aktivizimet/hyrjet për tensor përfaqësohen nga vlerat e plotësimit int8 two në diapazonin [-128, 127] , me pikë zero [-128, 127] .

Ka përjashtime të tjera për operacione të veçanta që janë të dokumentuara më poshtë.

Numër i plotë i nënshkruar vs numër i plotë i panënshkruar

Kuantizimi i LiteRT do t'i japë përparësi kryesisht veglave dhe bërthamave për kuantizimin int8 për 8-bit. Kjo është për lehtësinë e kuantizimit simetrik që përfaqësohet nga pikë zero e barabartë me 0. Përveç kësaj, shumë backend kanë optimizime shtesë për akumulimin int8xint8 .

Per-bosht vs per-tensor

Kuantizimi për tensor do të thotë që do të ketë një shkallë dhe/ose pikë zero për të gjithë tensorin. Kuantizimi për bosht do të thotë se do të ketë një shkallë dhe/ose zero_point për fetë në quantized_dimension . Dimensioni i kuantizuar specifikon dimensionin e formës së tensorit me të cilin korrespondojnë shkallët dhe pikat zero. Për shembull, një tensor t , me dims=[4, 3, 2, 1] me parametra kuantizimi: scale=[1.0, 2.0, 3.0] , zero_point=[1, 2, 3] , quantization_dimension=1 do të kuantizohet në dimensionin e dytë të t :

t[:, 0, :, :] will have scale[0]=1.0, zero_point[0]=1
t[:, 1, :, :] will have scale[1]=2.0, zero_point[1]=2
t[:, 2, :, :] will have scale[2]=3.0, zero_point[2]=3

Shpesh, dimensioni quantized_dimension është output_channel i peshave të konvolucioneve, por në teori mund të jetë dimensioni që korrespondon me çdo produkt pikë në zbatimin e kernelit, duke lejuar më shumë granularitet të kuantizimit pa implikime të performancës. Kjo ka përmirësime të mëdha në saktësinë.

TFLite ka mbështetje për bosht për një numër në rritje operacionesh. Në kohën e këtij dokumenti, ekziston mbështetje për Conv2d dhe DepthwiseConv2d.

Simetrike vs asimetrike

Aktivizimet janë asimetrike: ato mund të kenë pikën e tyre zero kudo brenda intervalit të nënshkruar int8 [-128, 127] . Shumë aktivizime janë asimetrike në natyrë dhe një pikë zero është një mënyrë relativisht e lirë për të arritur në mënyrë efektive deri në një pjesë binar shtesë të saktësisë. Meqenëse aktivizimet shumëzohen vetëm me pesha konstante, vlera konstante e pikës zero mund të optimizohet shumë.

Peshat janë simetrike: të detyruara të kenë pikën zero të barabartë me 0. Vlerat e peshës shumëzohen me vlerat e hyrjes dinamike dhe të aktivizimit. Kjo do të thotë se ka një kosto të pashmangshme të kohës së funksionimit të shumëzimit të pikës zero të peshës me vlerën e aktivizimit. Duke zbatuar se pika zero është 0 ne mund ta shmangim këtë kosto.

Shpjegimi i matematikës: kjo është e ngjashme me seksionin 2.3 në arXiv:1712.05877 , me përjashtim të ndryshimit që lejojmë që vlerat e shkallës të jenë për bosht. Kjo përgjithësohet lehtësisht, si më poshtë:

$A$ është një matricë $m \times n$ e aktivizimeve të kuantizuara.
$B$ është një matricë $n \fish p$ e peshave të kuantizuara.
Konsideroni të shumëzoni rreshtin $j$th të $A$, $a_j$ me kolonën $k$th të $B$, $b_k$, të dyja me gjatësi $n$. Vlerat e numrave të plotë të kuantizuara dhe vlerat e pikave zero janë përkatësisht $q_a$, $z_a$ dhe $q_b$, $z_b$.

\[a_j \cdot b_k = \sum_{i=0}^{n} a_{j}^{(i)} b_{k}^{(i)} = \sum_{i=0}^{n} (q_{a}^{(i)} - z_a) (q_{b}^{(i)} - z_b) = \sum_{i=0}^{n} q_{a}^{(i)} q_{b}^{(i)} - \sum_{i=0}^{n} q_{a}^{(i)} z_b - \sum_{i=0}^{n} q_{b}^{(i)} z_a + \sum_{i=0}^{n} z_a z_b\]