生成冻结推断计算图 - 3.5 简体中文

Vitis AI 用户指南 (UG1414)

Document ID
UG1414
Release Date
2023-09-28
Version
3.5 简体中文

使用 TensorFlow 1.x 来训练模型时,该进程会创建一个文件夹,其中包含一个 GraphDef 文件(通常扩展名为 .pb 或 .pbtxt)和一组检查点文件。为便于移动或嵌入式部署,您需要满足以下条件的单个 GraphDef 文件:此文件已冻结,或者其变量已转换为内联常量,使该文件可包含所有必要信息。TensorFlow 提供的 freeze_graph.py 可用于处理转换,它随 vai_q_tensorflow 量化器一起自动安装。

命令行用法示例如下:

[docker] $ freeze_graph \
    --input_graph  /tmp/inception_v1_inf_graph.pb \
    --input_checkpoint  /tmp/checkpoints/model.ckpt-1000 \
    --input_binary  true \
    --output_graph  /tmp/frozen_graph.pb \
    --output_node_names  InceptionV1/Predictions/Reshape_1
`

–input_graph 应为推断计算图,而不是训练计算图。由于推断和部署无需数据预处理和损失函数运算,因此 frozen_graph.pb 应仅包含模型的必要组件。尤其是,Input_fn 应包含数据预处理运算,以便生成正确的输入数据用于训练后量化。

注释: 此类运算(如,dropout 和 batch norm)在训练阶段与推断阶段中的行为表现不同。对计算图进行冻结时,请确保这些操作在推断阶段执行。例如,使用 tf.layers.dropout/tf.layers.batch_normalization 时可设置 is_training=false 标志。对于使用 tf.keras 的模型,请先调用 tf.keras.backend.set_learning_phase(0),然后再构建计算图。
提示: 输入 freeze_graph --help 可获取更多选项。

输入节点和输出节点名称因模型而异,但您可使用 vai_q_tensorflow 量化器来检查和估算这些节点。请参阅以下代码片段示例:

[docker] $ vai_q_tensorflow inspect --input_frozen_graph=/tmp/inception_v1_inf_graph.pb

如果计算图包含计算图内预处理和后处理,那么估算的输入和输出节点不得用于量化。这是因为某些操作无法量化,使用 Vitis AI 编译器来编译模型并将其部署到 DPU 时,这类操作可能会导致错误。

另一种获取计算图的输入和输出名称的方法是将计算图可视化。TensorBoard 和 Netron 均可执行此操作。请参阅以下示例,其中使用的是 Netron:

[docker] $ pip install netron
[docker] $ netron /tmp/inception_v3_inf_graph.pb