Как запустить TensorRT в нескольких потоках? - PullRequest
0 голосов
/ 30 мая 2019

Я новичок в 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, связанным с созданием потока.Я предполагаю, что эта ошибка связана с тем, что движок связан с главным потоком, но я использую его в рабочем потоке, поэтому мой вопрос:

  1. Это означает, что мне нужно перестроить движок в рабочем потоке, которыйзначительно увеличить перегрев вывода?
  2. Могу ли я разделить контекст GPU между основным потоком и рабочими потоками, чтобы мне не приходилось создавать новый контекст GPU для каждого нового запроса?Если так, как это сделать в pycuda?

Любой совет будет оценен.Спасибо!

...