ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CN_CLIP多模态模型实战案例:Triton ge-backend从转换到调优的全流程优化记录

CN_CLIP多模态模型实战案例:Triton ge-backend从转换到调优的全流程优化记录 CN_CLIP多模态模型实战案例Triton ge-backend从转换到调优的全流程优化记录【免费下载链接】triton-inference-server-ge-backendge-backend基于triton inference server框架实现对接NPU生态快速实现传统CV\NLP等模型的服务化。项目地址: https://gitcode.com/cann/triton-inference-server-ge-backendtriton-inference-server-ge-backend是基于 Triton Inference Server 框架对接昇腾 NPU 生态的推理插件能快速实现传统 CV/NLP/多模态模型的服务化部署。本文以中文多模态模型CN_CLIPChinese-CLIP为实战案例完整记录从模型转换、接入 NPU到 Profiling 定位瓶颈、逐步调优的全过程吞吐最终从90 infer/sec 提升至 850 infer/sec提升近 10 倍。 为什么用 Triton ge-backend 服务 CN_CLIPCN_CLIP 是一种图文对比学习预训练的多模态模型广泛用于图文相似度计算、跨模态检索、零样本图片分类等任务。要把它跑在昇腾 NPU 上并对外提供高并发服务ge-backend 提供了这些关键能力GE 组图推理基于 C 实现支持 GE 图优化、UB 融合、多流并行等特性榨取 NPU 性能动态/静态图切换静态图可提前分配好显存执行过程完全下沉 NPU消除 CPU 瓶颈多流并行 锁核多实例并发时合理切分 AICore 核提升整体吞吐多卡、多实例、动态 batch满足生产级高并发场景。整个后端的核心实现位于 src/npu_ge.cpp、src/scheduler.cpp接口定义可参考 include/scheduler.h。项目特性总览见 README.md。 第一步模型转换 —— 导出可部署的 ONNXNPU 侧统一采用ONNX格式接入转换要点有三个修改 forward 返回值去掉logit_scale.exp()这类无 shape 的返回config.pbtxt 中必须声明输出 shape否则模型无法运行只保留image_features和text_features占位输入用一张固定分辨率的空图 tokenize 后的空文本作为导出占位符输入内容不重要torch.onnx.export 导出设置input_names[image,text]、opset_version14动态 batch 场景需声明dynamic_axes若要做全静态图则不设置dynamic_axes。完整导出代码与说明见 docs/CN_CLIP模型优化示例.mdONNX 各 shape 类型的支持情况见 docs/快速入门.md。 小技巧导出的 ONNX 可以先用onnxsim工具做一轮图简化这一步后面还会专门带来惊喜。 第二步动态图转静态图 —— 用 Profiling 定位瓶颈ONNX 模型编译后默认走动态图模式每个节点的 tiling 计算都在 CPU 侧完成单 batch 场景下极易出现 HostBound 问题。采集 Profiling 数据方法见 docs/tools/Profiling.md是第一手证据上图是 CN_CLIP 动态图的 Profiling 时间线1 个 batch 下 NPU 侧红色行出现大量空隙CPU 侧节点NodeExecuteOpQueue与 NPU 执行明显不同步典型的HostBound。揪出图下沉截断的元凶Mod 算子打开静态图开关后再次采集会发现部分节点已下沉为 static而中途又变回 dynamic。此时打开op_summary_*.csv逐行检查执行模式即可定位表格清晰显示执行到visual/transformer/resblocks/.../attn/Mod时模式从 static 变成了 dynamic且它本身是 AI_CPU 类算子。用 Netron 打开 ONNX 图查看这个 Mod 节点Mod 的上游是一个 Add 计算输入为常量3 - 1 2而2 Mod 3 2每层结果都是固定值——也就是说这个 Mod 节点可以直接删除让 Add 的结果 2 直接接到下游。用 AI 工具生成删图代码、修改 ONNX 后重新采集 Profiling全部节点变为 static整图成功下沉✅动态图 vs 静态图吞吐对比单 Instance1 并发压测结果一目了然模式吞吐 (infer/sec)平均延迟动态图90.1710715 usec静态图237.823840 usec同样的硬件、同样的模型仅把动态图转为静态图单 Instance 吞吐就提升了 2.6 倍延迟从 10.7ms 降到 3.8ms。这就是执行过程完全下沉 NPU 的威力。⚡ 第三步模型优化 —— onnxsim 简化 ONNX 图转静态图后模型里常残留大量输入全是常量的固定计算节点编译器不会自动消除它们。这里onnxsim工具就能派上用场把固定节点向下合并消除 Mod 这类无意义节点。优化效果Constant算子从 880 个降到 169 个Cast从 91 个降到 0Div从 50 个降到 26 个节点数大幅下降模型体积也从 395MB 降到 331MB。图越精简NPU 编译与执行效率越高。 第四步多流并行 锁核单 Instance 的静态图吞吐已达 237但还有更高并发潜力。ge-backend 中当instance_group.count 1时自动采用多流并行执行通过启动参数即可开启并为每条流锁核限制其使用的 Cube/Vector 核数量避免小模型大材小用式的核资源浪费--backend-confignpu_ge,ge.aicoreNum12|1012|10表示每条流限制使用 12 个 Cube 核、10 个 Vector 核。8 并发压测对比配置8并发吞吐 (infer/sec)优化后静态图 多流并行629.32静态图 多流并行 锁核850.17限制每条流的 CV 核数后整体吞吐又提升了约 35%。锁核参数属于经验值建议结合 Profiling 观察 CV 核实际占用情况逐步逼近最优详见 docs/性能调优方法论.md。 第五步ENSEMBLE 流水线 —— 前后处理上移服务端CN_CLIP 的原始输入是 RGB 图片约 147KB预处理成 Numpy 张量后变为 588KB——数据量翻了 4 倍。如果前处理放在客户端网络传输就会成为 Bound。Triton 原生支持 Python Backend 和Ensemble能力可以把「Python 预处理 → NPU 推理 → Python 后处理」串成一条服务端流水线改造方式preprocessPython Model 接收 PNG 字节流在服务端完成解码、resize、归一化clip_ensembleEnsemble 模型仓把preprocess和cn_clip两步用ensemble_scheduling串接输出侧同理可挂后处理模型把特征向量转成类别字符串进一步减小回传数据量。实测 CN_CLIP 单独服务为 836.8 infer/secENSEMBLE 流水线达到847.6 infer/sec还有小幅提升。更典型的案例Yolo11 模型上前处理把图片放大成 [1,3,3600,3600] 的张量从 500KB 膨胀到 74MB线上吞吐仅 30qps改造为 Ensemble 流水线后吞吐提升至 90qps提升 200%详细配置模板含 config.pbtxt见 docs/CN_CLIP模型优化示例.md。✅ 优化效果总结回顾 CN_CLIP 从转换到调优的完整路径每一步都有明确收益优化阶段并发吞吐 (infer/sec)累计提升动态图初始190.17-动态转静态图1237.822.6x静态图 多流并行8629.327.0x 锁核8850.179.4x ENSEMBLE 流水线-847.6- 本次优化未涉及自动融合和融合 PASS因容器化部署 batch 固定为 256也未采用小 batch 自动合并方案。若你的场景是动态小 batch可参考 docs/性能调优方法论.md 中的合并配置另有惊喜。 延伸资料想复现或继续深入推荐按顺序阅读docs/快速入门.md从 0 到 1 完成镜像、编译、模型目录创建与服务启动docs/CN_CLIP模型优化示例.md本案例的完整原始记录含全部配置模板docs/性能调优方法论.md小 batch 合并、分档静态图、锁核、fp16 等通用调优手段docs/tools/Profiling.md、docs/tools/Plog.md、docs/tools/DumpGE.md三大定位工具手册示例工程example/resnet/config.pbtxt、example/client.py可作为新模型接入的模板遇到问题先看 docs/问题定位.md。一句话总结模型转换是基础Profiling 是指路标——先静态图、再精简图、后并行锁核、最后 Ensemble 流水线四步走就能把 CN_CLIP 的 NPU 吞吐拉满 10 倍。【免费下载链接】triton-inference-server-ge-backendge-backend基于triton inference server框架实现对接NPU生态快速实现传统CV\NLP等模型的服务化。项目地址: https://gitcode.com/cann/triton-inference-server-ge-backend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表