v
v50_/winclip-opt
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

WinCLIP 华为昇腾 910B4-1 NPU 推理优化

竞赛提交: WinCLIP (CVPR 2023) 零样本异常检测模型在华为昇腾 910B4-1 NPU 上的适配与性能优化 提交日期: 2026-05-18 提交者: v50_ 提交说明: Opt3 npu_prefetch (权重预取) 91.6 img/s 10.9ms ~2.36x


项目概述

将 WinCLIP (CVPR 2023) 零样本异常检测模型适配到 华为昇腾 910B4-1 NPU,经过 Tile Batching + 权重预取 (npu_prefetch) 两阶段优化,实现 ~2.36x 端到端推理加速,精度完全保持。

指标串行 v1 (per-tile baseline)Opt3 优化版 (prefetch)提升
推理延迟 (per-image)~25.7 ms10.9 ms~2.36x
FPS~38.9 img/s91.6 img/s~2.36x
VisA AUROC (avg 12cls)0.78760.7876*Δ=0.0000 ✅

验证结果


性能基线要求

本项目遵循竞赛指定的性能基线验收标准:

基线类型要求本项指标状态
精度基线复现论文 WinCLIP VisA AUROC ≥ 78.1%78.76% (Δ=+0.66%)✅
精度无退化优化版 vs baseline AUROC 差异 ≤ ±0.01Δ=0.0000 (12/12 类一致)✅
性能基线 (串行v1)串行 tile 推理 FPS/latency 作为起始基准38.9 img/s, 25.7ms—
优化目标优化版相对 baseline 须有可量化的正向加速91.6 img/s, ~2.36x 加速✅
精度-性能权衡优化不得导致精度退化换取性能AUROC 完全一致✅

模型简介

WinCLIP 是基于 CLIP 的零样本异常检测模型,利用 CLIP 的视觉-语言对齐能力,在无需训练的情况下检测工业缺陷。核心流程:

  1. Tiling — 将输入图像按短边裁切为 2-3 个重叠正方形 tile (240×240)
  2. CLIP ViT 编码 — 对每个 tile 提取视觉特征
  3. Text 引导分类 — 使用预定义的 normal / anomaly 文本模板计算余弦相似度

优化关键: 将串行 tile 推理改为 batch 推理,消除 ViT 编码的串行瓶颈。


交付物清单

文件说明
winclip_src/WinCLIP 源码 (open_clip 框架 + 异常检测逻辑)
opt_winclip/benchmark_winclip.py基准测试脚本 (串行 tile v1)
opt_winclip/run_optimized_v2.py优化版推理脚本 (Tile Batch v2)
opt_winclip/prepare_visa_data.pyVisA 数据集准备脚本
scripts/compare_precision.py精度对比工具
scripts/compare_all.py全类别跑分脚本
requirements.txtPython 依赖
setup_env.sh环境一键配置脚本
OPTIMIZATION_LOG.md完整优化日志 (含 Profiling 分析)
baseline_npu_results.jsonBaseline 性能数据
precision_comparison.json精度评估数据
results_screenshots/评测截图、日志、可视化

环境要求

组件版本
硬件Ascend 910B4-1 NPU × 1
CANN8.5.0
Python3.9+
PyTorch2.7.0
torch_npu2.7.1.post4

一键配置

# 安装依赖
pip install -r requirements.txt

# 或一键配置
bash setup_env.sh

快速使用

1. 下载所需资源

模型权重: WinCLIP 基于 OpenCLIP 预训练权重,原始模型代码见 mala-lab/WinCLIP。权重文件 vit_b_16_plus_240-laion400m_e31-8fb26589.pt:

wget https://github.com/mlfoundations/open_clip/releases/download/v0.2-weights/vit_b_16_plus_240-laion400m_e31-8fb26589.pt

VisA 数据集: 从 Amazon Science / Visual Anomaly Detection 下载 VisA_20220922.tar:

# 方式一:从 AWS S3 直接下载
wget https://amazon-visual-anomaly.s3.us-west-2.amazonaws.com/VisA_20220922.tar

# 或从 GitHub Releases 下载
# https://github.com/amazon-science/visual-anomaly-detection/releases

# 解压并转换格式
tar -xf VisA_20220922.tar -C dataset/
python opt_winclip/prepare_visa_data.py

2. 运行

# Baseline (串行 tile)
python opt_winclip/benchmark_winclip.py --obj_type candle --output results_baseline.json

# 优化版 (Tile Batch)
python opt_winclip/run_optimized_v2.py --obj_type all

# 精度对比
python scripts/compare_precision.py

自定义图片推理

import torch
import torch_npu
from winclip_src.main_npu import WinCLIP

model = WinCLIP('ViT-B-16-plus-240', device='npu:0')
# 优化版: 自动 tile batch 推理
results = model.predict('path/to/image.jpg', category_name='candle')
print(f"Anomaly score: {results['anomaly_score']:.4f}")

优化历程

优化 1:Tile Batching

阶段优化项FPSLatency加速比
BaselineFP32 串行 tile (per-image折算)~38.9 img/s~25.7ms1.00x
Opt2Tile Batch v2 (堆叠batch推理)78.1 img/s12.8ms~2.01x
Opt3+ npu_prefetch 权重预取91.6 img/s10.9ms~2.36x

优化 2:权重预取 (npu_prefetch)

使用 torch_npu.npu_prefetch API,在视觉 Transformer 推理进入循环前,异步预取全部 12 层 × 4 个 MatMul 权重(共 48 个权重张量)到 NPU On-Chip 缓存,与计算流水线重叠。

项目值
预取位置VisionTransformer.forward() 中,self.transformer(x) 调用之前
预取张量每层: attn.in_proj_weight, attn.out_proj.weight, mlp.c_fc.weight, mlp.c_proj.weight
预取总数12 layers × 4 = 48 个权重张量
累计权重大小12 × (768×768 + 768×768 + 768×3072 + 3072×768) × 4 bytes ≈ 169 MB
精度影响无(纯 DMA 预取,计算语义不变)
文本编码不走 prefetch(小 batch 下 overhead > 收益)

其他尝试

尝试结果说明
AMP FP16❌ 0.63xLayerNorm 回退 FP32 导致降速
torch.compile❌ 1.00x动态 shape + 图中断,无收益
npu_fusion_attention✅ 已自动使用Profiling 确认已使用 FlashAttentionScore
GE 图模式❌ 不适用Tile 数量随图像尺寸动态变化

Profiling 热点分析

算子类别占比说明
MatMulV2 (Linear)41.2%MLP + Attention 投影
FlashAttentionScore15.1%已使用融合注意力算子
LayerNormV310.5%融合 LayerNorm
其他 (Transpose, Add, GeLU)~33.2%数据搬运与激活函数

精度验证

VisA 12 类 AUROC 对比

类别Baseline AUROCOptimized AUROCΔ
candle0.95760.95760.0000 ✅
capsules0.84480.84480.0000 ✅
cashew0.91000.91000.0000 ✅
chewinggum0.95440.95440.0000 ✅
fryum0.76240.76240.0000 ✅
macaroni10.78600.78600.0000 ✅
macaroni20.67430.67430.0000 ✅
pcb10.78740.78740.0000 ✅
pcb20.51920.51920.0000 ✅
pcb30.70190.70190.0000 ✅
pcb40.83920.83920.0000 ✅
pipe_fryum0.71360.71360.0000 ✅
平均0.78760.78760.0000

✅ 所有 12 类别 AUROC 完全一致(Δ = 0.0000 < 0.01),满足精度要求。

论文复现

来源VisA AUROC说明
论文 CLIP-AC 基线59.3%直接 CLIP 零样本
论文 WinCLIP (Table 1)78.1%CVPR 2023
本项目 NPU78.76%Ascend 910B4-1 优化后
Δ vs 论文+0.66%略高于论文报告值

许可证

  • 模型代码: MIT License
  • VisA 数据集: LICENSE-DATASET