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)。

相关版本

Downloads last month
140
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for bangbangkido/Product-Classifier-ONNX-INT8

Quantized
(1)
this model