gpt4 book ai didi

python - 如何在 Tensorflow 中使用 `transform_graph`

转载 作者:行者123 更新时间:2023-12-02 11:21:18 27 4
gpt4 key购买 nike

我想优化我的卡住训练 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())

我找到了 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)'

所以我的问题是:
  • 变换有什么作用? 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图书馆不存在了?
  • 最佳答案

    我有点和你一样在寻找

  • 关于解释,找到了这个presentation,细节有点多;在 SimplifyGraph() 上,幻灯片 14 和 15 似乎有您想知道的内容
    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 卡,您可以使用 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。

    关于python - 如何在 Tensorflow 中使用 `transform_graph`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52361275/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com