【问题标题】:How to manage the cuda streams and TensorRT context in multiple threads GPU application?如何在多线程 GPU 应用程序中管理 cuda 流和 TensorRT 上下文?
【发布时间】:2022-11-10 14:38:52
【问题描述】:

对于一个 tensorrt trt 文件,我们将它加载到一个引擎中,并为引擎创建 Tensorrt 上下文。然后通过调用 context->enqueueV2() 使用 cuda 流进行推理。

创建 Tensorrt 上下文后,我们是否需要调用 cudaCreateStream() ?还是只需要在选择 GPU 设备后调用 SetDevice()? TensorRT 如何关联 cuda 流和 Tensorrt 上下文?

我们可以在一个 Tensorrt 上下文中使用多个流吗?

在多线程 C++ 应用程序中,每个线程使用一个模型进行推理,一个模型可能在多个线程中加载;那么,在一个线程中,我们只需要 1 个引擎、1 个上下文和 1 个流还是多个流?

【问题讨论】:

    标签: multithreading tensorrt


    【解决方案1】:

    创建 Tensorrt 上下文后,我们是否需要调用 cudaCreateStream() ?

    cudaCreateStream() 是指cudaStreamCreate() 吗?

    无论哪种情况,答案是否定的。我尝试将数据从主机复制到设备,调用enqueueV2(),然后在不使用 CUDA 流的情况下将数据从设备复制到主机。它工作得很好。

    还是只需要在选择 GPU 设备后调用 SetDevice()?

    我也不必这样做。

    TensorRT 如何关联 cuda 流和 Tensorrt 上下文?

    如前所述,您不必这样做。但是,如果您希望使用 CUDA 流来执行此操作,则关联是您可以将相同的 CUDA 流作为参数传递给所有函数调用。以下 c++ 代码将说明这一点:

    void infer(std::vector<void*>& deviceMemory, void* hostInputMemory, size_t hostInputMemorySizeBytes, cudaStream_t& cudaStream)
    {
      auto success = cudaMemcpyAsync(deviceMemory, hostInputMemory, hostInputMemorySizeBytes, cudaMemcpyHostToDevice, cudaStream)
      if (not success) {... handle errors...}
    
      if (not executionContext.enqueueV2(static_cast<void**>(deviceMemory.data()), cudaStream, nullptr)
      { ... handle errors...}
    
      void* outputHostMemory; // allocate size for all bindings
      size_t outputMemorySizeBytes;
      auto success2 = cudaMemcpyAsync(&outputHostMemory, &deviceMemory.at(0), outputMemorySizeBytes, cudaMemcpyDeviceToHost, cudaStream);
      if (not success2) {... error handling ...}
    
      cudaStream.waitForCompletion();
    }
    

    如果您想要 C++ 中的完整工作示例,您可以查看 this 存储库。我上面的代码只是一个例子。

    我们可以在一个 Tensorrt 上下文中使用多个流吗?

    如果我正确理解了您的问题,根据this 文档,答案是否定的。

    在多线程 C++ 应用程序中,每个线程使用一个模型进行推理,一个模型可能在多个线程中加载;那么,在一个线程中,我们只需要 1 个引擎、1 个上下文和 1 个流还是多个流?

    one model might be loaded in more than 1 thread

    这听起来不对。

    引擎 (nvinfer1::ICudaEngine) 是从 TensorRT 引擎文件创建的。引擎创建用于推理的执行上下文。

    This TensorRT 开发人员指南的一部分说明了哪些操作是线程安全的。其余的可以被认为是非线程安全的。

    【讨论】:

      猜你喜欢
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2015-10-17
      • 2020-10-24
      • 2013-10-29
      • 2019-06-26
      • 2023-03-03
      相关资源
      最近更新 更多