我是 TensorRT 和 CUDA 的新手,我正在尝试使用 TensorRT Python API 实现推理服务器。我遵循end_to_end_tensorflow_mnist
和uff_ssd
示例,一切正常。但是,当我尝试使用引擎在多个线程中进行推理时,我遇到了一些问题。所以我想知道在多线程中运行 TensorRT 的正确方法是什么。
这是我尝试过的。首先,我在主线程中创建推理引擎。在工作线程中,我使用在主线程中创建的引擎分配内存空间、CUDA Stream 和执行上下文并进行推断:
import pycuda.autoinit # Create CUDA context
import pycuda.driver as cuda
# Main thread
with open(“sample.engine”, “rb”) as f, trt.Runtime(TRT_LOGGER) as runtime:
engine = runtime.deserialize_cuda_engine(f.read())
...
# Worker thread
with engine.create_execution_context() as context:
inputs, outputs, bindings, stream = common.allocate_buffers(engine)
common.do_inference(context, inputs, outputs, bindings, stream)
上面的代码产生以下错误:
pycuda._driver.LogicError: explicit_context_dependent failed: invalid device context - no currently active context?
这听起来好像工作线程中没有活动的 CUDA 上下文。因此,我尝试在工作线程中手动创建 CUDA 上下文:
# Worker thread
from pycuda.tools import make_default_context()
cuda.init() # Initialize CUDA
ctx = make_default_context() # Create CUDA context
with engine.create_execution_context() as context:
inputs, outputs, bindings, stream = common.allocate_buffers(engine)
common.do_inference(context, inputs, outputs, bindings, stream)
ctx.pop() # Clean up
这一次,它给了我另一个错误:
[TensorRT] ERROR: cuda/cudaConvolutionLayer.cpp (163) - Cudnn Error in execute: 7
[TensorRT] ERROR: cuda/cudaConvolutionLayer.cpp (163) - Cudnn Error in execute: 7
我了解构建器或运行时将使用与创建线程关联的 GPU 上下文创建。我猜这个错误是因为引擎与主线程相关联,但我在工作线程中使用它,所以我的问题是:
- 这是否意味着我必须在工作线程中重建引擎,这会显着增加推理过热?
- 我可以在主线程和工作线程之间共享 GPU 上下文,这样我就不必为每个新请求创建新的 GPU 上下文了吗?如果是这样,如何在pycuda中做到这一点?
任何建议将被认真考虑。谢谢!