Description
Getting TensorRT conversion failure due to ops not supported in TensorRT. Till now I have come to conclusion to optimize/prune the original tensorflow flow graph so that freeze graph should have only supported ops as per TensorRT and that should then convert easily to uff.
To do this, i want to remove training nodes which i think are unsupported nodes in uff conversion using TransformGraph. Option i used are below, other then Input shape change and “Identity” node no other node removed like : ‘switch’, ‘exit’, ‘add’.
- what options to choose in TransformGraph() to remove ‘switch’, ‘exit’, ‘add’ nodes?
- We use ‘from tensorflow.python.tools import freeze_graph’ to freeze our graph, is there any direct way to generate optimized graph from saved model format. I see that OpenVino (Intel GPU toolkit) has optimize_for_inferencing() method, can we similar function in Nvidia?*
- How to remove training nodes from freezed graph?
- How to remove prefix “layer6” from all nodes (ex: layer 6 from “layer6/Conv2D” “layer6/final_dense”?
- any direct TF API to directly prune the graph?
import tensorflow as tf
from tensorflow.tools.graph_transforms import TransformGraph
def optimize_graph(model_dir, graph_filename, transforms, output_node):
with tf.compat.v1.Session() as sess:
# shape=[1, ?, ?, 3] -> shape=[1, 128, 128, 3]
# name='image' specifies the placeholder name of the converted model
inputs = tf.compat.v1.placeholder(tf.uint8, shape=[1, 128, 128, 3], name='input_image_tensor')
with tf.io.gfile.GFile(graph_filename, 'rb') as f:
graph_def = tf.compat.v1.GraphDef()
graph_def.ParseFromString(f.read())
# 'image:0' specifies the placeholder name of the model before conversion
tf.graph_util.import_graph_def(graph_def, input_map={'image_tensor:0': inputs}, name='')
tf.graph_util.remove_training_nodes(graph_def, protected_nodes=None )
print([n for n in tf.compat.v1.get_default_graph().as_graph_def().node if n.name == 'input_image_tensor'])
optimized_graph_def = TransformGraph(
tf.compat.v1.get_default_graph().as_graph_def(),
'input_image_tensor',
[output_node],
transforms)
describe_graph(optimized_graph_def)
tf.io.write_graph(optimized_graph_def, model_dir, 'optimized_model.pb', as_text=False)
transforms = [
‘remove_nodes(op=Identity, op=CheckNumerics, op=TensorArray)’,
‘merge_duplicate_nodes’,
‘strip_unused_nodes(type=uint8, shape=“1,128,128,3”)’,
‘fold_constants(ignore_errors=true)’,
‘fold_batch_norms’,
‘fold_old_batch_norms’,
‘obfuscate_names’,
‘quantize_weights’,
‘quantize_nodes’,
‘strip_unused_nodes’,
‘sort_by_execution_order’
]
optimize_graph(“./”,“freeze_graph.pb”,transforms, “layer6/final_dense”)
==============================================================================
def freeze_model(saved_model_dir, output_node_names, output_filename):
output_graph_filename = os.path.join(saved_model_dir, output_filename)
initializer_nodes = ‘’
freeze_graph.freeze_graph(
input_saved_model_dir=saved_model_dir,
output_graph=output_graph_filename,
saved_model_tags = tag_constants.SERVING,
output_node_names=output_node_names,
initializer_nodes=initializer_nodes,
input_graph=None,
input_saver=False,
input_binary=False,
input_checkpoint=None,
restore_op_name=None,
filename_tensor_name=None,
clear_devices=False,
input_meta_graph=False,
)
print(‘graph freezed!’)
Environment
TensorRT Version : 7.0.0.11
GPU Type : Tesla K80
Nvidia Driver Version : 440.64.00
CUDA Version : CUDA Version: 10.2
CUDNN Version : 7.6
Operating System + Version : Ubuntu x86_64
Python Version (if applicable) : 3.6
TensorFlow Version (if applicable) : 1.15.2
PyTorch Version (if applicable) :
Baremetal or Container (if container which image + tag) : barematel
Relevant Files
https://drive.google.com/file/d/1HHLcNsCccdQCz98ErE0ci1zkhbdXYGiw/view?usp=sharing
Steps To Reproduce
~/notebook/head-pose-estimation$ convert-to-uff frozen_graph.pb
Warning: No conversion function registered for layer: TensorArrayGatherV3 yet.
Converting map/TensorArrayStack/TensorArrayGatherV3 as custom op: TensorArrayGatherV3
W0529 23:11:49.407045 139740564793152 module_wrapper.py:139] From /home/ubuntu/anaconda3/lib/python3.6/site-packages/uff/converters/tensorflow/converter.py:179: The name tf.AttrValue is deprecated. Please use tf.compat.v1.AttrValue instead.
Warning: No conversion function registered for layer: Exit yet.
Converting map/while/Exit_2 as custom op: Exit
Warning: No conversion function registered for layer: Switch yet.
Converting map/while/Switch_2 as custom op: Switch
Warning: No conversion function registered for layer: LoopCond yet.
Converting map/while/LoopCond as custom op: LoopCond
Warning: No conversion function registered for layer: LogicalAnd yet.
Converting map/while/LogicalAnd as custom op: LogicalAnd
Warning: No conversion function registered for layer: Less yet.
Converting map/while/Less_1 as custom op: Less
Warning: No conversion function registered for layer: Enter yet.
Converting map/while/Less/Enter as custom op: Enter
Warning: No conversion function registered for layer: Merge yet.
Converting map/while/Merge_1 as custom op: Merge
Warning: No conversion function registered for layer: NextIteration yet.
Converting map/while/NextIteration_1 as custom op: NextIteration
Warning: No conversion function registered for layer: Switch yet.
Converting map/while/Switch as custom op: Switch
Warning: No conversion function registered for layer: Merge yet.
Converting map/while/Merge as custom op: Merge
Warning: No conversion function registered for layer: NextIteration yet.
Converting map/while/NextIteration as custom op: NextIteration
Warning: No conversion function registered for layer: Enter yet.
Converting map/while/Enter as custom op: Enter
Warning: No conversion function registered for layer: Switch yet.
Converting map/while/Switch_1 as custom op: Switch
Warning: No conversion function registered for layer: Enter yet.
Converting map/while/Enter_1 as custom op: Enter
Warning: No conversion function registered for layer: Less yet.
Converting map/while/Less as custom op: Less
Warning: No conversion function registered for layer: Merge yet.
Converting map/while/Merge_2 as custom op: Merge
Warning: No conversion function registered for layer: NextIteration yet.
Converting map/while/NextIteration_2 as custom op: NextIteration
Warning: No conversion function registered for layer: TensorArrayWriteV3 yet.
Converting map/while/TensorArrayWrite/TensorArrayWriteV3 as custom op: TensorArrayWriteV3
Warning: No conversion function registered for layer: ResizeBilinear yet.
Converting map/while/resize/ResizeBilinear as custom op: ResizeBilinear
Warning: No conversion function registered for layer: TensorArrayReadV3 yet.
Converting map/while/TensorArrayReadV3 as custom op: TensorArrayReadV3
Warning: No conversion function registered for layer: Enter yet.
Converting map/while/TensorArrayReadV3/Enter_1 as custom op: Enter
Warning: No conversion function registered for layer: TensorArrayScatterV3 yet.
Converting map/TensorArrayUnstack/TensorArrayScatter/TensorArrayScatterV3 as custom op: TensorArrayScatterV3
Warning: No conversion function registered for layer: TensorArrayV3 yet.
Converting map/TensorArray as custom op: TensorArrayV3
Warning: No conversion function registered for layer: Range yet.
Converting map/TensorArrayUnstack/range as custom op: Range
Warning: No conversion function registered for layer: Enter yet.
Converting map/while/TensorArrayReadV3/Enter as custom op: Enter
Please include:
- Exact steps/commands to build your repro
- Exact steps/commands to run your repro
- Full traceback of errors encountered