PE-Core-S16-384 是 Meta Perception Encoder(PE)系列中的 CLIP 双塔模型:ViT-S/16 视觉塔(384px 输入,宽度 384,12 层,6 头,RoPE2D + attention pooling)+ 12 层文本 Transformer(上下文 32 token),输出 512 维对齐 embedding,用于零样本图像分类和图文检索。
本仓库将其适配到华为昇腾单卡 NPU(Ascend910B 系列,实测设备 Ascend910_9362),使用官方 perception_models/core/vision_encoder 加载代码(Apache-2.0,随仓库附带于 core/),权重从 HuggingFace facebook/PE-Core-S16-384 官方 checkpoint 加载。
| 项目 | 值 |
|---|---|
| NPU | Ascend910_9362(npu:0,64GB HBM) |
| CANN | 8.5.1 |
| torch / torch_npu | 2.9.0+cpu / 2.9.0.post1 |
| Python | 3.11 |
| 加载后端 | 官方 core.vision_encoder.pe.CLIP.from_config("PE-Core-S16-384") + 本地 .pt state_dict |
| dtype | float32(默认)/ float16 |
pip install -r requirements.txt权重首次运行时通过 huggingface_hub.snapshot_download("facebook/PE-Core-S16-384") 下载到本地缓存(依赖 HF_ENDPOINT=https://hf-mirror.com 环境变量走国内镜像);也可用 --weights-dir 指定已下载目录。
# 默认:npu:0 上零样本推理并输出 PASS/FAIL
python inference.py
# CPU-NPU 一致性验证
python inference.py --mode validate
# 性能测试(预热3次,正式10次)
python inference.py --mode benchmark
# 可选参数
python inference.py --dtype float16 --weights-dir /path/to/weights固定测试输入(全部公开可复现):官方示例图 test_images/cat.png,候选文本 ["a diagram", "a dog", "a cat", "a person riding a bike", "a bowl of soup", "a city skyline at night"],正确标签 "a cat",batch size 1,384×384。
python inference.py 在 npu:0(float32)真实输出:
device : npu:0 (Ascend910_9362)
image_embeds : (1, 512) | norm=1.000000
text_embeds : (6, 512)
logits : (1, 6) | logit_scale=100.0000
probs : [0.0, 0.000152, 0.999801, 3e-06, 4.4e-05, 0.0]
rank candidate logit
1 a cat 28.930220
2 a dog 20.136423
3 a bowl of soup 18.892487
4 a person riding a bike 16.264799
5 a diagram 14.262202
6 a city skyline at night 12.902191
top1 : a cat (expected: a cat)
peak_memory : 403.9 MB
result : PASS相同权重与输入分别运行 CPU 与 NPU(smoke consistency,固定单样例,非完整数据集评测):
| dtype | image_embed cosine | text_embed cosine | logits MAE | logits max_AE | Top-1 一致 | 排序完全一致 |
|---|---|---|---|---|---|---|
| float32 | 0.999998 | 1.000000 | 5.40e-03 | 1.37e-02 | 是 | 是 |
| float16 | 0.999996 | 1.000000 | 1.36e-02 | 2.25e-02 | 是 | 是 |
满足 FP32 cosine ≥ 0.9999、FP16 cosine ≥ 0.999 且 Top-1 一致的验收阈值。
npu:0、float32、batch=1、384px、6 条文本,预热 3 次、正式 10 次,计时前后均调用 torch.npu.synchronize():
| 阶段 | avg | min | max | p50 | p90 | p95 (ms) |
|---|---|---|---|---|---|---|
| 图像编码 | 12.07 | 11.53 | 12.55 | 12.33 | 12.55 | 12.55 |
| 文本编码(6条) | 6.62 | 6.53 | 6.70 | 6.65 | 6.70 | 6.70 |
| 端到端(编码+相似度) | 17.65 | 17.40 | 18.51 | 17.57 | 18.51 | 18.51 |
峰值显存 403.9 MB;约 83 images/s(图像编码稳定延迟)。首次冷启动含图初始化约 260ms。
python inference.py 真实输出与 PASS--weights-dir 提供本地权重。Hardware: NPU NPU Ascend Ascend910