本目录是
patrickjohncyh/fashion-clip(CLIPModel)在昇腾 Ascend 910B4 上使用 torch_npu 的离线零样本图像分类(zero-shot-image-classification)适配与交付文档。 所有推理结果均为真实运行结果,日志与结构化证据见logs/;模型权重全程使用本地文件,不联网、不重新下载。 目标设备:npu: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;license: mit)。任务定义(Fashion-CLIP 需比较 image/text 候选):对一张输入图片与若干文本候选标签,分别编码图像特征与文本特征,用归一化余弦相似度 × 学习到的 logit_scale 得到 logits,经 softmax 得到每个候选标签的概率,取最高者为分类结果。本交付在 inference.py 中显式调用 get_image_features / get_text_features 完成该比较。
| 项 | 值 |
|---|---|
| 源仓库(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) |
| 权重 SHA256 | 4977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc9 |
本地 git master | 7e3ba62ce16b379a1ab479346b66f192e76f51b7(与固定 revision 一致) |
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 文件)| 项 | 值 |
|---|---|
| 主机 | Linux aarch64(昇腾容器) |
| Python | 3.11.14 |
| 昇腾 AI 处理器 | Ascend 910B4-1(npu-smi 显示 8 × 910B4-1) |
| CANN | 8.5.1(ASCEND_HOME_PATH=/usr/local/Ascend/cann-8.5.1) |
| Driver / npu-smi | 25.5.1 |
| PyTorch | 2.9.0+cpu(昇腾基础镜像预装,未替换) |
| torch_npu | 2.9.0(昇腾基础镜像预装,显式 import torch_npu 注册 NPU backend) |
| transformers | 4.57.6 |
| safetensors | 0.8.0 |
| numpy | 1.26.4 |
| Pillow | 12.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) |
torch 与 torch_npu 由昇腾基础镜像预装,不列入 requirements.txt,避免普通 PyPI 覆盖 NPU 配套包:
| 预装包 | 版本 |
|---|---|
| torch | 2.9.0+cpu |
| torch_npu | 2.9.0 |
仓库提供精确固定版本的 requirements.txt:
| 包 | 版本 |
|---|---|
| transformers | 4.57.6 |
| safetensors | 0.8.0 |
| numpy | 1.26.4 |
| Pillow | 12.3.0 |
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。
# 模型(便携默认路径:/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.pngpython3 make_test_image.py --out inputs/fashion_test_image.png --seed 7python3 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指定即可。
cat logs/npu_result.jsongrep -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| 参数 | 必填 | 默认 | 说明 |
|---|---|---|---|
--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 输出路径 |
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.jsonlogs/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
==========================================================================make_test_image.py 自绘的 CC0 黑色鞋剪影(白底商品图风格)。a black shoe,a handbag 0.288356 次之;语义合理,证明 image/text 双塔比较链路在 NPU 上真实生效。pixel_values / input_ids / attention_mask)、模型与输出 logits 全部位于 npu: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
}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。
| 截图 | 尺寸 | 数据来源 |
|---|---|---|
assets/agent_workflow.png | 1440x1800 | logs/modelagent_workflow.log |
assets/npu_device_call.png | 1440x900 | logs/npu_device_call_active.log(npu_device_call.log 的含活动进程窗口) |
assets/model_result.png | 1440x900 | logs/npu_inference.log |
assets/modelagent_live_session.png | 1440x900 | 由编排器基于 logs/modelagent_transcript.log 生成 |
本交付严禁静默回退 CPU,并在代码与运行结果双重落实:
inference.py 显式 import torch_npu(注册 NPU backend),缺省不可用。torch.npu.is_available() == False → die(...),退出码 1;torch.npu.device_count() == 0 → die(...),退出码 1;die(...),退出码 2;--device 非 npu:<idx> 形式 → die(...),退出码 2。.to(device) 移到 NPU 后才推理。pixel_values / input_ids / attention_mask / model / logits 均位于请求的 NPU 设备,否则 die(...)。input_device == model_device == output_device == npu:1(见第 7/8 节)。inputs/fashion_test_image.png:由 make_test_image.py 程序化自绘(512x512 RGB,白底黑色鞋剪影),非任何受版权保护的照片;自创作品按 CC0 1.0(https://creativecommons.org/publicdomain/zero/1.0/)发布,可自由再分发。7e3ba62ce16b379a1ab479346b66f192e76f51b7(见第 2 节)。| 问题 | 原因 | 解决方案 |
|---|---|---|
No module named 'torch_npu' | 未在昇腾环境中运行,或 venv 未继承系统 site-packages | 使用 python3 -m venv --system-site-packages 创建 venv,并在昇腾容器内运行 |
torch.npu.is_available()==False | CANN 环境未加载 | source /usr/local/Ascend/ascend-toolkit/set_env.sh |
--device 解析报错 | 传了 cuda:0 或 cpu | 只传 npu:<idx> 形式 |
| 设备超范围 | 请求索引 ≥ torch.npu.device_count() | 改传容器内可见的设备索引 |
| 结果全为 CPU | pip 覆盖了预装 torch | 重新从昇腾基础镜像恢复 torch/torch_npu 配对,只用阿里云源装应用依赖 |
path string is NULL 打印 | 昇腾 driver 退出时的无害提示 | 忽略;不影响结果(已从 npu_inference.log 清洗) |
| 首次推理耗时偏高 | 含模型加载与算子图编译 | 热启动后单次推理明显更快 |
| 文件 | 说明 |
|---|---|
inference.py | NPU 推理脚本(torch_npu,fail-closed,无 CPU fallback) |
make_test_image.py | CC0 测试图片生成脚本 |
render_screenshots.py | 截图渲染脚本(从真实日志渲染 PNG) |
requirements.txt | 固定版本依赖(不含 torch/torch_npu) |
readme.md / README.md | 本文档(两份内容完全一致) |
.gitignore | 忽略字节码/缓存/临时编译产物 |
inputs/fashion_test_image.png | CC0 测试图片(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.log | npu-smi 并发监控全量日志 |
logs/npu_device_call_active.log | 含 NPU 1 活动进程的监控窗口 |
logs/npu_result.json | 结构化推理结果 |
logs/modelagent_workflow.log | ModelAgent 工作流日志(截图数据源) |
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
# 4977e3a54929eccf065ce449aeaf296f0e5cb6b28e8798c3c97d67cb2f6dafc97e3ba62ce16b379a1ab479346b66f192e76f51b7/work/pipeline/skills/adapting-models-for-ascend-npu/scripts/validate_delivery.py


