极智AI | 讲解TensorRT显式batch和隐式batch

简介: 大家好,我是极智视界,本文讲解一下 TensorRT 显式batch 和 隐式batch。

大家好,我是极智视界,本文讲解一下 TensorRT 显式batch 和 隐式batch。

TensorRT 支持使用两种方式来指定网络的 Layout,即:explicit batchimplicit batch。所谓 显式隐式 的差别就在于 Batch 这一维,即 显式 ==> NCHW隐式 ==> CHW。在比较老版本的 TensorRT 中一般就用 implicit batch 隐式batch,而现在新的开始慢慢用 explicit batch 进行替代。这是为啥呢?这主要是因为,随着算法的不断发展,网络中新出现了很多新算子、新结构,有些时候需要 操控 batch 这个维度,这个时候如果使用 隐式batch 来开发,显然是不可行的。

隐式batch 模式不能胜任的场景主要包括:

  • Reducing across the batch dimension ==> batch 维度上的规约操作,如 [N, C, H, W] -> [1, C, H, W];
  • Reshaping the batch dimension ==> batch 维度上的变化,如 [N, C, H, W] -> [M, C, H, W];
  • Transposing the batch dimension with another dimension ==> 涉及 batch 的维度变换操作,如 [N, C, H, W] -> [C, H, W, N];

总的来说,就是涉及到 batch 的操作,implicit batch 就无能为力了,而显而易见的是,隐式batch 的开发难度会低一些,因为开发自始至终,你只需要关注 CHW。有同学可能会关心的一点是,那么 我们如果要从 隐式batch模式 迁移到 显式batch模式 的工作量到底有多少呢。这个问题我觉得需要从两个方面进行回答:

  • (1) 开发模式上如何设置成 explicit batch 模式;
  • (2) 网络中算子 Layout 从 CHW -> NCHW,TensorRT 算子实现要改动的代码量;

从第 (1) 个方面来说,很简单,只要在创建 INetworkDefinition 的时候,使用 flag 来指定是 显式batch 还是 隐式batch

C++ 的做法是这样的,显式batch 时,手动指定 flagNetworkDefinitionCreationFlag::kEXPLICIT_BATCH 以标志构建网络使用 explicit batch mode;若要使用 implicit batch mode ,则 flag 不进行手动指定 或 使用 createNetwork 方法来构建网络:

// cpp mark explicit batch mode
IBuilder* builder = ...;
INetworkDefinition* network = builder->createNetworkV2(1U << static_cast<uint32_t>(NetworkDefinitionCreationFlag::kEXPLICIT_BATCH)))

Python 的代码是这样的,显式batch 时,手动指定 flagtrt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH 以标志构建网络使用 explicit batch mode;若要使用 implicit batch mode ,则 flag 不进行手动指定:

# python mark explicit batch mode
builder = trt.Builder(...)
builder.create_network(1 << int(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH))

从第 (2) 个方面来说,工作量其实是不太好评估的,这取决于你网络中涉及了多少 操控 batch 的操作,如果涉及的多,那改动自然就大。还有一点需要注意的是,explicit batch 中的 batch 一般一直都是在 axis 0 位置,除非特别指定 Transposing the batch dimension with another dimension 可能会涉及 N 的 axis 动一动,但这并不是常见的操作。因为一般一个高效的推理框架,会对你的 Data Layout 有严格要求,语义上就是 用 NCHW 还是 NHWC,框架是有一个期望的,而不是让你随意动,而反观 TensorRT,NCHW 的 Layout 是其期望。


好了,以上分享了 讲解 TensorRT 显式batch 和 隐式batch,希望我的分享能对你的学习有一点帮助。


logo_show.gif

相关文章
|
5月前
|
机器学习/深度学习 存储 人工智能
极智AI | 周易AIPU算法部署仿真测试
本教程详细记录了使用周易 AIPU 进行算法部署仿真测试的方法,带大家尝尝鲜。
194 0
|
5月前
|
机器学习/深度学习 人工智能 算法
极智AI | 谈谈多通道img2col的实现
大家好,我是极智视界,本文来谈谈 多通道img2col的实现。
72 1
|
5月前
|
人工智能 JSON API
极智AI | 三谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 三谈昇腾CANN量化。
41 1
|
5月前
|
人工智能 API Python
极智AI | 再谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 再谈昇腾CANN量化。
70 1
|
5月前
|
人工智能 算法 数据格式
极智AI | 谈谈昇腾CANN量化
大家好,我是极智视界,本文介绍一下 谈谈昇腾CANN量化。
68 0
|
5月前
|
人工智能 自然语言处理 算法
极智AI | TensorRT API构建模型推理流程
大家好,我是极智视界,本文介绍一下 TensorRT API 构建模型推理流程。
352 1
|
5月前
|
人工智能 Ubuntu C++
极智AI | ncnn模型转换及量化流程
本文介绍一下 ncnn 模型转换及量化流程,以 from_darknet yolov4 为例。
156 0
|
5月前
|
机器学习/深度学习 人工智能 PyTorch
极智AI | GAN应用于玻璃表面水珠样本生成
大家好,我是极智视界,本文介绍一下 GAN 应用于玻璃表面水珠样本生成的方法。
46 0
极智AI | GAN应用于玻璃表面水珠样本生成
|
5月前
|
机器学习/深度学习 人工智能 并行计算
极智AI | deepstream6.0部署yolov3和yolov4教程
大家好,我是极智视界,本文介绍了使用 deepstream6.0 部署 yolov3 和 yolov4 的方法。
160 0
|
5月前
|
机器学习/深度学习 传感器 人工智能
极智AI | AI算法修复上世纪老照片 还你祖辈记忆
大家好,我是极智视界,本文介绍一下 用 AI 算法修复模糊老照片的方法。
198 1