Product Classifier ONNX FP32 / INT8(30 类,legacy)
已弃用(legacy):本仓库使用 30 类标签体系,与当前 27 类标准不兼容,不能与
product-title-classifier-*系列混用。27 类版本见下方平台入口表。
平台入口
| 平台 | 仓库 | 说明 |
|---|---|---|
| Hugging Face | 当前仓库 | 30 类 ONNX,legacy |
| ModelScope | product-title-classifier-bert-base-chinese-v2 | 27 类标准版本 |
| Hugging Face | product-title-classifier-bert-base-chinese-v2 | 27 类迁移中 |
中文商品标题 30 类分类器,用于 CPU 单条和批量推理。来自 Product-Classifier,基座为 google-bert/bert-base-chinese。
版本:20261027-051303-065127_seq48_bs32_lr1e-05_ep100_seed42_samplesall。输入长度固定为 48 token(包含特殊 token),batch 可变;超长标题截断。本次更新包含源版本 FP32 ONNX,以及重新运行项目 ml/export_onnx.py 制作的 INT8 模型。
简要测评
2026-10-28 在相同的 11,104 条完整验证集上评估;ONNX 使用 CPUExecutionProvider,batch=32,CPU 线程数=4。PT 使用项目 ml/evaluate.py,INT8 使用 ml/evaluate_onnx.py;FP32 使用 ONNX Runtime 遍历相同 token 输入,并复用 ml/metrics.py 计算分类指标。
| 指标 | PT FP32 | ONNX FP32 | ONNX INT8 |
|---|---|---|---|
| Accuracy | 94.6686% | 94.6686% | 93.3898% |
| Macro Precision | 89.0989% | 89.0989% | 88.5181% |
| Macro Recall | 87.1758% | 87.1758% | 84.5574% |
| Macro F1 | 88.0200% | 88.0200% | 86.2797% |
INT8 准确率降低 1.2788 个百分点,通过项目现有的“下降不超过 2 个百分点”门槛;Macro F1 降低 1.7403 个百分点。模型文件由 FP32 的 407,003,189 字节缩至 INT8 的 152,826,473 字节,减少 **62.45%**。量化节省存储,存在可测精度损失。
详细报告:FP32、INT8、量化校验。验证集参与早停与模型选择,以上不是独立测试成绩。类别不均衡:源 PT 测评中“书籍”仅 1 条、F1 为 0,“汽车用品”19 条、F1 为 60.61%;小类别指标不稳定。未在目标服务器做吞吐/延迟压测,评估耗时不作为部署性能承诺。
量化方式及校验
静态 QDQ、per-channel 混合精度:编码器常量权重 MatMul 使用 INT8 权重和激活;Embedding、LayerNorm、Softmax、分类头及其他算子保留 FP32。按 seed=42 从训练集抽取 128 条校准。
导出时另从验证集抽取 128 条:FP32 准确率 94.53125%,INT8 95.3125%,分类一致率 94.53125%。这是导出抽检,完整测评以表格为准,不能据此认定量化提升精度。PyTorch / ONNX FP32 示例 logits 最大绝对误差为 0.0000038147;batch=1、3 的一致性检查通过。源 FP32 ONNX 与重新导出文件 SHA-256 完全相同。
下载与运行
hf download bangbangkido/Product-Classifier-ONNX-INT8 --local-dir ./product-classifier-onnx
cd product-classifier-onnx
python -m pip install -r requirements.txt
python predict.py "无线蓝牙耳机" "纯棉短袖" --batch-size 32
随附入口默认加载 model.int8.onnx。仅需 ONNX Runtime CPU、分词器与 NumPy;下载完整后可离线运行,不需要 PyTorch、CUDA、原项目或额外基座权重。
Python 批量调用
from pathlib import Path
from inference import OnnxClassifier
classifier = OnnxClassifier(Path("."), batch_size=32, cpu_threads=4)
values = classifier.predict_many(["无线蓝牙耳机", "纯棉短袖"])
print(values, [classifier.id2label[str(v)] for v in values])
结果与输入顺序一致,大批输入内部按 batch_size 分块。业务文本清洗由调用方完成。
FP32 推理与输入输出
使用同一分词器和 48 token 配置,直接通过 ONNX Runtime 加载 model.fp32.onnx:
import numpy as np
import onnxruntime as ort
from tokenizers import Tokenizer
tokenizer = Tokenizer.from_file("tokenizer.json")
tokenizer.enable_truncation(max_length=48)
tokenizer.enable_padding(length=48, pad_id=tokenizer.token_to_id("[PAD]"), pad_token="[PAD]")
encoded = tokenizer.encode_batch(["无线蓝牙耳机"])
inputs = {"input_ids": np.asarray([v.ids for v in encoded], dtype=np.int64),
"attention_mask": np.asarray([v.attention_mask for v in encoded], dtype=np.int64)}
session = ort.InferenceSession("model.fp32.onnx", providers=["CPUExecutionProvider"])
print(session.run(["logits"], inputs)[0].argmax(axis=1))
| 名称 | 类型 | 形状 |
|---|---|---|
| input_ids | int64 | [batch, 48] |
| attention_mask | int64 | [batch, 48] |
| logits | float32 | [batch, 30] |
两种 ONNX 使用相同接口;对 logits 最后一维取 argmax 得到类别编号,通过 labels.json 映射名称。自定义 ONNX 模型不支持直接用 AutoModelForSequenceClassification 加载。
文件与限制
model.fp32.onnx / model.int8.onnx 为两种精度的计算图;tokenizer、vocab、labels、config 和 inference_config 为配套文件;inference.py、predict.py、requirements.txt 为独立推理入口;training_metadata.json、release_manifest.json、evaluation_data_manifest.json 记录来源和处理过程;SHA256SUMS 提供校验值。
本地 64 token 预处理数据在独立发布目录转换为 48 token,保留截断处 SEP,原始数据未覆盖;验证集所有标签顺序和有效 token 长度已逐条核对源评估记录。范围外文本仍会分入已有类别。本仓库的微调权重和量化产物以 Apache-2.0 发布;基座为 google-bert/bert-base-chinese(Apache-2.0)。
相关版本
- 30 类 PyTorch(Hugging Face):Product-Classifier
- 27 类 BERT v2(ModelScope):product-title-classifier-bert-base-chinese-v2
- 27 类 MacBERT(ModelScope):product-title-classifier-chinese-macbert-base
- Downloads last month
- 140
Model tree for bangbangkido/Product-Classifier-ONNX-INT8
Base model
google-bert/bert-base-chinese