TensorRT切换优化配置文件报bindingIndex 0 is not in profile 1问题求助
问题成因
- 优化配置文件切换为异步操作:你调用的
setOptimizationProfileAsync是异步执行接口,调用后没有等待操作完成就直接执行setBindingDimensions,此时执行上下文仍处于旧的配置文件状态,binding索引对应关系不匹配。 - 硬编码绑定索引错误:多优化配置文件场景下,每个配置文件会对应独立的绑定索引偏移,默认配置文件(索引0)的输入绑定索引为0,后续新增的配置文件输入绑定索引会依次偏移,固定写死
bindingIndex = 0无法匹配非默认配置文件的实际绑定位置,和报错提示的bindingIndex 0 is not in profile 1完全吻合。 - 缺少切换后的缓冲区重绑定操作:切换配置文件后,没有按照新的绑定索引重新设置输入输出设备缓冲区地址,导致卷积算子执行时读取的内存地址错误,触发CUDNN执行失败。
解决方案
- 等待异步切换完成:调用
setOptimizationProfileAsync后增加流同步操作,确认配置文件切换完成后再执行后续绑定操作,示例如下:
auto it = m_optProfIndx.find(batchSize); if (it != m_optProfIndx.end()) { // 切换优化配置文件 bool switchSuccess = m_context->setOptimizationProfileAsync(it->second, m_cudaStream); // 确认切换调用成功 if (!switchSuccess) { // 自定义错误处理逻辑 } // 等待流同步,确认切换完成 cudaStreamSynchronize(m_cudaStream); }
- 动态获取绑定索引:不要硬编码绑定索引为0,每次切换配置文件后通过输入名称动态获取当前配置文件对应的绑定索引:
// 动态获取当前profile对应的输入绑定索引 int inputBindingIdx = m_context->getEngine().getBindingIndex(inputName); m_context->setBindingDimensions(inputBindingIdx, inputDims);
- 重新绑定设备缓冲区:获取新的绑定索引后,同步更新对应绑定位置的输入输出设备内存地址:
m_context->setBindingAddress(inputBindingIdx, d_input_buffer); // 输出缓冲区同理,用输出名称获取对应绑定索引后设置地址 int outputBindingIdx = m_context->getEngine().getBindingIndex(outputName); m_context->setBindingAddress(outputBindingIdx, d_output_buffer);
- 校验映射关系正确性:确认
m_optProfIndx的映射关系和配置文件添加顺序一致:默认配置文件(索引0)对应batch size 1,后续依次添加的optBatchSize 2、4、8分别对应索引1、2、3,避免索引映射错误。
内容的提问来源于stack exchange,提问作者cyrusbehr
相关产品推荐
相关产品推荐

