Cha*_*ine 5 python macos bash tensorflow
我想优化经过冻结训练的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())
Run Code Online (Sandbox Code Playgroud)
我transform_graph
从https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/graph_transforms/README.md#strip_unused_nodes找到了优化我的冻结模型。我能够成功地为我的对象检测模型生成一个可以工作的优化模型。生成模型的优化版本的目的是提高模型的推理速度。我在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)'
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
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
库不存在了吗?小智 1
我有点像你一样寻找
关于解释,找到了这个介绍,里面细节有点太多了;幻灯片 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泽维尔进行测试)。使用以下指令尝试了“量化”模型:
〜/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" --outputs="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_nodes quantize_weights sort_by_execution_order'
它并没有使推理时间变得更好(比如说,在 Xavier 中,每次推理从 1.2 秒缩短到 0.8 秒左右)。添加“quantize_nodes”使我的模型层不匹配,这使得它无法使用。也许对于这个拓扑来说它的工作方式不同,需要我进行更多探索以了解如何优化这个模型以进行推理。不过,它似乎适用于 SSD;将测试我自己的,并发布结果。
我知道的是,如果为了训练您至少可以使用 Volta 架构 GPU(Titan-V 或 Tesla V100)或 RTX 卡,您可以使用环境变量并在模型的混合数据类型上进行训练(FP16如果可能的话,一些在 FP32 中)。如果您确实不需要精度,那么这会成为更好的推理模型。这取决于用例:对于医学图像,可能具有最高的精度。车辆等物体检测,我想你可以为了速度而牺牲精度。使用 nVidia-CUDA 进行混合精度训练:https://docs.nvidia.com/deeplearning/sdk/mixed- precision-training/index.html#tensorflow-amp
我的另一种方法是尝试将模型转换为 TF-Lite,并了解如何在那里使用推理。它仍然在我的积压工作中。
我用 bazel v0.19.x 编译了tensorflow。