Chinese-CLIP 部署完整实战:ONNX 与 TensorRT 转换加速指南
【免费下载链接】Chinese-CLIPChinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation.项目地址: https://gitcode.com/GitHub_Trending/ch/Chinese-CLIP
本文以 Chinese-CLIP ViT-B-16 为例,走通 Chinese-CLIP 部署全流程:环境速配、PyTorch → ONNX → TensorRT 两级模型转换、最小推理代码,以及实测推理时延与零样本精度对比,面向生产级图文检索落地。
选型先行:什么场景用 ONNX,什么场景用 TensorRT
先给结论。需要跨平台(CPU 或多厂商 GPU)交付、快速上线的,选 ONNX:ONNX Runtime 生态成熟、模型可携带,FP16 版本开箱即用。固定 NVIDIA GPU 上追求 Chinese-CLIP TensorRT 推理加速、把时延压到最低的,选 TensorRT:实测 ViT-B/16 文本侧时延从 12.47ms 降到 1.54ms,约 8 倍提速。两者 FP16 下与 PyTorch 的 zero-shot 图文检索精度差距在 ±0.1 以内,生产可用。
Chinese-CLIP 部署环境速配:两条命令装齐全部依赖
硬件与软件要求合并在一张表里,注意版本匹配链:TensorRT 8.5.x ↔ cuDNN 8.6.0 ↔ CUDA 11.6,任何一环不匹配都会出现晦涩的加载报错。
| 项目 | 推荐版本 / 配置 | 说明 |
|---|---|---|
| GPU | NVIDIA Volta 架构及以上 | 需配备 FP16 Tensor Core |
| 显存 | 16GB 及以上 | 本文测速环境为 T4(16GB) |
| CUDA | 11.6+ | 核心计算平台 |
| cuDNN | 8.6.0+ | 必须与 TensorRT 版本匹配 |
| TensorRT | 8.5.x(本文 8.5.2.2) | 高性能推理引擎 |
| ONNX / onnxruntime-gpu | 1.13.0 / 1.13.1 | 中间格式与推理运行时 |
| PyTorch | 1.12.1+ | 直接安装 cu116 版本 |
代码不在本地可先克隆:git clone https://gitcode.com/GitHub_Trending/ch/Chinese-CLIP,然后一条命令装齐核心依赖:
pip install tensorrt==8.5.2.2 onnx==1.13.0 onnxruntime-gpu==1.13.1 pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116Chinese-CLIP 模型转换两级流水线:PyTorch → ONNX → TensorRT 🚀
TensorRT 不直接读 PyTorch checkpoint,唯一路径是先转 ONNX 再建引擎。仓库 cn_clip/deploy/ 内置两个转换脚本,按顺序跑完两级即可。
第一步:PyTorch → ONNX(Chinese-CLIP ONNX 转换)
以 ViT-B-16 为例,一次导出文本侧与图像侧,各得 FP32/FP16 两份文件:
python cn_clip/deploy/pytorch_to_onnx.py \ --model-arch ViT-B-16 \ --pytorch-ckpt-path pretrained_weights/clip_cn_vit-b-16.pt \ --save-onnx-path deploy/vit-b-16 \ --convert-text --convert-vision参数说明:
--model-arch:模型规模,可选RN50、ViT-B-16、ViT-L-14、ViT-L-14-336、ViT-H-14--pytorch-ckpt-path:PyTorch checkpoint 路径(预训练或微调均可),须与规模对应--save-onnx-path:输出路径前缀,实际生成.txt/.img×.fp32/.fp16共 4 个.onnx--convert-text/--convert-vision:指定导出文本侧 / 图像侧编码器--context-length(可选):文本序列长度,默认 52
注意 FP16 文件附带一个.extra_file(外置权重),它与.onnx必须同目录且不可改名。
第二步:ONNX → TensorRT(Chinese-CLIP TensorRT 引擎构建)
用第一步的 FP16 ONNX 建引擎,单个规模耗时几分钟到十几分钟:
python cn_clip/deploy/onnx_to_tensorrt.py \ --model-arch ViT-B-16 \ --convert-text --text-onnx-path deploy/vit-b-16.txt.fp16.onnx \ --convert-vision --vision-onnx-path deploy/vit-b-16.img.fp16.onnx \ --save-tensorrt-path deploy/vit-b-16 \ --fp16参数说明:
--model-arch:规模,须与 ONNX 输入一致--text-onnx-path/--vision-onnx-path:第一步产出的两个 ONNX 文件--save-tensorrt-path:输出前缀,生成.txt.fp16.trt与.img.fp16.trt--fp16:以 FP16 构建(要求 Volta 及以上)--convert-text/--convert-vision:指定构建哪一侧
不想自己构建可直接使用官方预转换的 FP16 引擎(基于 TensorRT 8.5.2.2),下载后放入deploy/即可:
| 模型规模 | 图像侧引擎 | 文本侧引擎 |
|---|---|---|
| RN50 | rn50.img.fp16.trt | rn50.txt.fp16.trt |
| ViT-B/16 | vit-b-16.img.fp16.trt | vit-b-16.txt.fp16.trt |
| ViT-L/14 | vit-l-14.img.fp16.trt | vit-l-14.txt.fp16.trt |
| ViT-L/14@336px | vit-l-14-336.img.fp16.trt | vit-l-14-336.txt.fp16.trt |
| ViT-H/14 | vit-h-14.img.fp16.trt | vit-h-14.txt.fp16.trt |
最小可运行示例:5 行代码跑通 Chinese-CLIP TensorRT 推理
转换出的引擎固定 batch=1,一次处理一张图或一条文本;图像输入为[1,3,分辨率,分辨率],文本侧先用clip.tokenize分词、序列长度 52 与转换时--context-length保持一致。TensorRT 侧写法如下(ONNX 侧同理,用 onnxruntime 载入.fp16.onnx,传 CPU 张量,输入名image/text,输出名unnorm_image_features/unnorm_text_features):
from cn_clip.deploy.tensorrt_utils import TensorRTModel img_engine = TensorRTModel("deploy/vit-b-16.img.fp16.trt") image = preprocess(Image.open("examples/pokemon.jpeg")).unsqueeze(0).cuda() feats = img_engine(inputs={"image": image})["unnorm_image_features"] feats = feats / feats.norm(dim=-1, keepdim=True) # 归一化图像特征其中preprocess由clip.utils.image_transform按模型输入分辨率生成。特征算出后,图文特征内积乘以logit_scale.exp()(官方预训练值为 4.6052,即乘 100)再 softmax,即得相似概率。
Chinese-CLIP 推理时延与零样本精度验证
测试环境:单卡 T4(16GB)、Xeon Platinum 8163 @ 2.5GHz(16 核)、64GB 内存。三种格式模型均 FP16、batch=1,各执行 100 次特征提取取均值(ms/样本):
| 模型规模 | 图像 PyTorch | 图像 ONNX | 图像 TensorRT | 文本 PyTorch | 文本 ONNX | 文本 TensorRT |
|---|---|---|---|---|---|---|
| RN50 | 12.93 | 5.04 | 1.36 | 3.64 | 0.95 | 0.58 |
| ViT-B/16 | 11.12 | 4.92 | 3.58 | 12.47 | 3.42 | 1.54 |
| ViT-L/14 | 21.19 | 17.10 | 13.08 | 12.45 | 3.48 | 1.52 |
| ViT-L/14@336px | 47.11 | 48.40 | 31.59 | 12.24 | 3.25 | 1.54 |
| ViT-H/14 | 35.10 | 34.00 | 26.98 | 23.98 | 6.01 | 3.89 |
MUGE 图文检索 zero-shot 精度(R@1):
| 模型格式 | ViT-B/16 R@1 | ViT-H/14 R@1 |
|---|---|---|
| PyTorch | 52.1 | 63.0 |
| ONNX | 52.0 | 62.9 |
| TensorRT | 52.0 | 62.9 |
结论:两种格式与 PyTorch 仅差 ±0.1,精度基本无损,而 TensorRT 对小规模模型的提速尤为显著。
Chinese-CLIP 部署常见坑位与 FAQ ⚠️
- cuDNN 与 TensorRT 版本不匹配:TensorRT 8.5.x 必须搭配 cuDNN 8.6.0。建议随 torch cu116 轮子一并处理 cuDNN,不要用 conda 安装 cudatoolkit,cuDNN 版本漂移会直接导致 TRT 构建失败。
- FP16 建不出来:Volta 之前的 GPU(如 Pascal 一代)没有 FP16 Tensor Core,此时改用
--fp32构建或升级显卡。 - 显存不足:ViT-H/14 等大规模引擎构建期显存占用较高,建议 16GB 以上;OOM 时换大显存机器构建一次,产物可复用。
- extra_file 丢失:ONNX FP16 权重存于外置
.extra_file,.onnx内记录其路径,重命名或移动文件会加载失败;转换时输出前缀尽量用相对路径。 - TRT 版本漂移:
.trt引擎不保证跨版本加载,运行环境的 TensorRT 版本必须与构建时一致(8.5.2.2)。 - 输入形状写死:引擎按 batch=1、文本序列 52 构建,运行时要改这两个参数必须重新构建。
一句话总结:ONNX 负责跨平台交付,TensorRT 负责极致 GPU 时延,两级流水线跑完,Chinese-CLIP 部署即可投产。相关资源:cn_clip/deploy/(转换与推理加速脚本)、cn_clip/eval/(ONNX/TensorRT 特征提取与评测脚本)、deployment.md(官方部署文档)、speed_benchmark.py(时延测试脚本)。
【免费下载链接】Chinese-CLIPChinese version of CLIP which achieves Chinese cross-modal retrieval and representation generation.项目地址: https://gitcode.com/GitHub_Trending/ch/Chinese-CLIP
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考