CLIP(Contrastive Language-Image Pre-Training)是一个在多种(图像,文本)配对上训练的神经网络。它可以用自然语言进行指导,以预测给定图像最相关的文本片段,而无需直接针对该任务进行优化,这与GPT-2和3的零样本(zero-shot)能力类似。本例程对CLIP官方开源仓库中的算法进行移植,使之能在SOPHON BM1684X上进行推理。
- 支持BM1684X(x86 PCIe、SoC)
- 支持FP16(BM1684X)模型编译和推理
- 支持基于SAIL推理的Python例程
该模型目前只支持在1684X上运行,已提供编译好的bmodel,同时,您需要准备用于测试的数据集。
本例程在scripts
目录下提供了相关模型和数据的下载脚本download.sh
。
# 安装unzip,若已安装请跳过
sudo apt install unzip
chmod -R +x scripts/
./scripts/download.sh
下载的模型包括:
./models
├── BM1684X
│ ├── clip_image_vitb32_bm1684x_f16_1b.bmodel
│ ├── clip_image_vitb32_bm1684x_f16_8b.bmodel
│ ├── clip_image_vitb32_bm1684x_f16_16b.bmodel
│ ├── clip_image_vitb32_bm1684x_f16_32b.bmodel
│ ├── clip_text_vitb32_bm1684x_f16_4b.bmodel
│ └── text_projection_512_512.npy
└── onnx
├── clip_image_vitb32.onnx
└── clip_text_vitb32.onnx
./datasets
├── cifar-100-images
├── cifar-100-python
├── imagenet_val_1k
└── test
如果需要尝试自己编译模型,请参考下一节模型编译
导出的模型需要编译成BModel才能在SOPHON TPU上运行,此部分请参考Clip模型的导出与编译。如果使用下载好的BModel可跳过本节。建议使用TPU-MLIR编译BModel。
pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
sail安装方法可参考SAIL安装指南
python例程不需要编译,可以直接运行,PCIe平台和SoC平台的测试参数和运行方式是相同的。
usage: embeddings.py [--img_dir IMG_DIR] [--image_model IMAGE_MODEL] [--text_model TEXT_MODEL] [--dev_id DEV_ID] [--save_path SAVE_PATH]
--img_dir: 默认为'./datasets/imagenet_val_1k', help='Directory of input images.'
--image_model: 默认为'./models/BM1684X/clip_image_vitb32_bm1684x_f16_16b.bmodel', help='path of image bmodel'
--text_model: 默认为'./models/BM1684X/clip_text_vitb32_bm1684x_f16_4b.bmodel', help='path of text bmodel'
--save_path: 默认为'./results/embeddings.pkl', help='Path to save the embeddings.'
--dev_id: 默认为0, help='dev id'
bmcv版本采用硬件编解码,前处理和推理采用多线程并发
usage: embeddings_bmcv.py [--img_dir IMG_DIR] [--image_model IMAGE_MODEL] [--text_model TEXT_MODEL] [--dev_id DEV_ID] [--save_path SAVE_PATH]
--img_dir: 默认为'./datasets/imagenet_val_1k', help='Directory of input images.'
--image_model: 默认为'./models/BM1684X/clip_image_vitb32_bm1684x_f16_16b.bmodel', help='path of image bmodel'
--text_model: 默认为'./models/BM1684X/clip_text_vitb32_bm1684x_f16_4b.bmodel', help='path of text bmodel'
--save_path: 默认为'./results/embeddings.pkl', help='Path to save the embeddings.'
--max_que_size: 默认为128, help='Max size of queue.'
--dev_id: 默认为0, help='dev id'
编码图片文件夹
python3 embeddings.py --img_dir ./datasets/imagenet_val_1k --image_model ./models/BM1684X/clip_image_vitb32_bm1684x_f16_16b.bmodel --text_model ./models/BM1684X/clip_text_vitb32_bm1684x_f16_4b.bmodel --save_path ./results/embeddings.pkl --dev_id 0
bmcv、多线程版本
python3 embeddings_bmcv.py --img_dir ./datasets/imagenet_val_1k --image_model ./models/BM1684X/clip_image_vitb32_bm1684x_f16_16b.bmodel --text_model ./models/BM1684X/clip_text_vitb32_bm1684x_f16_4b.bmodel --save_path ./results/embeddings.pkl --max_que_size 128 --dev_id 0
结果存放在 ./results/embeddings.pkl
测试说明:
- text_model在本例程中用于初始化CLIP模型,并无实际运行
测试CIFAR100数据集准确率
python3 acc_eval.py --image_model ./models/BM1684X/clip_image_vitb32_bm1684x_f16_16b.bmodel --text_model ./models/BM1684X/clip_text_vitb32_bm1684x_f16_4b.bmodel --dev_id 0
测试说明:
- text_model在本例程中用于初始化CLIP模型,并无实际运行
在CIFAR100数据集上,精度测试结果如下:
测试平台 | 测试程序 | 测试模型 | ACC(%) |
---|---|---|---|
SE7-32 | acc_eval.py | clip_image_vitb32_bm1684x_f16_16b.bmodel | 80.080 |
测试说明:
- 在使用的模型相同的情况下,acc在不同的测试平台上是相同的。
- 由于SDK版本之间的差异,实测的精度与本表有1%以内的差值是正常的。
- 不同batch模型精度相同
使用bmrt_test测试模型的理论性能:
# 请根据实际情况修改要测试的bmodel路径和devid参数
bmrt_test --bmodel models/BM1684X/clip_image_vitb32_bm1684x_f16_1b.bmodel
测试结果中的calculate time
就是模型推理的时间,多batch size模型应当除以相应的batch size才是每张图片的理论推理时间。
测试各个模型的理论推理时间,结果如下:
测试模型 | calculate time(ms) |
---|---|
BM1684X/clip_image_vitb32_bm1684x_f16_1b.bmodel | 6.54 |
BM1684X/clip_image_vitb32_bm1684x_f16_8b.bmodel | 2.73 |
BM1684X/clip_image_vitb32_bm1684x_f16_16b.bmodel | 2.25 |
BM1684X/clip_image_vitb32_bm1684x_f16_32b.bmodel | 1.66 |
测试说明:
- 性能测试结果具有一定的波动性;
calculate time
已折算为平均每张图片的推理时间;- SoC和PCIe的测试结果基本一致。
测试数据集为./datasets/imagenet_val_1k
测试平台 | 测试程序 | 测试模型 | FPS |
---|---|---|---|
SE7-32 | embeddings.py | clip_image_vitb32_bm1684x_f16_8b.bmodel | 53.10 |
SE7-32 | embeddings.py | clip_image_vitb32_bm1684x_f16_16b.bmodel | 53.98 |
SE7-32 | embeddings.py | clip_image_vitb32_bm1684x_f16_32b.bmodel | 53.84 |
SE7-32 | embeddings_bmcv.py | clip_image_vitb32_bm1684x_f16_8b.bmodel | 325.04 |
SE7-32 | embeddings_bmcv.py | clip_image_vitb32_bm1684x_f16_16b.bmodel | 387.55 |
SE7-32 | embeddings_bmcv.py | clip_image_vitb32_bm1684x_f16_32b.bmodel | 473.87 |
测试说明:
- 性能测试结果具有一定的波动性,实测结果与该表结果有误差属正常现象,建议多次测试取平均值。
- BM1684X SoC的主控处理器为8核 ARM A53 42320 DMIPS @2.3GHz。
- FPS为每秒钟处理的图片数量,处理一张图片的时间包括前处理、推理、后处理时间
- bmcv的前处理resize接口与clip源码有些许差异
- embeddings.py使用官方torch vision前处理,fps受cpu影响较大
此仓库提供其他参考例程
如zeroshot_predict.py
Top predictions:
snake: 65.41%
turtle: 12.29%
sweet_pepper: 3.85%
lizard: 1.89%
crocodile: 1.74%
在运行embeddings.py或者embeddings_bmcv.py后,在results目录下生成embeddings.pkl
运行build_index.py,在results目录下生成index.faiss