deepstream-nvinferserver

nvinferserver的插件和底层库在DS6.3上开源了。这样nvinferserver和nvinfer推理就都开源了,有什么问题,可以直接调代码。

NvDsInferTensorMeta{

  /** Array of pointers to the output host buffers for the batch / frame / object. */

  void **out_buf_ptrs_host;

  /** Array of pointers to the output device buffers for the batch / frame / object. */

  void **out_buf_ptrs_dev;

  /** GPU device ID on which the device buffers have been allocated. */

}

问题1, out_buf_ptrs_host和out_buf_ptrs_dev在nvinfer和nvinferserver中有什么区别呢?

可以从插件层往底层查这个问题,在nvinfer中,赋值的地方是:

attach_tensor_output_meta{

    meta->out_buf_ptrs_host = new void *[meta->num_output_layers];

    meta->out_buf_ptrs_dev = new void *[meta->num_output_layers];

。。。。。。

      meta->out_buf_ptrs_dev[i] =

          (uint8_t *) batch_output->outputDeviceBuffers[i] +

          info.inferDims.numElements * get_element_size (info.dataType) * j;

      meta->out_buf_ptrs_host[i] =

          (uint8_t *) batch_output->hostBuffers[info.bindingIndex] +

          info.inferDims.numElements * get_element_size (info.dataType) * j;

。。。。。。

}

那就得去底层找outputDeviceBuffers和hostBuffers。

在InferPostprocessor::postProcessHost中,可以看到outputDeviceBuffers指向GPU的buffer。

        batchOutput.outputDeviceBuffers[i] =

            batch.m_DeviceBuffers[m_OutputLayerInfo[i].bindingIndex];

在InferPostprocessor::postProcessHost中,可以看到hostBuffers指向m_HostBuffers,那m_HostBuffers从哪里来?

        batchOutput.hostBuffers[i] =

            batch.m_HostBuffers[i] ? batch.m_HostBuffers[i]->ptr() : nullptr;

在InferPostprocessor::copyBuffersToHostMemory中,因为needOutputCopyB4Processing一直是true,所以必然进入如下判断,从m_DeviceBuffers中拷贝数据到m_HostBuffers。

if (!info.isInput && needOutputCopyB4Processing())

{

cudaMemcpyAsync(batch.m_HostBuffers[info.bindingIndex]->ptr(),

                    batch.m_DeviceBuffers[info.bindingIndex],

 } 

在nvinferserver中,逻辑是不一样的,在插件的attachTensorOutputMeta中,out_buf_ptrs_dev赋的空,只有out_buf_ptrs_host可用。

{

        void *bufPtr = buf->getBufPtr(batchIdx);

        meta->out_buf_ptrs_host[i] = bufPtr;

        meta->out_buf_ptrs_dev[i] = nullptr;

}

以为nvinferserver的CAPI为例,nvinferserver在做推理的时候,需要指定输出的回调函数,也就是TrtISBackend::allocateResponseBuf,在nvdsinferserver_common.proto中,可以找到输出buffer的支持的类型, triton默认输出gpubuffer类型。

/** Tensor memory type
 */
enum MemoryType {
  MEMORY_TYPE_DEFAULT = 0;
  MEMORY_TYPE_CPU = 1;
  MEMORY_TYPE_GPU = 2;
}

在memTypeFromDsProto中,会将配置转为内部类型。

memTypeFromDsProto(ic::MemoryType t)

{

    static const std::unordered_map<ic::MemoryType, InferMemType> sTypes{

        {ic::MEMORY_TYPE_DEFAULT, InferMemType::kNone},

        {ic::MEMORY_TYPE_CPU, InferMemType::kCpuCuda},

        {ic::MEMORY_TYPE_GPU, InferMemType::kGpuCuda},

    };

}

nvinerserver会强行想triton的返回值转成hostcpu类型,在InferCudaContext::acquireTensorHostBuf中创建hostbuffer, 在Postprocessor::postCudaImpl中,通过 cudaMemcpyAsync(outBufPtr, inBufPtr把gpubuffer拷贝到cpubuffer。

因为out_buf_ptrs_host指向的是hostcpu类型的buffer。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山西茄子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值