TensorRT 优化策略
1.低精度优化
2.kernel自动调优
3.算子融合
4.多流运行
5.显存优化
TensorRT 基本使用流程
TRT转换优化引擎(离线)→engine
1.创建 Builder
2.创建 Network
3.使用 API 或 Parser 构建 Network
4.优化网络
5.序列化和反序列化模型
TRT执行引擎(线上)
6.传输计算数据(H2D)
7.执行计算
8.传输计算结果(D2H)
代码
问题
[W] [TRT] Using an engine plan file across different models of devices is not recommended and is likely to affect performance or even cause errors.
这个警告信息表示你在不同型号的设备上使用了同一个 engine plan 文件,这可能会影响性能甚至导致错误。
TensorRT engine plan 文件是针对特定的 GPU 型号优化生成的,包含了针对该 GPU 优化的网络执行代码。如果在不同型号的 GPU 上复用该文件,可能无法发挥各自 GPU 的优势,甚至可能导致执行报错。
建议的解决方案:
1. 为不同型号的 GPU 分别生成优化的 engine plan 文件。
2. 在生成 engine plan 时,指定通用的优化模式,生成可以跨设备复用的 plan 文件。例如:
python
builder.max_batch_size = 1
builder.max_workspace_size = common.GiB(1)
builder.fp16_mode = True
builder.int8_mode = True
3. 如果确实需要复用,可以在加载 plan 时设置自动校准参数,使运行时代码针对当前 GPU 进行再优化。例如:
python
runtime.set_calibration_profile(profile)
在C++中生成TensorRT引擎计划文件时,为了避免跨设备复用导致的性能问题,可以采取以下方法:
1. 根据当前系统的GPU型号,生成不同的引擎计划文件:
c++
if (device_type == kGPU) {
if (device_id == kGPU_TitanV) {
// 生成TitanV优化的计划
} else if (device_id == kGPU_Tesla_P100){
// 生成Tesla P100优化的计划
}
}
2. 在创建引擎生成器时,指定通用优化模式:
c++
builder->setMaxBatchSize(1);
builder->setMaxWorkspaceSize(1 << 30);
builder->setFp16Mode(true);
builder->setInt8Mode(true);
3. 在运行时为特定GPU设置校准表来微调:
c++
runtime->setCalibrationProfile(profile);
4. 也可以在加载引擎计划时,为特定GPU类型设置优化配置:
c++
if (device_type == kGPU_Tesla_P100) {
cudaGraphExecUpdateParams params = {0};
params.optimization_profile = kSpeed;
context->setCudaGraphExecUpdateParams(params);
}
总之,最佳实践是为特定型号的 GPU 专门生成优化的 plan,而不是直接跨设备复用,从而发挥各型号 GPU 的性能。