Markdownで表示

libreyolo quantize

モデルの浮動小数点モジュールを量子化済みのモジュールに置き換え、レシピが統計量を必要とする場合はラベルなし画像でキャリブレーションを行い、結果をPyTorchのチェックポイントとして保存します。

コマンド
libreyolo quantize
必須
model
出力
接尾辞の前に-<recipe>を付けたソースパス、たとえばLibreYOLO9s-int8.pt

概要

bash
libreyolo quantize model=<name|path> [recipe=<recipe>] [key=value ...]

引数はkey=valueのペアで、POSIX形式も使えるため、recipe=int8--recipe int8は同じ引数です。

引数

引数デフォルト意味
modelモデルの重み.pt。必須
recipeint8量子化レシピ:fp16bf16fp8int8w4a16w4a8nvfp4mxfp4int2
calibcoco128.yamlキャリブレーション画像:データYAML、または組み込みデータセットの名前。ラベルなしで、順伝播のみ。noneでキャリブレーションをスキップ
samples128キャリブレーション画像の最大枚数
batch8キャリブレーションのバッチサイズ
algorithmauto活性化範囲の推定:auto(minmaxを選択)、minmaxpercentile
out出力チェックポイントのパス。デフォルトは接尾辞の前に-<recipe>を付けたソースパス
deviceautoデバイス
allow_download_scriptsfalseデータセットYAMLのダウンロードブロックに埋め込まれたPythonを許可
jsonfalsestdoutへのJSON出力
quietfalsestderrを抑制
help_jsonfalseコマンドのスキーマをJSONで出力して終了

基本
# coco128でキャリブレーションしてLibreYOLO9s-int8.ptを出力libreyolo quantize model=LibreYOLO9s.pt recipe=int8
キャストのみ、キャリブレーションなし
libreyolo quantize model=LibreYOLO9s.pt recipe=fp16 calib=none \  out=weights/LibreYOLO9s-fp16.pt
キャリブレーションを広げてから精度を回復
libreyolo quantize model=LibreYOLO9s.pt recipe=int8 \  calib=coco128.yaml samples=256 batch=16 algorithm=minmax # 量子化したチェックポイントで量子化認識学習を行うと精度が回復libreyolo train model=LibreYOLO9s-int8.pt data=coco8.yaml epochs=10 lr0=0.001

注記

どのファミリーが受け付けるか

量子化は4つのファミリーを対象とします。yolo9rfdetrbirefnetfeynobgです。それ以外のファミリーは、このリストを添えてquantize_failedで 終了します。

各レシピが変更するもの

fp16bf16はキャストです。dtypeを変えるだけでキャリブレーションは不要で、 これらにはcalib=noneが正しい設定です。

int8fp8Conv2dLinearのモジュールを量子化するため、畳み込み系の ファミリーに向いています。

w4a16w4a8nvfp4mxfp4int2nn.Linearだけを量子化するので、 transformer系のファミリーが対象です。yolo9でこれらのいずれかを指定すると、 そこでは8ビット未満の高速化がGEMMにしか効かず畳み込みはより高い精度のまま 残るため、量子化されていないモデルを黙って出力するのではなく、説明を添えて 拒否されます。

int8fp8w4a8int2は活性化のキャリブレーション統計量を必要とします。 int2はさらに事後の回復のための学習も必要なので、トレーナーを持たない birefnetfeynobgでは拒否されます。

レシピにかかわらず、各ファミリーは一部のモジュールを浮動小数点のまま保持 します。最初の層、予測ヘッド、そしてYOLOv9では、固定の積分期待値演算子であり 量子化してはならないDFL畳み込みです。

キャリブレーションデータは学習データではありません

calibは、活性化範囲を導出するために順伝播のみで使う小さなラベルなし画像 セットを指します。評価に使われることはなく、そのラベルが読まれることも ありません。デフォルトのcoco128.yamlは初回使用時にURLからダウンロードされる ため追加の許可は不要ですが、Pythonのダウンロードスクリプトが埋め込まれたYAMLには allow_download_scripts=trueが必要です。

algorithm=percentileも利用できますが、transformer系のファミリーでは精度を 下げることがあり、そのためautoはminmaxを選択します。

精度を回復する

出力は通常のPyTorchチェックポイントなので、 libreyolo trainがそのまま受け付けます。量子化した チェックポイントを学習することが量子化認識学習であり、 distill_model=<teacher>を加えると量子化認識蒸留になります。

出力と終了コード

結果には、保存先のパス、レシピ、実行モード、キャリブレーションが実行されたか どうか、種類ごとに置き換えられたモジュールの数が出力されます。終了コードは 成功時が0、モデルを読み込めない場合が4、量子化または保存に失敗した場合が 5、その他のランタイムエラーが1です。

関連:libreyolo exportは、PyTorchを離れ、代わりにデプロイ 用の成果物を書き出します。

LibreYOLO v1.5.0で検証済みです。