super1 发表于 2022-10-2 08:49

(七)算法选择和可重现的构建

翻译自TensorRT官方文档TensorRT 优化器的默认行为是选择全局最小化引擎执行时间的算法。 它通过定时每个实现来做到这一点,有时,当实现具有相似的定时时,系统噪声可能会决定在构建器的任何特定运行中将选择哪个。 不同的实现通常会使用不同的浮点值累加顺序,两种实现可能使用不同的算法,甚至以不同的精度运行。 因此,构建器的不同调用通常不会导致引擎返回位相同的结果。
有时,确定性构建或重新创建早期构建的算法选择很重要。 通过提供 IAlgorithmSelector 接口的实现并使用 setAlgorithmSelector 将其附加到构建器配置,您可以手动指导算法选择。
方法IAlgorithmSelector::selectAlgorithms 接收一个AlgorithmContext ,其中包含有关层算法要求的信息,以及一组满足这些要求的算法选择。 它返回 TensorRT 应该为层考虑的算法集。
构建器从这些算法中选择一种最小化网络全局运行时间的算法。 如果未返回任何选项并且 BuilderFlag::kREJECT_EMPTY_ALGORITHMS未设置,则 TensorRT 将其解释为意味着任何算法都可以用于该层。 要覆盖此行为并在返回空列表时生成错误,请设置 BuilderFlag::kREJECT_EMPTY_ALGORITHMSS标志。
在 TensorRT 完成给定配置文件的网络优化后,它会调用 reportAlgorithms,它可用于记录对每一层做出的最终选择。
要确定性地构建 TensorRT 引擎,请从 selectAlgorithms 返回一个选项。 要重播早期构建中的选择,请使用 reportAlgorithms记录该构建中的选择,并在 selectAlgorithms 中返回它们。
sampleAlgorithmSelector 演示了如何使用算法选择器在构建器中实现确定性和可重复性。
Note:

[*]算法选择中的“层”概念与INetworkDefinition 中的ILayer 不同。 由于融合优化,前者中的“层”可以等同于多个网络层的集合。
[*]在 selectAlgorithms 中选择最快的算法可能不会为整个网络产生最佳性能,因为它可能会增加重新格式化的开销。
[*]如果 TensorRT 发现该层是空操作,则 IAlgorithm的时间在 selectAlgorithms 中为 0。
[*]reportAlgorithms 不提供给 selectAlgorithms 的IAlgorithm 的计时和工作空间信息。
页: [1]
查看完整版本: (七)算法选择和可重现的构建