Skip to content

Instantly share code, notes, and snippets.

@hewumars
Last active January 22, 2021 04:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hewumars/ac36cb74b5238322055a2e1e3f44e7a3 to your computer and use it in GitHub Desktop.
Save hewumars/ac36cb74b5238322055a2e1e3f44e7a3 to your computer and use it in GitHub Desktop.

TRT7.1.3支持到Opset 11 TensorFlow2.0使用tf.saved_model.save自定义保存模型 python3 -m tf2onnx.convert

错误问题

  1. Use tf.compat.v1.graph_util.extract_sub_graph AssertionError: unknown_317 is not in graph
  2. trt不支持Round,改用tf.floor或者tf.ceil解决
  3. trt不支持NonZero,由于tf.where(condition, x=None, y=None, name=None)的x,y没有赋值导致,补全xy解决 indices = tf.reshape(tf.where(attention_prob >= abs_thres,tf.ones_like(attention_prob,dtype=tf.int64),tf.zeros_like(attention_prob,dtype=tf.int64)), [-1])
  4. Opset10时trt报错ERROR: builtin_op_importers.cpp:2549 In function importResize: Assertion failed: scales.is_weights() && "Resize scales must be an initializer!" ,使用Opset12转换
  5. trt不支持>=,GreaterOrEqual,改为>
  6. builtin_op_importers.cpp:436 In function importConv: Assertion failed: inputs.at(2).is_weights()
  7. tf2onnx时Use tf.compat.v1.graph_util.extract_sub_graphAssertionError: unknown_317 is not in graph 貌似一定要tf.while_loop
  8. 最后使用convert_to_constants.py转换pb文件成功,saved_model直接转onnx转换不成功
  9. 再用pb文件转成onnx,加--inputs-as-nchw input名字,不会再input后添加transpose层 CUDA_VISIBLE_DEVICES=2 python3 -m tf2onnx.convert --input frozen_models/complex_frozen_graph.pb --inputs x:0 --outputs Identity:0,Identity_1:0,Identity_2:0 --opset 12 --output model_delg.onnx --fold_const --inputs-as-nchw OP_NAME --verbose
  10. ./trtexec.exe --onnx=model_delg.onnx --explicitBatch 测试,因为input是4-dims,需要添加--explicitBatch选项
  11. [4] Assertion failed: !_importer_ctx.network()->hasImplicitBatchDimension() && "This version of the ONNX parser only supports TensorRT INetworkDefinitions with an explicit batch dimension. Please ensure the network was created using the EXPLICIT_BATCH NetworkDefinitionCreationFlag." 为啥只支持显式批处理
  12. GeM操作中的avg_pool2d里面转onnx。改成F.avg_pool2d(x.clamp(min=eps,max=3.4e38).pow(p), kernel_size=(8,8一定要是常数).pow(1./p)以后就能导出了,clamp(min和max都要设置常数)
  13. F.avg_pool2d转onnx算子是要把kernel_size设置成常数 Assertion failed: inputs.at(2).is_weights() && "Clip max value must be an initializer!" Clip层max值没有初始化?修改F.normalize函数去掉clamp_min(eps)
from absl import app
from absl import flags
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2

FLAGS = flags.FLAGS

flags.DEFINE_string('saved_model_dir', '/tmp/delf', 'WithTensorBoard logdir.')
flags.DEFINE_string('saved_model_dir_trt', '/tmp/delf', 'WithTensorBoard logdir.')
def main(argv):
    print(f'{FLAGS.saved_model_dir}')
    _model = delg_model.Delg(block3_strides=False, name='DELG')
    _model.load_weights('%s/delf_weights' % FLAGS.saved_model_dir)
    tf.keras.backend.set_learning_phase(0)
    full_model = tf.function(lambda x: _model.build_call(x, training=False))
    full_model = full_model.get_concrete_function(x=tf.TensorSpec([None,128,128,3],tf.float32)) #TRT7.1.3要显式指定batchsize,不能填None
    frozen_func = convert_variables_to_constants_v2(full_model, lower_control_flow=False)
    frozen_func.graph.as_graph_def()

    layers = [op.name for op in frozen_func.graph.get_operations()]
    print("-" * 50)
    print("Frozen model layers: ")
    for layer in layers:
        print(layer)

    print("-" * 50)
    print("Frozen model inputs: ")
    print(frozen_func.inputs)
    print("Frozen model outputs: ")
    print(frozen_func.outputs)

    tf.io.write_graph(graph_or_graph_def=frozen_func.graph,
                        logdir="./frozen_models",
                        name="complex_frozen_graph.pb",
                        as_text=False)
                        
if __name__ == '__main__':
  app.run(main)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment