SigLIP2模型离线推理指导
概述
SigLIP 是改进损失函数后的 CLIP 多模态模型,可用于零样本图像分类、图文检索等任务。 SigLIP 2模型在SigLIP的原始训练目标基础上,增加了额外的目标,以提升语义理解、定位和密集特征提取能力。SigLIP 2兼容SigLIP,用户只需要更换模型权重和tokenizer,可以按照相同的步骤进行模型推理。 本文档以 siglip2-so400m-patch14-384 为例介绍离线推理步骤。 在线推理可以参考TorchAir目录下的指导。
输入输出数据
-
输入数据
输入数据 大小 数据类型 数据排布格式 text labelnums x 64 INT32 ND image bs x 3 x 384 x 384 FLOAT32 NCHW -
输出数据
输出数据 大小 数据类型 数据排布格式 text_feature labelnums x 1152 FLOAT32 ND image_feature bs x 1152 FLOAT32 ND
推理环境准备
-
该模型需要以下插件与驱动
表 1 版本配套表
| 配套 | 版本 | 环境准备指导 |
|---|---|---|
| 固件与驱动 | 25.2.0 | Pytorch框架推理环境准备 |
| CANN | 8.2.RC1 | - |
| Python | 3.11 | - |
| PyTorch | 2.4.0 | - |
| Ascend Extension PyTorch | 2.4.0.post2 | - |
| 说明:Atlas 800T A2 推理卡请以CANN版本选择实际固件与驱动版本 | \ | \ |
快速上手
获取源码
-
获取本仓源码。
git clone https://gitcode.com/Ascend/ModelZoo-PyTorch.git cd ModelZoo-PyTorch/ACL_PyTorch/built-in/foundation_models/SigLIP2 -
安装离线推理所需依赖。
pip3 install -U pip && pip3 install -r requirements.txt
模型推理
-
模型转换。
使用PyTorch将模型权重文件转换为.onnx文件,再使用ATC工具将.onnx文件转为离线推理模型文件.om文件。
-
获取权重文件。
mkdir models下载权重文件siglip2-so400m-patch14-384 置于 models 目录下。
-
导出onnx文件。
python3 pth2onnx.py \ --pytorch_ckpt_path models/siglip2-so400m-patch14-384 \ --save_onnx_path models/ \ --convert_text \ --convert_vision- 参数说明
- --pytorch_ckpt_path: Pytorch模型权重路径
- --save_onnx_path: 输出ONNX格式模型的路径
- --convert_text: 指定是否转文本侧模型
- --convert_vision: 指定是否转图像侧模型
运行成功后,使用models目录下生成的 siglip2_text_encoder.onnx 和 siglip2_vision_encoder.onnx 文件进行后续操作。
- 参数说明
-
使用ATC工具将ONNX模型转OM模型。
- 配置环境变量。
source /usr/local/Ascend/ascend-toolkit/set_env.sh说明: 该脚本中环境变量仅供参考,请以实际安装环境配置环境变量。详细介绍请参见《CANN 开发辅助工具指南 (推理)》。
- 执行命令查看芯片名称(${chip_name})。
npu-smi info #该设备芯片名为Ascend${chip_name} (自行替换) 回显如下: +-------------------|-----------------|------------------------------------------------------+ | NPU Name | Health | Power(W) Temp(C) Hugepages-Usage(page) | | Chip | Bus-Id | AICore(%) Memory-Usage(MB) | +===================+=================+======================================================+ | 0 ${chip_name} | OK | 102.0 49 0 / 0 | | 0 | 0000:82:00.0 | 0 0 / 0 4130 / 65536 | +===================+=================+======================================================+ | 1 ${chip_name} | OK | 97.4 49 0 / 0 | | 0 | 0000:89:00.0 | 0 0 / 0 3622 / 65536 | +===================+=================+======================================================+- 执行ATC命令。
# 例如 export labelnums=1000 && export chip_name=XXX atc --model=models/siglip2_text_encoder.onnx \ --framework=5 \ --output=models/siglip2_text_encoder_labelnums${labelnums} \ --input_format=ND \ --input_shape="input_ids:${labelnums},64" \ --log=error \ --soc_version=Ascend${chip_name} # 例如 export bs=24 && export chip_name=XXX atc --model=models/siglip2_vision_encoder.onnx \ --framework=5 \ --output=models/siglip2_vision_encoder_bs${bs} \ --input_format=NCHW \ --input_shape="image:${bs},3,384,384" \ --log=error \ --soc_version=Ascend${chip_name}- 参数说明:
- --model:为ONNX模型文件。
- --framework:5代表ONNX模型。
- --output:输出的OM模型。
- --input_format:输入数据的格式。
- --input_shape:输入数据的shape。
- --log:日志级别。
- --soc_version:处理器型号。
-
-
开始推理验证。
-
安装ais_bench推理工具。
请访问ais_bench推理工具代码仓,根据readme文档进行工具安装。
-
性能验证。
纯推理性能测试命令如下:
# export labelnums=1000 python3 -m ais_bench --model models/siglip2_text_encoder_labelnums${labelnums}.om --loop 50 # export bs=24 python3 -m ais_bench --model models/siglip2_vision_encoder_bs${bs}_linux_aarch64.om --loop 50 -
精度验证。 本模型使用ImageNet ILSVRC 2012验证集进行推理测试。
- 获取原始数据集。(解压命令参考tar -xvf *.tar与 unzip *.zip) 用户自行获取数据集后,上传数据集并解压。数据集目录结构如下所示:
ImageNet/ |-- val | |-- ILSVRC2012_val_00000001.jpeg | |-- ILSVRC2012_val_00000002.jpeg | |-- ILSVRC2012_val_00000003.jpeg | ... |-- val_label.txt ...- 下载标签集合文件命名为imagenet1000_clsidx_to_labels.txt置于SigLIP2目录下。
- 数据预处理,将原始数据集转换为模型的输入数据。
python3 preprocess.py --data_dir ImageNet/val \ --image_save_dir image_save_dir \ --text_save_dir text_save_dir \ --pytorch_ckpt_path models/siglip2-so400m-patch14-384 \ --classnames_file imagenet1000_clsidx_to_labels.txt- 参数说明:
- --data_dir:数据集所在路径。
- --image_save_dir:生成的image数据集二进制文件的路径。
- --text_save_dir:生成的标签二进制文件的路径。
- --pytorch_ckpt_path: Pytorch模型ckpt路径。
- --classnames_file:标签集合文件。
- 执行推理。
# 推理得到图像特征 python3 -m ais_bench \ --model models/siglip2_vision_encoder_bs${bs}_linux_aarch64.om \ --batchsize ${bs} \ --input image_save_dir \ --output image_feature_result \ --output_dirname result_bs${bs} \ --outfmt TXT # 推理得到文本特征 python3 -m ais_bench \ --model models/siglip2_text_encoder_labelnums${labelnums}.om \ --batchsize ${labelnums} \ --input text_save_dir \ --output text_feature_result \ --output_dirname result_labelnums${labelnums} \ --outfmt TXT- 参数说明:
- --model:om模型路径。
- --batchsize:批次大小。
- --input:输入数据所在路径。
- --output:推理结果输出路径。
- --output_dirname:推理结果输出子文件夹。
- --outfmt:推理结果输出格式。
- 后处理。 用脚本与数据集真值标签val_label.txt比对,打屏Accuracy数据。
python3 postprocess.py --text_feature_result text_feature_result/result_labelnums${labelnums} \ --image_feature_result image_feature_result/result_bs${bs} \ --gt_file ImageNet/val_label.txt \ --label_nums ${labelnums} \ --pytorch_ckpt_path models/siglip2-so400m-patch14-384-
参数说明:
- --text_feature_result:文本特征所在路径。
- --image_feature_result:图像特征所在路径。
- --gt_file:真值标签文件所在路径。
- --label_nums:使用的数据集的标签类别总数。
- --pytorch_ckpt_path:Pytorch模型ckpt路径。
-
模型推理性能&精度
调用ACL接口推理计算,模型纯推理性能数据参考如下数据。
- 文本侧模型:
| 硬件形态 | Input Shape(labelnums x seqlen) | Texts Per Second |
|---|---|---|
| Atlas 800T A2 (8*64G) 单卡 | 1 x 64 | 214.66 |
| Atlas 800T A2 (8*64G) 单卡 | 3 x 64 | 140.1 |
| Atlas 800T A2 (8*64G) 单卡 | 10 x 64 | 71.92 |
| Atlas 800T A2 (8*64G) 单卡 | 100 x 64 | 13.2 |
| Atlas 800T A2 (8*64G) 单卡 | 1000 x 64 | 1.26 |
- 图像侧模型:
| 硬件形态 | Input Shape(bs x channels x height x width) | Frames Per Second |
|---|---|---|
| Atlas 800T A2 (8*64G) 单卡 | 1 x 3 x 384 x 384 | 61.46 |
| Atlas 800T A2 (8*64G) 单卡 | 4 x 3 x 384 x 384 | 81.04 |
| Atlas 800T A2 (8*64G) 单卡 | 8 x 3 x 384 x 384 | 82.93 |
| Atlas 800T A2 (8*64G) 单卡 | 16 x 3 x 384 x 384 | 78.71 |
| Atlas 800T A2 (8*64G) 单卡 | 24 x 3 x 384 x 384 | 81.48 |
| Atlas 800T A2 (8*64G) 单卡 | 32 x 3 x 384 x 384 | 80.45 |
模型OM部署的推理精度数据参考如下数据。
| 硬件形态 | 数据集 | 精度 | 参考精度(GPU A10) |
|---|---|---|---|
| Atlas 800T A2 (8*64G) 单卡 | ImageNet | top1: 74.07 | top1: 74.10 |