【问题标题】:TensorRT multiple ThreadsTensorRT 多线程
【发布时间】:2020-10-24 09:45:21
【问题描述】:

我正在尝试通过 python API 使用 TensorRt。我正在尝试在多个线程中使用它,其中 Cuda 上下文与所有线程一起使用(在单个线程中一切正常)。我正在使用带有 tensorrt:20.06-py3 图像、onnx 模型和 Nvidia 1070 GPU 的 docker。

应该允许多线程方法,正如这里提到的TensorRT Best Practices

我在主线程中创建了上下文:

cuda.init()
device = cuda.Device(0)
ctx = device.make_context()

我尝试了两种方法,首先在主线程中构建引擎并在执行线程中使用它。这种情况给出了这个错误。

[TensorRT] ERROR: ../rtSafe/cuda/caskConvolutionRunner.cpp (373) - Cask Error in checkCaskExecError<false>: 10 (Cask Convolution execution)
[TensorRT] ERROR: FAILED_EXECUTION: std::exception

其次,我试图在给我这个错误的线程中构建模型:

pycuda._driver.LogicError: explicit_context_dependent failed: invalid device context - no currently active context?

当我调用 'cuda.Stream()' 时出现错误

我确信我可以在同一个 Cuda 上下文下并行运行多个 Cuda 流,但我不知道该怎么做。

【问题讨论】:

  • 您需要在每个线程中显式传递并绑定到上下文
  • 你能告诉我怎么做吗?我知道 C 中有一个 cuCtxSetCurrent 函数,但我不能在 pycuda/python 中执行类似的操作

标签: multithreading cuda pycuda tensorrt nvidia-docker


【解决方案1】:

我找到了解决方案。想法是创建一个普通的全局ctx = device.make_context() 然后在每个执行线程中做一个:

ctx.push()
---
Execute Inference Code
---
ctx.pop()

源代码和完整示例的链接是here

【讨论】:

    猜你喜欢
    • 2022-11-10
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2016-07-22
    相关资源
    最近更新 更多