速度在 Tensorrt 中没有改善
Speed no improvement in Tensorrt
我有 Openpose 的 Tensorflow graph。
图形已使用 convert-to-uff 命令转换为 uff 格式。
输出为
NOTE: UFF has been tested with TensorFlow 1.12.0. Other versions are not guaranteed to work
UFF Version 0.6.3
=== Automatically deduced input nodes ===
[name: "image"
op: "Placeholder"
attr {
key: "dtype"
value {
type: DT_FLOAT
}
}
attr {
key: "shape"
value {
shape {
dim {
size: -1
}
dim {
size: -1
}
dim {
size: -1
}
dim {
size: 3
}
}
}
}
]
=========================================
=== Automatically deduced output nodes ===
[name: "Openpose/concat_stage7"
op: "ConcatV2"
input: "Mconv7_stage6_L2/BiasAdd"
input: "Mconv7_stage6_L1/BiasAdd"
input: "Openpose/concat_stage7/axis"
attr {
key: "N"
value {
i: 2
}
}
attr {
key: "T"
value {
type: DT_FLOAT
}
}
attr {
key: "Tidx"
value {
type: DT_INT32
}
}
]
==========================================
Using output node Openpose/concat_stage7
Converting to UFF graph
No. nodes: 463
UFF Output written to cmu/cmu_openpose.uff
如何知道转换是否正确以及所有节点都已转换?
问题是 运行 Tensorrt 引擎/
速度没有提高
我使用的是 Tensorrt 5.1.5 GA。
我对 TensorRT 做了更多的阅读和理解。
对于那些有同样问题的人,让我描述一下我的理解。如果我的理解有误,请评论。
我的 uff 转换没问题。没有错误。我检查了 Tensorboard 上的图表,所有 input/outputs 都很好。
我的 GPU 是 Quadro P4000。该显卡仅支持精度 FP32。
TensorRT 的处理速度并不比 运行 使用 FP32 的 GPU 上的 Tensorflow 快,除非 graphsurgeon 修改图形。
优点是将TensorRT引擎转换为FP16或INT8格式。然后可以看到使用TensorRT的优势。
在 FP32 格式中,在 GPU 上使用 TensorRT 与 Tensorflow 运行 没有任何优势。
TensorRT optimizes the network by combining layers and optimizing
kernel selection for improved latency, throughput, power efficiency
and memory consumption. If the application specifies, it will
additionally optimize the network to run in lower precision, further
increasing performance and reducing memory requirements.
如 TensorRT 开发人员指南 中所述,它不仅通过 运行 降低精度 改进了 DL 模型,而且通过合并层和优化内核选择。
如果您的 GPU 不支持混合精度,这并不意味着 TensorRT 没有用。 TensorRT 将进行层融合并将 运行 各种内核以选择最有效的内核。
如果您没有看到任何改善,可能还有其他原因。也许你使用 cmu/cmu_openpose.uff 引擎的方式。
您对tensorRt的理解有误。
tensorRt 推理可能比 tensorflow 推理更快的主要原因来自:
- 积极地将多个层内核融合到一个内核中。即,https://miro.medium.com/max/1155/0*7WA6t51EZ46355m6.
- 自动调整并为您的输入大小选择最快的内核实现。
- 降低精度推理。
如果您的网络有很多内存密集型操作:tf.slice、tf.split、tf.concat,或大量元素操作(例如,tf.exp(tf.exp( a + b - c)
),由于未实现融合内核(无法融合两个连续的 exp 操作)或几乎没有针对内存操作进行优化,因此 tensorRt 几乎无能为力。
也就是说,这还取决于模型的输入大小。
启动 cuda 内核会产生开销(比如 0.1 毫秒)。如果输入大小是 10x10 而不是 1000x1000,那么计算时间与内核启动时间相比是微不足道的。如果所需的计算量很小,您不会从使用 tensorRt 中看到很多好处。
我在 TitanXp (FP32) 上使用 TensoRt5.1.5 转换了您的模型并 运行 对其进行了推理。这是我得到的:
B=1 TensorRT avg per image 0.4569686s over 1000 iter.
B=1 Tensorflow avg per image 0.5385810s over 1000 iter.
图像大小为 1x3x1200x1920(批次 x 通道 x 高 x 宽)。
我有 Openpose 的 Tensorflow graph。
图形已使用 convert-to-uff 命令转换为 uff 格式。
输出为
NOTE: UFF has been tested with TensorFlow 1.12.0. Other versions are not guaranteed to work
UFF Version 0.6.3
=== Automatically deduced input nodes ===
[name: "image"
op: "Placeholder"
attr {
key: "dtype"
value {
type: DT_FLOAT
}
}
attr {
key: "shape"
value {
shape {
dim {
size: -1
}
dim {
size: -1
}
dim {
size: -1
}
dim {
size: 3
}
}
}
}
]
=========================================
=== Automatically deduced output nodes ===
[name: "Openpose/concat_stage7"
op: "ConcatV2"
input: "Mconv7_stage6_L2/BiasAdd"
input: "Mconv7_stage6_L1/BiasAdd"
input: "Openpose/concat_stage7/axis"
attr {
key: "N"
value {
i: 2
}
}
attr {
key: "T"
value {
type: DT_FLOAT
}
}
attr {
key: "Tidx"
value {
type: DT_INT32
}
}
]
==========================================
Using output node Openpose/concat_stage7
Converting to UFF graph
No. nodes: 463
UFF Output written to cmu/cmu_openpose.uff
如何知道转换是否正确以及所有节点都已转换?
问题是 运行 Tensorrt 引擎/
速度没有提高我使用的是 Tensorrt 5.1.5 GA。
我对 TensorRT 做了更多的阅读和理解。 对于那些有同样问题的人,让我描述一下我的理解。如果我的理解有误,请评论。
我的 uff 转换没问题。没有错误。我检查了 Tensorboard 上的图表,所有 input/outputs 都很好。
我的 GPU 是 Quadro P4000。该显卡仅支持精度 FP32。
TensorRT 的处理速度并不比 运行 使用 FP32 的 GPU 上的 Tensorflow 快,除非 graphsurgeon 修改图形。
优点是将TensorRT引擎转换为FP16或INT8格式。然后可以看到使用TensorRT的优势。
在 FP32 格式中,在 GPU 上使用 TensorRT 与 Tensorflow 运行 没有任何优势。
TensorRT optimizes the network by combining layers and optimizing kernel selection for improved latency, throughput, power efficiency and memory consumption. If the application specifies, it will additionally optimize the network to run in lower precision, further increasing performance and reducing memory requirements.
如 TensorRT 开发人员指南 中所述,它不仅通过 运行 降低精度 改进了 DL 模型,而且通过合并层和优化内核选择。
如果您的 GPU 不支持混合精度,这并不意味着 TensorRT 没有用。 TensorRT 将进行层融合并将 运行 各种内核以选择最有效的内核。
如果您没有看到任何改善,可能还有其他原因。也许你使用 cmu/cmu_openpose.uff 引擎的方式。
您对tensorRt的理解有误。 tensorRt 推理可能比 tensorflow 推理更快的主要原因来自:
- 积极地将多个层内核融合到一个内核中。即,https://miro.medium.com/max/1155/0*7WA6t51EZ46355m6.
- 自动调整并为您的输入大小选择最快的内核实现。
- 降低精度推理。
如果您的网络有很多内存密集型操作:tf.slice、tf.split、tf.concat,或大量元素操作(例如,tf.exp(tf.exp( a + b - c)
),由于未实现融合内核(无法融合两个连续的 exp 操作)或几乎没有针对内存操作进行优化,因此 tensorRt 几乎无能为力。
也就是说,这还取决于模型的输入大小。 启动 cuda 内核会产生开销(比如 0.1 毫秒)。如果输入大小是 10x10 而不是 1000x1000,那么计算时间与内核启动时间相比是微不足道的。如果所需的计算量很小,您不会从使用 tensorRt 中看到很多好处。
我在 TitanXp (FP32) 上使用 TensoRt5.1.5 转换了您的模型并 运行 对其进行了推理。这是我得到的:
B=1 TensorRT avg per image 0.4569686s over 1000 iter.
B=1 Tensorflow avg per image 0.5385810s over 1000 iter.
图像大小为 1x3x1200x1920(批次 x 通道 x 高 x 宽)。