たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

ONNXの量子化: 手探りの進化なう

ONNXのquantization/量子化は手探りで進歩中.

負債の部

既に進化の歴史っぽい負債がある.
しばらくは残り続ける負債なのでメモ.

表現: QOp vs QDQ

ONNXのOperatorはint8を受け付けないのが大半 (しかしint64は受け付ける謎仕様).
int8のみを受け付けるQOperatorsがConvとMatMulにだけ用意されている.

じゃあ他の演算はどうするんだよという話に当然なったと思われ、現在はQDQ (fake quant) による表現が主流.
「QLinearとDQLinearはopsとして定義されてるからそれ使ってweightとactivationの量子化をしよう、DQ-op-Qがあればそれはランタイム側で (最適化likeに) 一括int8演算しちゃえばいいよね」というやり口.
ORT的にはQDQフォーマットに寄せる意向の模様 (QDQ限定の最適化があり、QOp形式にwarning出す場面があったりする).

とはいえ、Quant時の振る舞いが複数パターンあり得る演算子もある (例: LSTMはどこをどう量子化するのか).
QDQで挟んでもそれは一意に決まらず、QDQにフラグを持たせるのはお門違いなので、結局QOpが必要になってくる.

ORTのquantize関数はQOpとQDQの内部パスが分かれていて辛そう.