atlasleong/fashion-clip-npu
模型介绍
文件和版本
Pull Requests
讨论
分析

Fashion-CLIP(patrickjohncyh/fashion-clip)· 昇腾 NPU 零样本图像分类交付

本目录是 patrickjohncyh/fashion-clip(CLIPModel)在昇腾 Ascend 910B4 上使用 torch_npu 的离线零样本图像分类(zero-shot-image-classification)适配与交付文档。 所有推理结果均为真实运行结果,日志与结构化证据见 logs/;模型权重全程使用本地文件,不联网、不重新下载。 目标设备:npu:1。


1. 模型简介

patrickjohncyh/fashion-clip(FashionCLIP 2.0)是一个面向时尚电商领域的 CLIP 双塔模型:

  • 结构:CLIPModel,视觉塔为 ViT-B/32(hidden_size=768,12 层,patch 32),文本塔为 masked self-attention Transformer(hidden_size=512,12 层,vocab_size=49408);
  • 投影维度:projection_dim=512,logit_scale_init_value=2.6592;
  • 基座:论文与模型卡说明该版本从 laion/CLIP-ViT-B-32-laion2B-s34B-b79K 继续微调(FashionCLIP 2.0),在 FMNIST/KAGL/DEEP 三项零样本基准上加权宏 F1 分别为 0.83 / 0.73 / 0.62;
  • 训练数据:Farfetch 数据集约 80 万(image, text)对,图片为白底商品图,文本为 highlight 与短描述的拼接;
  • 许可证:MIT(模型卡 license: mit)。

任务定义(Fashion-CLIP 需比较 image/text 候选):对一张输入图片与若干文本候选标签,分别编码图像特征与文本特征,用归一化余弦相似度 × 学习到的 logit_scale 得到 logits,经 softmax 得到每个候选标签的概率,取最高者为分类结果。本交付在 inference.py 中显式调用 get_image_features / get_text_features 完成该比较。


2. 模型源与固定版本(可复现性)

项值
源仓库(HuggingFace)https://huggingface.co/patrickjohncyh/fashion-clip
固定 revision(commit)7e3ba62ce16b379a1ab479346b66f192e76f51b7
镜像源(AtomGit,仅含 .gitattributes)https://ai.gitcode.com/hf_mirrors/patrickjohncyh/fashion-clip
权重实际拉取方式通过 hf-mirror.com/patrickjohncyh/fashion-clip 固定该 revision 拉取(AtomGit 镜像只含 .gitattributes,未提供权重字节)
本地模型目录/work/pipeline/models/cv9/fashion-clip
本地权重文件model.safetensors
权重大小605,157,890 bytes(≈ 605 MB / 564 MiB)
权重 SHA2564977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc9
本地 git master7e3ba62ce16b379a1ab479346b66f192e76f51b7(与固定 revision 一致)

2.1 本地模型文件清单

config.json                4,463 bytes
model.safetensors     605,157,890 bytes
merges.txt                524,657 bytes
vocab.json                862,328 bytes
tokenizer.json          2,224,041 bytes
tokenizer_config.json        568 bytes
preprocessor_config.json     316 bytes
special_tokens_map.json      389 bytes
onnx/                        (onnx 配置与 tokenizer 文件)

3. 运行环境(实测)

项值
主机Linux aarch64(昇腾容器)
Python3.11.14
昇腾 AI 处理器Ascend 910B4-1(npu-smi 显示 8 × 910B4-1)
CANN8.5.1(ASCEND_HOME_PATH=/usr/local/Ascend/cann-8.5.1)
Driver / npu-smi25.5.1
PyTorch2.9.0+cpu(昇腾基础镜像预装,未替换)
torch_npu2.9.0(昇腾基础镜像预装,显式 import torch_npu 注册 NPU backend)
transformers4.57.6
safetensors0.8.0
numpy1.26.4
Pillow12.3.0
NPU 可用性torch.npu.is_available()=True、torch.npu.device_count()=8、torch.npu.current_device()=1
目标设备npu:1(torch.npu.get_device_name(1) = Ascend910B4-1)

4. 环境依赖清单

4.1 昇腾基础镜像预装(不要用普通 PyPI 覆盖)

torch 与 torch_npu 由昇腾基础镜像预装,不列入 requirements.txt,避免普通 PyPI 覆盖 NPU 配套包:

预装包版本
torch2.9.0+cpu
torch_npu2.9.0

4.2 requirements.txt(固定版本)

仓库提供精确固定版本的 requirements.txt:

包版本
transformers4.57.6
safetensors0.8.0
numpy1.26.4
Pillow12.3.0

4.3 阿里云 PyPI 安装命令

pip install -i https://mirrors.aliyun.com/pypi/simple/ \
    --trusted-host mirrors.aliyun.com -r requirements.txt

本机已配置阿里云源(PIP_INDEX_URL=https://mirrors.aliyun.com/pypi/simple/),直接 pip install -r requirements.txt 亦可。若需为 torchvision 等使用 --no-deps,请确保 pip 不会替换预装的 torch/torch_npu。


5. 分步推理操作流程

步骤 1:确认模型与测试图片(均本地就绪,不联网)

# 模型(便携默认路径:/models/patrickjohncyh/fashion-clip,可用 --model-dir 覆盖)
ls -l /work/pipeline/models/cv9/fashion-clip/model.safetensors
sha256sum /work/pipeline/models/cv9/fashion-clip/model.safetensors
# 4977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc9

# 测试图片(CC0 自绘)
ls -l inputs/fashion_test_image.png

步骤 2:生成测试图片(可选,复现 CC0 输入)

python3 make_test_image.py --out inputs/fashion_test_image.png --seed 7

步骤 3:执行 NPU 推理

python3 inference.py \
    --model-dir /models/patrickjohncyh/fashion-clip \
    --image inputs/fashion_test_image.png \
    --labels "a black shoe,a red shoe,a handbag,a dress,a t-shirt,a cat" \
    --device npu:1 \
    --output-json logs/npu_result.json

便携默认模型路径为 /models/patrickjohncyh/fashion-clip;本容器实际权重位于 /work/pipeline/models/cv9/fashion-clip,运行时用 --model-dir 指定即可。

步骤 4:查看结果

cat logs/npu_result.json

步骤 5:查看 NPU 设备调用证据

grep -nE "^\|\s*1\s+0\s+\|" logs/npu_device_call.log   # 推理期间的 NPU 1 活动进程行
grep -n "EXIT_CODE" logs/npu_device_call.log           # EXIT_CODE=0

6. 参数表(inference.py)

参数必填默认说明
--model-dir否/models/patrickjohncyh/fashion-clip(可被环境变量 FASHION_CLIP_MODEL_DIR 覆盖)本地模型目录
--image否inputs/fashion_test_image.png输入图片路径
--labels否a black shoe,a red shoe,a handbag,a dress,a t-shirt,a cat逗号分隔的候选标签
--device否npu:1目标设备,仅接受 npu:<idx>,否则报错退出
--output-json否None结构化结果 JSON 输出路径

7. 完整测试用例(真实运行)

7.1 运行命令(本次交付实际执行)

cd /work/pipeline/jobs/cv9/fashion-clip/fashion-clip-npu
/work/pipeline/runtime/venvs-cv9/fashion-clip-npu/bin/python inference.py \
    --model-dir /work/pipeline/models/cv9/fashion-clip \
    --image inputs/fashion_test_image.png \
    --labels "a black shoe,a red shoe,a handbag,a dress,a t-shirt,a cat" \
    --device npu:1 \
    --output-json logs/npu_result.json

7.2 原始输出(stdout,保存于 logs/npu_inference.log)

[INFO] computing SHA256 of /work/pipeline/models/cv9/fashion-clip/model.safetensors (605157890 bytes) ...
[INFO] loading processor from /work/pipeline/models/cv9/fashion-clip
[INFO] loading CLIPModel from /work/pipeline/models/cv9/fashion-clip
==========================================================================
Fashion-CLIP (patrickjohncyh/fashion-clip) — NPU zero-shot classification
==========================================================================
source revision : 7e3ba62ce16b379a1ab479346b66f192e76f51b7
torch           : 2.9.0+cpu
torch_npu       : 2.9.0
transformers    : 4.57.6
safetensors     : 0.8.0
CANN            : env:cann-8.5.1
NPU available   : True
NPU device count: 8
NPU current dev : 1
NPU device name : Ascend910B4-1
device requested: npu:1
weights         : /work/pipeline/models/cv9/fashion-clip/model.safetensors
weights size    : 605157890 bytes
weights sha256  : 4977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc9
image           : .../inputs/fashion_test_image.png (512x512 RGB)
input device    : npu:1
text input dev  : npu:1
model device    : npu:1
output device   : npu:1
output shape    : [1, 6]
elapsed         : 4.5276 s
--- candidate probabilities ---
  a black shoe             0.663904
  a red shoe               0.000004
  a handbag                0.288356
  a dress                  0.033187
  a t-shirt                0.009630
  a cat                    0.004919
top label       : a black shoe
top score       : 0.663904
==========================================================================

7.3 结果解读

  • 输入为 make_test_image.py 自绘的 CC0 黑色鞋剪影(白底商品图风格)。
  • 模型将最高概率 0.663904 赋给候选 a black shoe,a handbag 0.288356 次之;语义合理,证明 image/text 双塔比较链路在 NPU 上真实生效。
  • 输入张量(pixel_values / input_ids / attention_mask)、模型与输出 logits 全部位于 npu:1。

8. 输出结果

8.1 logs/npu_result.json(结构化结果)

{
  "model_id": "patrickjohncyh/fashion-clip",
  "source_url": "https://huggingface.co/patrickjohncyh/fashion-clip",
  "source_revision": "7e3ba62ce16b379a1ab479346b66f192e76f51b7",
  "task": "zero-shot-image-classification",
  "engine": "torch_npu",
  "device_requested": "npu:1",
  "npu_available": true,
  "npu_device_count": 8,
  "npu_current_device": 1,
  "npu_device_name": "Ascend910B4-1",
  "cann_version": "env:cann-8.5.1",
  "torch_version": "2.9.0+cpu",
  "torch_npu_version": "2.9.0",
  "transformers_version": "4.57.6",
  "safetensors_version": "0.8.0",
  "model_path": "/work/pipeline/models/cv9/fashion-clip",
  "weights_file": "model.safetensors",
  "weights_size_bytes": 605157890,
  "weights_sha256": "4977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc9",
  "input_device": "npu:1",
  "text_input_device": "npu:1",
  "model_device": "npu:1",
  "image_features_device": "npu:1",
  "text_features_device": "npu:1",
  "output_device": "npu:1",
  "logits_device": "npu:1",
  "output_shape": [1, 6],
  "top_label": "a black shoe",
  "top_score": 0.663904,
  "elapsed_sec": 4.527558,
  "exit_code": 0
}

8.2 NPU 设备调用证据(logs/npu_device_call.log)

推理期间并发采样的 npu-smi info 记录到 NPU 1 上的活动 python 进程:

| 1       0                 | 441934        | python                   | 734                     |
...
EXIT_CODE=0

即:推理进程在 npu:1(Ascend910B4-1)上真实分配了设备内存(734 MB)并完成执行,最终退出码 0。

8.3 交付截图(由真实日志渲染)

截图尺寸数据来源
assets/agent_workflow.png1440x1800logs/modelagent_workflow.log
assets/npu_device_call.png1440x900logs/npu_device_call_active.log(npu_device_call.log 的含活动进程窗口)
assets/model_result.png1440x900logs/npu_inference.log
assets/modelagent_live_session.png1440x900由编排器基于 logs/modelagent_transcript.log 生成

9. NPU 无 CPU fallback 说明

本交付严禁静默回退 CPU,并在代码与运行结果双重落实:

  1. inference.py 显式 import torch_npu(注册 NPU backend),缺省不可用。
  2. 硬校验(任一不满足即报错退出,绝不回退):
    • torch.npu.is_available() == False → die(...),退出码 1;
    • torch.npu.device_count() == 0 → die(...),退出码 1;
    • 请求设备索引 ≥ 设备数 → die(...),退出码 2;
    • --device 非 npu:<idx> 形式 → die(...),退出码 2。
  3. 预处理(图片 resize/normalize、tokenize)在 CPU 上完成(transformers processor 为 CPU 原生);每个喂给模型的张量都显式 .to(device) 移到 NPU 后才推理。
  4. 推理后校验 pixel_values / input_ids / attention_mask / model / logits 均位于请求的 NPU 设备,否则 die(...)。
  5. 实测结果:input_device == model_device == output_device == npu:1(见第 7/8 节)。

10. 测试输入来源与许可证

  • 测试图片 inputs/fashion_test_image.png:由 make_test_image.py 程序化自绘(512x512 RGB,白底黑色鞋剪影),非任何受版权保护的照片;自创作品按 CC0 1.0(https://creativecommons.org/publicdomain/zero/1.0/)发布,可自由再分发。
  • 模型权重许可证:MIT(与测试图片许可证相互独立)。
  • 固定 revision:7e3ba62ce16b379a1ab479346b66f192e76f51b7(见第 2 节)。

11. 故障排查

问题原因解决方案
No module named 'torch_npu'未在昇腾环境中运行,或 venv 未继承系统 site-packages使用 python3 -m venv --system-site-packages 创建 venv,并在昇腾容器内运行
torch.npu.is_available()==FalseCANN 环境未加载source /usr/local/Ascend/ascend-toolkit/set_env.sh
--device 解析报错传了 cuda:0 或 cpu只传 npu:<idx> 形式
设备超范围请求索引 ≥ torch.npu.device_count()改传容器内可见的设备索引
结果全为 CPUpip 覆盖了预装 torch重新从昇腾基础镜像恢复 torch/torch_npu 配对,只用阿里云源装应用依赖
path string is NULL 打印昇腾 driver 退出时的无害提示忽略;不影响结果(已从 npu_inference.log 清洗)
首次推理耗时偏高含模型加载与算子图编译热启动后单次推理明显更快

12. 模型局限与使用限制

  • 领域偏差:FashionCLIP 面向白底商品图与较长文本描述;对自然场景、短查询或非时尚概念,效果会明显下降。
  • 性别/刻板印象:模型卡提示训练数据(如 "blue shoes for a woman")可能携带性别与时尚刻板印象。
  • 非部署用途声明:模型卡声明模型并非为直接部署开发,上线前需结合具体场景评估。
  • 资源占用:权重约 605 MB,加载与首次推理需保证 NPU HBM 充足。
  • 部署依赖:必须运行在预装 torch/torch_npu 的昇腾环境;用普通 PyPI 覆盖 torch 会使 NPU 不可用。
  • 许可证:模型权重 MIT;测试图片 CC0-1.0。使用时请遵守各自许可证条款。

13. 交付文件与校验

文件说明
inference.pyNPU 推理脚本(torch_npu,fail-closed,无 CPU fallback)
make_test_image.pyCC0 测试图片生成脚本
render_screenshots.py截图渲染脚本(从真实日志渲染 PNG)
requirements.txt固定版本依赖(不含 torch/torch_npu)
readme.md / README.md本文档(两份内容完全一致)
.gitignore忽略字节码/缓存/临时编译产物
inputs/fashion_test_image.pngCC0 测试图片(512x512)
assets/agent_workflow.png截图 1:ModelAgent 工作流(1440x1800)
assets/npu_device_call.png截图 2:NPU 设备调用证据(1440x900)
assets/model_result.png截图 3:模型结果(1440x900)
assets/modelagent_live_session.png截图 4:编排器由 logs/modelagent_transcript.log 生成(1440x900)
logs/npu_inference_raw.log原始推理 stdout 留痕
logs/npu_inference.log清洗后推理 stdout(供截图与文档引用)
logs/npu_device_call.lognpu-smi 并发监控全量日志
logs/npu_device_call_active.log含 NPU 1 活动进程的监控窗口
logs/npu_result.json结构化推理结果
logs/modelagent_workflow.logModelAgent 工作流日志(截图数据源)
logs/modelagent_transcript.log详细清洗后的 ModelAgent 会话转录
SHA256SUMS交付文件哈希清单(不含模型权重)

校验入口:

# 语法校验
python3 -m py_compile inference.py make_test_image.py render_screenshots.py

# 交付校验(validate_delivery.py)
python3 /work/pipeline/skills/adapting-models-for-ascend-npu/scripts/validate_delivery.py \
    /work/pipeline/jobs/cv9/fashion-clip/fashion-clip-npu

# 哈希校验
sha256sum -c SHA256SUMS

# 模型权重单独校验
sha256sum /work/pipeline/models/cv9/fashion-clip/model.safetensors
# 4977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc9

附录 A:参考资料

  • 模型卡:https://huggingface.co/patrickjohncyh/fashion-clip
  • FashionCLIP 论文:https://www.nature.com/articles/s41598-022-23052-9
  • 基座模型:https://huggingface.co/laion/CLIP-ViT-B-32-laion2B-s34B-b79K
  • 固定 revision:7e3ba62ce16b379a1ab479346b66f192e76f51b7
  • torch_npu:https://gitee.com/ascend/pytorch
  • 交付校验器:/work/pipeline/skills/adapting-models-for-ascend-npu/scripts/validate_delivery.py

昇腾 NPU 适配证据截图

Agent 完整适配工作流

Agent 完整适配工作流

ModelAgent 现场会话

ModelAgent 现场会话

NPU 硬件设备调用日志

NPU 硬件设备调用日志

模型最终适配验收结果

模型最终适配验收结果