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 ka për qëllim të ndihmojë zhvilluesit e pajisjeve në ofrimin e mbështetjes së pajisjeve për inferencën me modelet e kuantizuara LiteRT.

Përmbledhje e specifikimeve

Ne po ofrojmë një specifikim dhe mund të ofrojmë vetëm disa garanci për sjelljen nëse ndiqet specifikimi. Gjithashtu, kuptojmë që pajisje të ndryshme mund të kenë preferenca dhe kufizime që mund të shkaktojnë devijime të vogla gjatë zbatimit të specifikimit, të cilat rezultojnë në zbatime që nuk janë të sakta në bit. 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 më të mira, përfshijnë tolerancat për operacion që kemi mbledhur nga disa modele), natyra e të mësuarit automatik (dhe e 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ësh i përafron vlerat me pikë lundruese duke përdorur formulën e mëposhtme.

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

Peshat për bosht (të njohura edhe si për kanal në operacionet Conv) ose për tensor përfaqësohen nga vlerat e plotësuesit të 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ësuesit int8 two në diapazonin [-128, 127] , me një pikë zero në diapazonin [-128, 127] .

Ekzistojnë përjashtime të tjera për operacione të caktuara që dokumentohen më poshtë.

Numër i plotë me shenjë kundrejt numër të plotë pa shenjë

Kuantizimi LiteRT do t'i japë përparësi kryesisht mjeteve 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 pika zero e barabartë me 0. Përveç kësaj, shumë backend-e kanë optimizime shtesë për akumulimin int8xint8 .

Për bosht kundrejt për tensor

Kuantizimi për tensor do të thotë se 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 prerje në quantized_dimension . Dimensioni i kuantizuar specifikon dimensionin e formës së Tensorit të cilit i 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ë të gjithë 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, quantized_dimension output_channel të peshave të konvolucioneve, por në teori mund të jetë dimensioni që korrespondon me secilin produkt pikësor në implementimin e bërthamës, duke lejuar më shumë granularitet të kuantizimit pa implikime në performancë. Kjo ka përmirësime të mëdha në saktësi.

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

Simetrike kundrejt asimetrike

Aktivizimet janë asimetrike: ato mund të kenë pikën e tyre zero kudo brenda diapazonit int8 të shënuar [-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ë bit shtesë binar të saktësisë. Meqenëse aktivizimet shumëzohen vetëm me pesha konstante, vlera konstante e pikës zero mund të optimizohet mjaft shumë.

Peshat janë simetrike: të detyruara të kenë pikën zero të barabartë me 0. Vlerat e peshave shumëzohen me vlerat dinamike të hyrjes dhe të aktivizimit. Kjo do të thotë se ekziston një kosto e pashmangshme e kohës së ekzekutimit të shumëzimit të pikës zero të peshës me vlerën e aktivizimit. Duke imponuar që pika zero të jetë 0, ne mund ta shmangim këtë kosto.

Shpjegimi i llogaritjes: kjo është e ngjashme me seksionin 2.3 në arXiv:1712.05877 , përveç ndryshimit që ne 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 \times p$ me pesha të kuantizuara.
Merrni parasysh shumëzimin e rreshtit $j$të të $A$, $a_j$ me kolonën $k$të të $B$, $b_k$, të dyja me gjatësi $n$. Vlerat e numrave të plotë të kuantizuar 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\]