在 CPU 上用 NNCF 做分类模型 INT8 后训练量化
用训练数据校准模型、导出原始与量化 OpenVINO IR,并比较精度和推理速度;同时识别设备混用、测试集泄漏与基准尺寸不一致。
任务与模型
两本 OpenVINO notebook 都演示不微调的 INT8 post-training quantization(PTQ),并将 FP32 与量化模型导出为 OpenVINO IR,比较准确率和推理速度。主篇使用适配 Tiny ImageNet 200 类的 ResNet-50,图像大小为 64×64;从训练集构造校准 DataLoader,以验证集计算 Top-1/Top-5。补篇使用 CIFAR-10 上训练的 MobileNetV2,先导入 PyTorch 权重、转换成 OpenVINO IR,再进行 NNCF 校准、比较十类准确率及样例图片。
两篇都要求 Jupyter 环境;主篇还要求系统 PATH 可找到 C++ 编译器。Notebook 的 pip 行只有版本下限,并非可复现的依赖锁。研究页记录过 Python 3.12、NNCF 3.4.0、PyTorch 2.13.0、Torchvision 0.28.0 与 OpenVINO 2026.4.0 的兼容候选组合,但这不是本环境实际安装或验证结果;运行前应使用目标平台的官方矩阵与锁定依赖重新确认。
下载和准备数据前先收紧安全边界
主篇会从公开站点下载 checkpoint 和 Tiny ImageNet zip,补篇会下载并导入 notebook_utils.py、cmd_helper.py,再 clone 权重仓库;两篇还调用 OpenVINO notebook telemetry。示例依赖外部网络与第三方代码,不能在生产凭据可访问的个人 notebook 里未经审阅直接执行。
主篇 Tiny ImageNet 下载链接使用 HTTP,来源完整性没有由固定摘要确认。其代码调用 ZipFile.extractall(),但 Python 3.8 官方文档说明,zipfile 会剥除成员名中的绝对路径前缀和 .. 路径组件,并称模块会尝试防止路径穿越;因此不能笼统断言该示例会把路径穿越条目写到目标目录之外。这个默认清理并不验证归档来源或文件内容,也不限制磁盘占用和覆盖行为。对不可信归档仍应在解压前逐项校验规范化目标路径、成员数量与解压大小,并使用隔离目录和资源限额;优先 HTTPS 并核对可信摘要。原辅助文件下载虽使用 HTTPS,仍没有固定提交、超时、状态码和摘要校验,随后立即 import 运行;来源仓库被替换即可执行任意代码。应固定 commit/tag,先审查并校验下载文件,且在无个人凭据、无生产访问的隔离环境执行。
collect_telemetry() 会按 OpenVINO 项目说明触发遥测;主笔记本 Markdown 还嵌有来自 static.scarf.sh 的远程像素,渲染单元格可能向第三方发起请求。执行者应被告知并查看项目当前的 telemetry opt-out 与隐私说明。本文没有触发这些请求。模型 checkpoint 也需验证来源和 SHA-256。主篇通过 torch.load(..., map_location="cpu") 加载文件;旧版 PyTorch 可能允许 pickle 反序列化执行代码,不要加载任意来源 .pth。兼容版本支持时使用 weights_only=True,并只导入预期的 state dict。
PTQ 与 OpenVINO 导出
主篇建立 ResNet-50 并把最后全连接层改为 200 类,再从本地 checkpoint 严格加载权重。IMAGE_SIZE=[64,64] 用于训练/验证 transforms;训练集 DataLoader 传给 nncf.Dataset,transform 只取图像输入,再调用 nncf.quantize(model, calibration_dataset)。验证集分开计算原模型和量化模型 Top-1/Top-5。NNCF 插入 fake quantization 节点并收集校准统计;PyTorch 中的量化模型可能比未量化模型推理更慢,最终速度应看转换后的 IR。
Notebook 原代码以 torch.cuda.is_available() 在 CPU 与 CUDA 间自动选设备,并在通用 validate 中将图像和标签都移至所选设备;OpenVINO 输出则从 NumPy 转为 CPU Tensor。若在 GPU 主机上运行,这些张量可能不在同一设备,且 OpenVINO Runtime 输入不应未经适配地传 CUDA Tensor。为了做单机 CPU 比较,修订为固定 CPU 并让 Torch 模型、批次、标签和 OpenVINO 全程保持 CPU:
torch_device = torch.device("cpu")
for images, target in val_loader:
images = images.to(torch_device)
target = target.to(torch_device)
# PyTorch 和 OpenVINO CPU 输入共用同一 CPU 批次
此改动不代表 GPU 路径已经实现;如需 GPU,须分别处理 Torch 与 OpenVINO 的输入接口、数据拷贝与性能计时。对主篇的 64×64 模型,可用相同输入张量将 FP32/量化模型转换并保存为两组 XML/BIN。原代码还出现 NNCF tracer 输出不一致 warning;需检查转换后模型在实际输入范围上的误差,不能把成功写出文件当作数值等价证明。
补篇 MobileNetV2 读取 CIFAR-10 官方测试 split,归一化后先转换基础模型,再以同一 DataLoader 供 NNCF 校准,生成量化 IR。源 notebook 还从第三方仓库加载预训练权重并导入遥测 helper,须执行相同的固定来源和 checkpoint 校验。
准确率和数据拆分
Tiny ImageNet notebook 存档输出报告:PyTorch FP32 Top-1/Top-5 为 60.740%/83.960%,PyTorch PTQ 为 60.880%/84.050%;OpenVINO FP32 IR 为 60.740%/83.960%,INT8 IR 为 60.920%/83.970%。这些是原 notebook 随附环境输出,不是本次重新运行结果。它们仅说明该 checkpoint、预处理与当时环境中的观测差异。
CIFAR-10 notebook 以 train=False 读取测试集,并用同一个 val_loader 构造 NNCF 校准数据,再用它评估准确率。保存的 NNCF 日志显示统计收集 300/300;该校准子集来自测试 split,因此与评估数据重叠。保存的 93.61% 与 93.51% 不能作为独立测试精度比较。正确实验应从训练集或另行划出的校准集取代表样本,量化后只在未参与校准的验证/测试集上报告精度;数据增强、归一化、类别顺序和输入尺寸需完全一致。
延迟与吞吐要使用同一工作负载
主篇的准确率 DataLoader 把 Tiny ImageNet 缩放到 64×64,但 benchmark 命令用 -shape "[1,3,512,512]" 测量;这代表另一种输入尺寸,不能与 64×64 精度结果合并解释。修订 benchmark 输入应保持模型形状(例如 [1,3,64,64]),FP32/INT8 使用相同设备、batch、预热、线程/stream 配置和运行时间。
补篇 benchmark 通过 AUTO 设备跑 15 秒,填充随机输入,而不是 CIFAR 图像;源输出里设备最终解析为 CPU,旧运行记录了约 7,832.95 与 14,033.63 FPS。主篇随附的历史 FPS 输出分别为 FP32/INT8 异步 51.11/196.85 FPS、同步 36.68/128.84 FPS;命令运行 15 秒,输入形状是 [1,3,512,512]。准确率验证使用 64×64,因此这组吞吐不能和 64×64 精度结果当成同一工作负载。主篇设备选择控件显示 AUTO,硬件信息单元格列出 Intel Core i9-10980XE 与 NVIDIA GeForce GTX 1080 Ti,但保存的 FPS 摘要没有保留执行设备明细。补篇的两个 15 秒异步输出为原模型 7,832.95 FPS、INT8 14,033.63 FPS;日志显示 OpenVINO 2023.0.0、模型输入 32×32,AUTO 最终执行设备为 CPU。两份数字都是 Notebook 保存的旧环境输出,不是本次运行,受设备、负载、线程和运行时版本影响,不能推广为当前机器承诺。正式比较应在隔离机器关闭其他负载,指定设备、形状、batch、预热和线程/stream,记录时延分位与吞吐,并用真实输入测端到端表现。补篇四张示例图的预测顺序是 frog、dog、ship、horse;原模型与量化模型给出相同标签,但这只是样例,不是统计准确率证明。
许可和本次核验
OpenVINO notebooks 仓库标注 Apache License 2.0;本包附完整许可文本。补篇引用的 MobileNetV2 模型仓库为 chenyaofo/pytorch-cifar-models,其 BSD 3-Clause 文件署名为 chenyaofo;该完整许可文本也随包附上。本文没有分发数据集、预训练权重或模型仓库源码;数据集、权重和其他素材仍须按其各自条款处理,不能从上述仓库许可证推断。源笔记本的作者字段没有列个人姓名,本文保留 OpenVINO 项目与官方贡献者署名。
两本 notebook 共 73 个单元已完整逐格阅读,本文只做静态审阅;没有安装 NNCF/PyTorch/OpenVINO,没有下载权重或数据集,没有运行模型、解压第三方 zip 或触发遥测。所有 notebook 数值都明确标为来源存档输出,非本次测试。
来源、署名与版本说明
维护方:OpenVINO 项目与官方 notebook 贡献者;原笔记本未列个人作者。本文合并翻译并编辑《Post-Training Quantization of PyTorch models with NNCF》与《Quantization of Image Classification Models》。来源分别为 主笔记本和CIFAR-10 补充笔记本。OpenVINO notebooks 内容与示例代码采用 Apache License 2.0,完整文本见 LICENSE-APACHE-2.0.txt;MobileNetV2 模型来源仓库的 BSD 3-Clause 许可全文见 LICENSE-pytorch-cifar-models-BSD-3-Clause.txt。本页不分发模型权重或数据集。
主笔记本安装命令声明 OpenVINO ≥2024.0、NNCF ≥2.9;补充笔记本声明 OpenVINO ≥2023.1、NNCF ≥2.6,均未提供锁定依赖。两页位于滚动的 latest 分支,本文核对的是 2026-10-09 保存的内容,没有固定到 Git commit。嵌入的历史输出显示 OpenVINO 2023.0.0,不应误当作当前版本性能。
两个笔记本共 73 个单元已逐格静态核对;未安装框架、下载权重或数据集、解压归档、运行模型、触发遥测或测量性能。文中所有数字都注明为源 Notebook 保存的旧输出,不是本次测试。










暂无评论内容