我看过onnx了只有一个这个算子
只有一个也可能在工具链优化时发生冲突,重点看下 logits_per_image 和 logits_per_text 之间是不是有 Transpose,你这两个输出都是 [1,1],可以先做个副本只保留一个 logits 输出跑 checker 对照一下,再试下没做 slim 的原始 ONNX。
判断:报错发生在 Start to optimize the onnx model 到 End to optimize the onnx model 之间(09:12:21–09:12:33),量化和 BPU 编译都还没开始,所以与 bayes-e 算子支持、校准集无关——是工具链在图改写阶段往 graph.output 里追加变量时,发现同名输出已经存在。
“我看过 onnx 只有一个这个算子”排不掉它:报错对象是图输出名,不是算子个数;而且日志里 graph output 名字被截断(…er_image / …per_text),实际有 8 个输出(两个 logits + div/div_1/index/add_24/layer_norm_25)。先按名字核对,不用跑工具链:
import onnx
m = onnx.load("clip-vit-b-32_opset11_ir9_shape_single_slim.onnx")
outs = [o.name for o in m.graph.output]
print(outs)
print("重名:", [n for n in set(outs) if outs.count(n) > 1])
for n in m.graph.node:
if any("logits_per_image" in o for o in n.output):
print(n.op_type, n.name, list(n.output))
看两点:输出列表里有没有重名项;logits_per_image 的 producer 是不是 Transpose/Reshape——你 yaml 里的 remove_node_type 正好在删这几类。
两个候选原因,分别验证
remove_node_type: Quantize;Transpose;Dequantize;Cast;Reshape;Softmax;DequantizeFilter。文档要求被删节点必须位于模型输入/输出边界,且按顺序逐个删除、动态更新结构;删除输出侧节点时会改写图输出来接管原输出,推断此时若新名字与已有输出同名就会撞上这句报错。另外DequantizeFilter不在文档列出的可删类型内,建议去掉。验证:复制一份 yaml,remove_node_type: '',其余不动,只跑 makertbin 对照。- ONNX 图本身:slim 导出把中间层和最终结果一起当输出,容易出现重复输出或被节点名占用的输出名。用 onnx 只保留需要的输出重新 save 再转。
checker 不能用来对照 yaml:hb_mapper checker 走的是默认 yaml 配置,不读你的 remove_node_type,所以它能验证 ONNX 图干不干净,验证不了“删节点”这一步;开/关 remove_node_type 的差异只能用 makertbin 对照。
CLIP 这条路线顺带简化:图文匹配只需要 div/div_1([1,512] 的 image/text embedding),logits 那层 MatMul 和 index 在板端用不上,导出时直接剪掉;再把图像塔和文本塔拆成两个 ONNX(视觉塔上 BPU、文本塔 CPU 或离线预计算特征),比一个带 logits 的大图好编也好调。
参考:hb_mapper makertbin 参数说明(含 remove_node_type / output_nodes)、hb_mapper checker 用法。
还差一个信息:剪掉 logits 后如果仍报同样的话,说明冲突出在 div/div_1 这类输出上,把报错里完整的变量名贴出来(当前日志被截断),我按那个名字定位。
我去 还真是专家啊
这个工具链能编这中模型嘛 ?我想问
CLIP 的图像编码器能编译上 X5 BPU。你这份图文合并 ONNX 能否整网转过,还得逐算子核对,不能保证原样转换;官方现成方案是图像 BPU、文本 CPU。前面的 logits_per_image already exists 属于图优化输出冲突,本身不代表不支持 Transformer。
https://github.com/D-Robotics/rdk_model_zoo/tree/main/samples/vision/clip/conversion