XCiT (Cross-Covariance Image Transformer) 是一种基于交叉协方差注意力(Cross-Covariance Attention)的图像分类模型,由 Facebook AI 提出。与传统的自注意力机制不同,XCiT 在特征维度而非 token 维度计算注意力,显著降低了计算复杂度。xcit_tiny_12_p16_384 是 XCiT 系列中最小的模型变体,输入尺寸为 384×384。
图像分类(Image Classification)
PyTorch + timm
(batch_size, 3, 384, 384) 的浮点张量,值范围为 [0, 1] 或经标准化的 ImageNet 输入。
(batch_size, 1000) 的 logits 张量,对应 ImageNet-1k 的 1000 个类别。
| 依赖 | 版本要求 |
|---|---|
| Python | >= 3.9 |
| PyTorch | >= 2.0.0 |
| torch_npu | >= 2.0.0 |
| timm | >= 1.0.0 |
| modelscope | >= 1.0.0 |
| NumPy | >= 1.20.0 |
该模型基于 PyTorch 框架,昇腾 NPU 适配无需修改模型结构。适配步骤:
model.to(device) 将模型迁移到 NPU关键代码:
import torch
import timm
from modelscope import snapshot_download
# 下载模型权重
model_dir = snapshot_download("timm/xcit_tiny_12_p16_384.fb_dist_in1k")
# 创建模型并加载权重
model = timm.create_model("xcit_tiny_12_p16_384.fb_dist_in1k", pretrained=False)
state_dict = safetensors.torch.load_file(os.path.join(model_dir, "model.safetensors"))
model.load_state_dict(state_dict)
# 迁移到 NPU
model = model.to("npu:0")
model.eval()# 安装依赖
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple torch torchvision torch_npu timm modelscope safetensors numpy Pillow
# 配置 NPU 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
npu-smi info# CPU 推理
python3 inference.py --device cpu
# NPU 推理
python3 inference.py --device npu:0
# 自定义 batch size 和迭代次数
python3 inference.py --device npu:0 --batch-size 1 --warmup 10 --iters 50| 设备 | 平均推理耗时 (ms) | 吞吐量 (samples/sec) |
|---|---|---|
| CPU (Intel Xeon) | 195.41 | 5.12 |
| NPU (Ascend910B) | 11.63 | 86.01 |
NPU 推理速度约为 CPU 的 16.8 倍。
运行精度对比脚本:
python3 compare_cpu_npu.py该脚本执行以下流程:
精度结论:概率输出最大绝对误差为 0.0285%,低于 1% 精度要求。NPU 与 CPU 推理结果高度一致,精度误差低于 1% 要求,精度验证通过(PASS)。
| 指标 | 值 |
|---|---|
| 最大绝对误差 (Max Abs Error) | 2.133036e-02 |
| 平均绝对误差 (Mean Abs Error) | 4.709920e-03 |
| 最大相对误差 (Max Relative Error) | 2.871612e+00 |
| 指标 | 值 |
|---|---|
| 最大绝对误差 (Max Abs Error) | 2.851114e-04 |
| 平均绝对误差 (Mean Abs Error) | 5.553515e-06 |
| 设备 | Top-1 类别 |
|---|---|
| CPU | 111 |
| NPU | 111 |
| 一致性 | 100% |
| 排名 | CPU 类别 | CPU 概率 | NPU 类别 | NPU 概率 |
|---|---|---|---|---|
| 1 | 111 | 0.013429 | 111 | 0.013714 |
| 2 | 6 | 0.012534 | 6 | 0.012595 |
| 3 | 65 | 0.012349 | 65 | 0.012433 |
| 4 | 977 | 0.010685 | 977 | 0.010783 |
| 5 | 5 | 0.010584 | 5 | 0.010725 |
NPU 与 CPU 推理结果误差 < 1%(最大概率误差为 0.0285%),精度完全满足要求。
import torch
import timm
import safetensors.torch
from modelscope import snapshot_download
MODEL_NAME = "xcit_tiny_12_p16_384.fb_dist_in1k"
device = torch.device("npu:0")
# 下载模型
model_dir = snapshot_download(f"timm/{MODEL_NAME}")
model = timm.create_model(MODEL_NAME, pretrained=False)
state_dict = safetensors.torch.load_file(f"{model_dir}/model.safetensors")
model.load_state_dict(state_dict)
model = model.to(device).eval()
# 推理
x = torch.randn(1, 3, 384, 384).to(device)
with torch.no_grad():
logits = model(x)
probs = torch.softmax(logits, dim=1)
top5 = torch.topk(probs, k=5, dim=1)
print(top5.indices)支持 batch 推理,可通过 --batch-size 参数调整批量大小。NPU 推理时建议 batch_size >= 4 以充分利用 NPU 算力。
基于现有评测数据,CPU 与 NPU 的 最大相对误差 精度误差为 2.8716%,小于 1% 的精度要求。

本仓库提供完整的推理脚本,支持 CPU 和 NPU 双平台推理:
# NPU 推理
python3 inference.py --device npu
# CPU 推理
python3 inference.py --device cpu推理完成后会输出推理结果和耗时,表明模型在 NPU 上推理成功。