z
zkx_/vit-age-classifier-ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

vit-age-classifier on Ascend NPU

1. 简介

本文档记录 nateraw/vit-age-classifier 年龄分类模型在昇腾 NPU(Ascend 910B3)上的迁移适配、精度评测与性能验证结果。

该模型基于 ViT(Vision Transformer)架构,在面部图像数据集上微调,支持将人脸图像分为 9 个年龄段:0-2、3-9、10-19、20-29、30-39、40-49、50-59、60-69、more than 70。输入图像通过 AutoImageProcessor 预处理为 224×224 分辨率,输出 9 维 softmax 概率分布。

相关获取地址:

  • 权重下载地址(ModelScope):nateraw/vit-age-classifier
  • 权重下载地址(HuggingFace):https://huggingface.co/nateraw/vit-age-classifier

2. 验证环境

组件版本
torch2.8.0
torch_npu2.8.0.post4
transformers5.8.1
CANN8.5.1
  • NPU:8 × Ascend 910B3
  • 精度对比基准:CPU(x86, PyTorch 2.8.0)

3. 部署使用流程

3.1 环境准备

conda create -n vit-age-classifier python=3.11 -y
conda activate vit-age-classifier

pip install torch==2.8.0 torch_npu==2.8.0.post4 \
    -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install transformers torchvision pillow numpy \
    -i https://pypi.tuna.tsinghua.edu.cn/simple

3.2 模型权重下载

# ModelScope 下载
modelscope download --model nateraw/vit-age-classifier \
    --local_dir ./vit-age-classifier

# 或 HuggingFace 镜像下载
HF_ENDPOINT=https://hf-mirror.com \
    huggingface-cli download nateraw/vit-age-classifier \
    --local-dir ./vit-age-classifier

3.3 推理脚本使用

# 单张图片推理
python inference.py --image face.jpg --device npu

# 文件夹批量推理
python inference.py --image_dir ./images/ --device npu

编程接口调用:

from inference import AgeClassifier

classifier = AgeClassifier(model_path="./vit-age-classifier", device="npu")
results = classifier.predict(["face.jpg"])
# results[0] → {'20-29': 0.85, '30-39': 0.10, ...}

4. Smoke 验证

基础功能检查:

python inference.py --image face.jpg --device npu

预期输出:

  • 按概率降序排列的年龄段及其置信度
  • 无运行时错误或 NPU 设备异常

5. 性能参考

测试条件:10 张随机生成 224×224 合成图像(固定随机种子保证可复现),batch_size=8,NPU 预热 1 轮后取正式推理数据。

指标数值
CPU 吞吐量3.5 img/s
NPU 吞吐量240.9 img/s
CPU/NPU 加速比68.2 ×

ViT 模型在 NPU 上推理加速效果显著,主要得益于 NPU 对 Transformer 结构的算子优化。batch_size=8 时延迟与吞吐达到良好平衡。

6. 精度评测

6.1 评测方法

分别在 CPU 和 NPU 上对 10 张合成图像进行推理(固定随机种子,保证输入一致),比较:

  • softmax 概率向量余弦相似度:衡量 NPU 与 CPU 输出方向一致性
  • 逐元素 MAE(平均绝对误差):衡量概率值精度
  • Top-1 分类准确率:最高概率标签是否一致

6.2 评测结果

指标数值
平均余弦相似度0.999998
MAE(逐元素平均)0.000191
最大元素误差0.000739
精度误差率0.0002%
Top-1 准确率100.0%

结论:精度误差率 0.0002%,远低于 1% 要求,Top-1 分类结果与 CPU 完全一致,评测通过。

7. 迁移适配说明

7.1 模型结构

vit-age-classifier 使用标准 ViT 架构:

  • Backbone:ViT-base-patch16-224(12 层 Transformer,768 维隐藏层)
  • Head:线性分类头(768 → 9)
  • 输入:224×224 RGB 图像,切分为 16×16 patches
  • 输出:9 维 softmax 概率,对应 9 个年龄段

7.2 适配要点

该模型为标准 ViT 架构,NPU 适配无需修改模型结构:

  1. 使用 AutoModelForImageClassification.from_pretrained() 加载权重
  2. model.to("npu:0") 迁移到 NPU 设备
  3. AutoImageProcessor 在 CPU 上完成图像预处理(resize、normalize),返回 tensor 后通过 .to(device) 转移
  4. 输出 logits 通过 torch.softmax() 计算概率后 .cpu().numpy() 转回 CPU

关键代码:

import torch, torch_npu
from transformers import AutoImageProcessor, AutoModelForImageClassification

model = AutoModelForImageClassification.from_pretrained("vit-age-classifier").to("npu:0")
processor = AutoImageProcessor.from_pretrained("vit-age-classifier")

inputs = processor(images=image, return_tensors="pt")
inputs = {k: v.to("npu:0") for k, v in inputs.items()}

with torch.no_grad():
    outputs = model(**inputs)
    probs = torch.softmax(outputs.logits, dim=-1)

8. 注意事项

  1. 输入格式:图像需为 RGB 格式(PIL Image 或 numpy array),AutoImageProcessor 自动完成 resize 到 224×224 和归一化。灰度图需先转换为 RGB。
  2. NPU 预热:首次推理会触发 NPU 算子编译(耗时约 3-5 秒),建议在正式推理前执行一次预热调用。
  3. batch_size 选择:由于 ViT 模型较大(85.8M 参数),大 batch 可能导致 NPU 内存不足。推荐 batch_size ≤ 8,单卡推理可最大化吞吐。
  4. 多卡场景:当前推理使用单 NPU(npu:0),如需多卡并行推理,可修改 device 参数分别指定不同 NPU ID。
  5. 合成图像评测:精度评测使用合成随机图像而非真实人脸照片,因为评测焦点在 NPU 与 CPU 算子输出一致性,而非模型本身的分类能力。