libreyolo quantize
モデルの浮動小数点モジュールを量子化済みのモジュールに置き換え、レシピが統計量を必要とする場合はラベルなし画像でキャリブレーションを行い、結果をPyTorchのチェックポイントとして保存します。
- コマンド
libreyolo quantize- 必須
model- 出力
接尾辞の前に-<recipe>を付けたソースパス、たとえばLibreYOLO9s-int8.pt
概要
libreyolo quantize model=<name|path> [recipe=<recipe>] [key=value ...]引数はkey=valueのペアで、POSIX形式も使えるため、recipe=int8と
--recipe int8は同じ引数です。
引数
| 引数 | デフォルト | 意味 |
|---|---|---|
model | モデルの重み.pt。必須 | |
recipe | int8 | 量子化レシピ:fp16、bf16、fp8、int8、w4a16、w4a8、nvfp4、mxfp4、int2 |
calib | coco128.yaml | キャリブレーション画像:データYAML、または組み込みデータセットの名前。ラベルなしで、順伝播のみ。noneでキャリブレーションをスキップ |
samples | 128 | キャリブレーション画像の最大枚数 |
batch | 8 | キャリブレーションのバッチサイズ |
algorithm | auto | 活性化範囲の推定:auto(minmaxを選択)、minmax、percentile |
out | 出力チェックポイントのパス。デフォルトは接尾辞の前に-<recipe>を付けたソースパス | |
device | auto | デバイス |
allow_download_scripts | false | データセットYAMLのダウンロードブロックに埋め込まれたPythonを許可 |
json | false | stdoutへのJSON出力 |
quiet | false | stderrを抑制 |
help_json | false | コマンドのスキーマをJSONで出力して終了 |
例
# coco128でキャリブレーションしてLibreYOLO9s-int8.ptを出力libreyolo quantize model=LibreYOLO9s.pt recipe=int8libreyolo quantize model=LibreYOLO9s.pt recipe=fp16 calib=none \ out=weights/LibreYOLO9s-fp16.ptlibreyolo 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つのファミリーを対象とします。yolo9、rfdetr、birefnet、
feynobgです。それ以外のファミリーは、このリストを添えてquantize_failedで
終了します。
各レシピが変更するもの
fp16とbf16はキャストです。dtypeを変えるだけでキャリブレーションは不要で、
これらにはcalib=noneが正しい設定です。
int8とfp8はConv2dとLinearのモジュールを量子化するため、畳み込み系の
ファミリーに向いています。
w4a16、w4a8、nvfp4、mxfp4、int2はnn.Linearだけを量子化するので、
transformer系のファミリーが対象です。yolo9でこれらのいずれかを指定すると、
そこでは8ビット未満の高速化がGEMMにしか効かず畳み込みはより高い精度のまま
残るため、量子化されていないモデルを黙って出力するのではなく、説明を添えて
拒否されます。
int8、fp8、w4a8、int2は活性化のキャリブレーション統計量を必要とします。
int2はさらに事後の回復のための学習も必要なので、トレーナーを持たない
birefnetとfeynobgでは拒否されます。
レシピにかかわらず、各ファミリーは一部のモジュールを浮動小数点のまま保持 します。最初の層、予測ヘッド、そして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を離れ、代わりにデプロイ
用の成果物を書き出します。