转换成onnx的注意事项

转换成onnx的注意事项:

1)对于任意用到shape、size返回数的时候,避免直接使用tensor.size()的返回值,而是加上int转换,例如tensor.view(-1,int(tensor.size(1)));
2)对于nn.upsample或者nn,functional.interpolate函数,使用scale_factor指定倍数,而不是使用size参数指定大小(对于无法使用倍数的,可以使用size来指定大小);
3)对于reshape、view操作时,batch维度用-1来指定,其他维度可以通过计算得到(方便动态batch);
4) torch.cat改变维度后,在对其数据进行softmax;不然,会出现下面例子的错误(具体原因希望有大佬能解释一下)。

简单案例

遇到一个很奇怪的问题,生存的onnx模型转换成tensorrt模型时,FP32和FP16的转换是正常的,但是在转成INT8模型时,会报以下错误:

error: 2: [standardEngineBuilder.cpp::getSupportedFormats::152] Error Code 2: Internal Error (Assertion !layerImpls.empty() failed. Node has no runners that implement it)

原因和解决方法:这是可能因为生成onnx中的节点存在不规范的问题,按照转换成onnx的注意事项来修改

我的处理方法:

        cls_logits[:, :2] = softmax(cls_logits[:, :2])
        cls_logits[:, 2:2 + 2] = softmax(cls_logits[:, 2:2 + 2])
        cls_logits[:, 4:2 + 4] = softmax(cls_logits[:, 4:2 + 4])
        reg_proposals = torch.cat([cls_logits, self.anchors[:, 2 + 4:4 + 4], self.anchors[:, 4 + 4:] + reg], dim=1)

修改为

        reg_proposals = torch.cat([cls_logits, self.anchors[:, 2 + 4:4 + 4], self.anchors[:, 4 + 4:] + reg], dim=1)
        cls_logits[:, :2] = softmax(cls_logits[:, :2])
        cls_logits[:, 2:2 + 2] = softmax(cls_logits[:, 2:2 + 2])
        cls_logits[:, 4:2 + 4] = softmax(cls_logits[:, 4:2 + 4])

参考文献:
tensorRT高性能部署

你可能感兴趣的:(tensorrt,onnx,TensorRT)