Я новичок в TensorRT и CUDA и пытаюсь реализовать сервер логического вывода с использованием TensorRT Python API.Я следую примеру end_to_end_tensorflow_mnist
и uff_ssd
и все работает нормально.Однако, когда я пытаюсь использовать механизм для создания логических выводов в нескольких потоках, я сталкиваюсь с некоторыми проблемами.Поэтому мне было интересно, как правильно запустить TensorRT в нескольких потоках.
Вот что я пробовал.Сначала я создаю механизм вывода в основной теме.В рабочем потоке я выделяю пространство памяти, поток CUDA и контекст выполнения, используя механизм, созданный в основном потоке, и делаю вывод:
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?
Любой совет будет оценен.Спасибо!