查看 Markdown

libreyolo quantize

把模型的浮点模块换成量化模块,在配方需要统计量时用无标注图像做校准,并把结果保存为 PyTorch 检查点(checkpoint)。

命令
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
jsonfalse向 stdout 输出 JSON
quietfalse屏蔽 stderr
help_jsonfalse以 JSON 形式打印命令 schema 并退出

示例

基础
# 在 coco128 上校准,并写出 LibreYOLO9s-int8.ptlibreyolo 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

说明

哪些家族接受它

量化覆盖四个家族:yolo9rfdetrbirefnetfeynobg。其他家族一律以 quantize_failed 退出,并附上这份列表。

每种配方改动什么

fp16bf16 是类型转换(cast)。它们只改 dtype,不需要校准,对它们来说 calib=none 是正确的设置。

int8fp8 量化 Conv2dLinear 模块,所以它们适合卷积家族。

w4a16w4a8nvfp4mxfp4int2 只量化 nn.Linear,因此针对的是 transformer 家族。在 yolo9 上请求其中之一会被拒绝并给出解释,而不是悄悄产出 一个未量化的模型,因为在那里 8 比特以下的加速只作用于 GEMM,卷积会留在更高的 精度上。

int8fp8w4a8int2 需要激活的校准统计量。int2 之后还需要训练来 恢复,所以在没有训练器的 birefnetfeynobg 上会被拒绝。

不管用哪种配方,每个家族都会保留一部分模块为浮点:首层、预测 head,以及 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 验证。