我想优化经过冻结训练的Tensorflow模型。但是,我发现optimize_for_inference
库不再可用。
import tensorflow as tf
from tensorflow.python.tools import freeze_graph
from tensorflow.python.tools import optimize_for_inference_lib
input_graph_def = tf.GraphDef()
with tf.gfile.Open("./inference_graph/frozen_model.pb", "rb") as f:
data = f.read()
input_graph_def.ParseFromString(data)
output_graph_def = optimize_for_inference_lib.optimize_for_inference(
input_graph_def,
["image_tensor"], ## input
["'detection_boxes, detection_scores, detection_classes, num_detections"], ## outputs
tf.float32.as_datatype_enum)
f = tf.gfile.FastGFile("./optimized_model.pb", "wb")
f.write(output_graph_def.SerializeToString())
我从https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#strip_unused_nodes找到了transform_graph
,以优化冻结的模型。我能够成功地为我的对象检测模型生成一个可以工作的优化模型。生成模型的优化版本的目的是提高模型的推理速度。我在bash(/ tensorflow根目录)中输入了此代码:
bazel-bin/tensorflow/tools/graph_transforms/transform_graph \
--in_graph=/Users/cvsanbuenaventura/Documents/tensorflow_fastlog/models/research/object_detection/inference_graph/frozen_inference_graph.pb \
--out_graph=/Users/cvsanbuenaventura/Documents/tensorflow_fastlog/models/research/object_detection/inference_graph/optimized_inference_graph-transform_graph-manyoutputs-planA2-v2.pb \
--inputs='image_tensor' \
--outputs='detection_boxes, detection_scores, detection_classes, num_detections' \
--transforms='fold_batch_norms
fold_old_batch_norms
fold_constants(ignore_errors=true)'
所以我的问题是:
fold_batch_norms, fold_old_batch_norms, fold_constants(ignore_errors=true)
strip_unused_nodes(type=float, shape="1,299,299,3")
)。这是做什么的?我应该在这里放什么形状?optimize_for_inference
库是否不再存在? 答案 0 :(得分:0)
我在找和你一样的东西
关于说明,找到了此演示文稿,其中的详细信息太多了;幻灯片14和15在SimplifyGraph()上似乎具有您想知道的内容 https://web.stanford7edu/class/cs245/slides/TFGraphOptimizationsStanford.pdf
这似乎是“ 1,299,299,3”对应于SSD-300x300型号,因此,我想如果存在与强制将数据调整为该尺寸有关的内容。我已经读到,优化的想法是删除完整训练所需的节点,而不是推理所需的节点。 就我而言,我使用的是1920x1080 FRCNN模型,所以我想我必须删除“ 1,1080,1920,3”。
很有可能...必须检查TensorFlow团队的变更日志。
编辑:
终于做了我的测试。似乎使用Faster-RCNN(可能还有R-FCN)使用“优化推理”模型在GPU推理上没有任何好处(我的参考卡是GTX Titan X Maxwell,但我还有AGX Xavier进行测试)。使用以下说明尝试了“量化”模型:
〜/ build / tensorflow / tf_1.12.3-cpu / bazel-bin / tensorflow / tools / graph_transforms / transform_graph --in_graph ='model.cas.f01-v2_aug_frcnn-1920-1080-dia.pb' --out_graph ='opt-for-inf / opt_2q_model.cas.f01-v2_aug_frcnn-1920-1080-dia.pb' --inputs =“ image_tensor” -输出=“ detection_boxes,detection_scores,detection_classes,num_detections” --transforms ='add_default_attributes strip_unused_nodes(type = float,shape =“ 1,1080,1920,3”) remove_nodes(op = Identity,op = CheckNumerics) fold_constants(ignore_errors = true)fold_batch_norms fold_old_batch_norms merge_duplicate_nodesquantize_weights sort_by_execution_order'
它并没有使推理时间更好(例如,在Xavier中从每次推理的1.2秒提高到0.8左右)。添加“ quantize_nodes”使我在模型的各层上不匹配,这使其无法使用。 对于这种拓扑,也许它的工作方式有所不同,这需要我进行更多探索,以了解如何优化此模型以进行推理。不过,它似乎适用于SSD。将测试我自己的内容并发布结果。
我所知道的是,如果要进行培训,您至少可以使用Volta架构的GPU(Titan-V或Tesla V100)或RTX卡,则可以使用env var并进行培训混合数据类型为模型(可能时为FP16,有些则为FP32)。如果您确实不需要精度,那将为推理提供更好的模型。 那将取决于用例:对于医学图像,可能会达到最高的精度。车辆左右的物体检测,我想您可能会牺牲速度的精度。 带有nVidia-CUDA的混合精度训练:https://docs.nvidia.com/deeplearning/sdk/mixed-precision-training/index.html#tensorflow-amp
我的另一种方法是尝试将模型转换为TF-Lite,然后看看如何在其中使用推理。仍在我的待办事项中。
我使用bazel v0.19.x编译了tensorflow。