本文档记录 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 概率分布。
相关获取地址:
nateraw/vit-age-classifier| 组件 | 版本 |
|---|---|
torch | 2.8.0 |
torch_npu | 2.8.0.post4 |
transformers | 5.8.1 |
CANN | 8.5.1 |
8 × Ascend 910B3conda 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# 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# 单张图片推理
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, ...}基础功能检查:
python inference.py --image face.jpg --device npu预期输出:
测试条件: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 时延迟与吞吐达到良好平衡。
分别在 CPU 和 NPU 上对 10 张合成图像进行推理(固定随机种子,保证输入一致),比较:
| 指标 | 数值 |
|---|---|
| 平均余弦相似度 | 0.999998 |
| MAE(逐元素平均) | 0.000191 |
| 最大元素误差 | 0.000739 |
| 精度误差率 | 0.0002% |
| Top-1 准确率 | 100.0% |
结论:精度误差率 0.0002%,远低于 1% 要求,Top-1 分类结果与 CPU 完全一致,评测通过。
vit-age-classifier 使用标准 ViT 架构:
该模型为标准 ViT 架构,NPU 适配无需修改模型结构:
AutoModelForImageClassification.from_pretrained() 加载权重model.to("npu:0") 迁移到 NPU 设备AutoImageProcessor 在 CPU 上完成图像预处理(resize、normalize),返回 tensor 后通过 .to(device) 转移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)AutoImageProcessor 自动完成 resize 到 224×224 和归一化。灰度图需先转换为 RGB。npu:0),如需多卡并行推理,可修改 device 参数分别指定不同 NPU ID。