wrhhh/Freepik-nsfw_image_detector-NPU
模型介绍
文件和版本
Pull Requests
讨论
分析

Freepik/nsfw_image_detector on Ascend NPU

1. 模型简介

  • 模型名称: Freepik/nsfw_image_detector (commit 15b8547)
  • 类型: 图像分类 / NSFW 4级分类 (neutral / low / medium / high)
  • 架构: TimmWrapperForImageClassification (model_type: timm_wrapper, eva02_base_patch14_448.mim_in22k_ft_in22k_in1k, hidden 768, num_classes 4, patch 14, input 448x448)
  • 原始权重: https://huggingface.co/Freepik/nsfw_image_detector (model.safetensors 165 MB, 86.35M 参数, transformers 4.48.1, torch_dtype bfloat16, license mit, base_model timm/eva02_base_patch14_448)
  • 任务: 输入 448x448 RGB 图像,输出 4维 logits,经 softmax 得每类概率,按阈值可做二分类(low/medium/high 为 NSFW)或完整概率输出;本仓提供固定 seed 合成图像的 NPU 端到端验证
  • 适配: 纯 PyTorch + torch_npu,AutoModelForImageClassification.from_pretrained(local, dtype=bfloat16).to(npu:0) + timm GetPretrainedCfg + create_transform(resolve_data_config),无隐式联网,本地目录 /tmp/Freepik-nsfw_image_detector (HF_ENDPOINT=https://hf-mirror.com)

2. 验证环境

  • 硬件: Ascend910_9362 x2, 推理 npu:0 (Phy 4 Bus 0000:0B:00.0 Health OK, HBM 3109/65536 MB 使用, Temp 43C, npu-smi 25.5.5)
  • 驱动: CANN 8.5.1 (/usr/local/Ascend/cann-8.5.1)
  • 软件: Python 3.11.14, torch 2.9.0+cpu, torch_npu 2.9.0.post1+gitee7ba04, transformers 4.57.6, timm 1.0.28, Pillow 12.2.0, numpy 1.26.4, safetensors
  • 加载: 本地权重 172725672 bytes (0.161 GiB), torch_dtype bfloat16, device npu:0, 首参 npu:0 bfloat16 shape (1,1,768)(cls_token), 86.35M 参数
  • 输入: 确定性合成图像 seed=0, 448x448 RGB 随机 uint8 -> timm pipeline Resize(448)+CenterCrop(448)+Normalize mean [0.48145,0.45782,0.40821] std [0.26863,0.26130,0.27578] -> tensor [1,3,448,448] bfloat16

3. 安装依赖

pip install -r requirements.txt
# 需预装 CANN Toolkit 8.5.1 使 torch_npu 可用
# 权重已缓存于 /tmp/Freepik-nsfw_image_detector (model.safetensors 172725672 bytes)
# 离线可通过 HF_ENDPOINT=https://hf-mirror.com 走国内镜像 snapshot_download

4. NPU 推理

python inference.py
# 或指定模式
python inference.py --mode validate   # CPU vs NPU 一致性
python inference.py --mode benchmark  # 3 warmup + 10 iters 同步计时
python inference.py --device npu:0 --dtype bfloat16

5. 真实推理结果

  • 命令: python inference.py (device npu:0, bfloat16, 合成图 seed 0, torch.npu.synchronize 计时)
  • 设备: npu:0 Ascend910_9362, torch_npu 2.9.0.post1, torch.npu.is_available() True, 模型首参 npu:0 bfloat16
  • 输入: tensor [1,3,448,448] bfloat16 (min -1.79 max 2.13 float32归一化前)
  • 输出 logits [5.2812, -0.9336, -2.4531, -2.1094] (neutral, low, medium, high)
  • 概率 (softmax float):
  neutral  : 0.996955  (logit 5.2812)
  low      : 0.001993  (logit -0.9336)
  high     : 0.000615  (logit -2.1094)
  medium   : 0.000436  (logit -2.4531)
  Top-1: neutral (0.9970) probs sum 1.000000
  • 延迟: 首次端到端 227.22 ms (含 processor+forward+同步, 含首次编译), 稳定 forward 见性能节
  • 结果: PASS (logits 有限, probs 和 ≈1)

6. CPU-NPU 一致性验证

  • 命令: python inference.py --mode validate
  • 对比: 同一张合成图、同 dtype bfloat16, CPU 与 npu:0 同步推理
CPU logits: [5.25, -0.9140625, -2.4375, -2.09375]
NPU logits: [5.28125, -0.93359375, -2.453125, -2.109375]
CPU probs: [0.99680149, 0.00209696, 0.00045705, 0.00064455]
NPU probs: [0.99695527, 0.00199344, 0.00043619, 0.00061513]
Max abs diff logits: 0.031250
Mean abs diff logits: 0.020508
Max abs diff probs: 0.000154
Top-1 CPU: neutral NPU: neutral match=True
  • 判定: bfloat16 容差 0.05, PASS (分类一致、数值差异在半精度预期内)
  • 说明: 单样本 smoke consistency,非完整数据集评测;NPU 与 CPU 结果在 bfloat16 精度下高度一致

7. 性能测试

  • 命令: python inference.py --mode benchmark (torch.npu.synchronize 前后计时)
  • 条件: npu:0, bfloat16, 输入 [1,3,448,448], 3 warmup + 10 iters
  • 结果 (同步 forward, 不含 processor):
 iter 1: 9.44 ms
 iter 2: 9.44 ms
 iter 3: 9.44 ms
 iter 4: 9.47 ms
 iter 5: 9.47 ms
 iter 6: 9.46 ms
 iter 7: 9.43 ms
 iter 8: 9.47 ms
 iter 9: 9.40 ms
 iter 10: 9.40 ms
 avg 9.44 ms min 9.40 max 9.47 p50 9.44 p90 9.47 p95 9.47
 NPU memory free 62001.8 MB total 62740.0 MB
  • 首次 e2e 含 timm 预处理 227 ms,稳态仅模型 forward 约 9.4-9.5 ms,对应约 105 images/s (batch 1, 448)
  • 峰值显存: 推理时 HBM 3109 MB (npu-smi), 远低于 64 GiB 单卡上限

8. 自验证截图

  • assets/agent_workflow.png - 下载、侦察、加载、NPU 推理、验证、性能全流程日志
  • assets/npu_device_call.png - npu-smi info + torch.npu.is_available() + 设备名 + 模型参数 device/dtype
  • assets/model_result.png - python inference.py 默认输出 (任务结果、概率、延迟、PASS)

9. 已知限制

  • 输入固定 448x448 (EVA02 squash 模式, bicubic),非 448 图像会经 Resize+CenterCrop 规整,可能轻微改变宽高比
  • 推荐 dtype bfloat16 (训练即 bf16);float32 可用但显存与延迟略增,fp16 在 NPU 上未充分验证
  • 单样本一致性验证,非 COCO/ImageNet 全量评测;大规模 NSFW 数据集评测需离线批量脚本
  • timm 权重来自 timm/eva02_base_patch14_448,若需替换需重验;pipeline 模式在 NPU 上未使用,仅 transformers + timm transform
  • NPU 上首次推理含算子编译,后续稳态 ~9.4 ms;批量 (batch>1) 吞吐未在本文档测量

10. 标签

Hardware: NPU, NPU, Ascend, Ascend910, image-classification, nsfw, eva02, timm