Поставщик выполнения CUDA в ONNX допускает ошибку при объединении TensorRT с ONNXPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Поставщик выполнения CUDA в ONNX допускает ошибку при объединении TensorRT с ONNX

Сообщение Anonymous »

При переходе от CUDA ONNX к коду TensorRT на Python
возникла эта ошибка при запуске модели из ONNX (с CUDA Provider) и модели из TensorRT в одном и том же коде.
получены эти ошибки
2023-11-26 11:46:35.483254243 [W:onnxruntime:, session_state.cc:1162 VerifyEachNodeIsAssignedToAnEp] Некоторым узлам не были назначены предпочтительные поставщики выполнения, которые могут оказать или не оказать негативное влияние на производительность. например ORT явно назначает процессору операции, связанные с формой, для повышения производительности.
2023-11-26 11:46:35.483279701 [W:onnxruntime:, session_state.cc:1164 VerifyEachNodeIsAssignedToAnEp] Повторный запуск с подробным выводом в неминимальной сборке будет показать назначения узлов.
[26.11.2023-11:46:36] [TRT] [E] 1: [convolutionRunner.cpp::execute::391] Код ошибки 1: Cask (выполнение свертки Cask)
[26.11.2023-11:46:36] [TRT] [E] 1: [checkMacros.cpp::catchCudaError::272] Код ошибки 1: среда выполнения Cuda (неверный дескриптор ресурса)
эти ошибки не появляются, когда я запускаю модели отдельно или устанавливаю поставщики=['CPUExecutionProvider'] вместо поставщики=['CUDAExecutionProvider']
Сделайте этот пример код, объединяющий обе модели, отображающий эту ошибку
import cv2
import numpy as np
import pycuda.driver as cuda
import pycuda.autoinit
import tensorrt as trt
np.bool = np.bool_

import onnx
import onnxruntime

from profiling import GlobalProfTime, ProfTimer, mode_to_str

with GlobalProfTime('profile_tensorrt_10_000images') as t:
with ProfTimer('TensorRT basic image profiler') as t:

#TensorRT code
# Load TensorRT Engine
TRT_ENGINE_PATH = '/app/models/buffalo_l/det_10g640x640.engine' # Path to your TensorRT engine file

# Create a runtime
runtime = trt.Runtime(trt.Logger(trt.Logger.WARNING))

# Deserialize the engine
with open(TRT_ENGINE_PATH, 'rb') as f:
engine_data = f.read()
engine = runtime.deserialize_cuda_engine(engine_data)

assert engine is not None

# Create an execution context
context = engine.create_execution_context()

# Allocate memory for inputs and outputs
inputs, outputs, bindings, stream = [], [], [], cuda.Stream()
for binding in engine:
size = trt.volume(engine.get_binding_shape(binding)) * engine.max_batch_size
dtype = trt.nptype(engine.get_binding_dtype(binding))
host_mem = cuda.pagelocked_empty(size, dtype)
device_mem = cuda.mem_alloc(host_mem.nbytes)
bindings.append(int(device_mem))
if engine.binding_is_input(binding):
inputs.append({'host': host_mem, 'device': device_mem, 'name': binding, 'shape': engine.get_binding_shape(binding), 'type': engine.get_binding_dtype(binding)})
else:
outputs.append({'host': host_mem, 'device': device_mem, 'name': binding, 'shape': engine.get_binding_shape(binding), 'type': engine.get_binding_dtype(binding)})

# Load and preprocess input image from file
image_path = "/app/models/buffalo_l/image.png"
image = cv2.imread(image_path)

# Check if the image is loaded successfully
assert image is not None

# Preprocess the image
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (640, 640))

#
image = image.astype(np.float32) / 255.0
input_data = np.expand_dims(image.transpose(2, 0, 1), axis=0)

#ONNX code
onnx_model_path = "/app/models/buffalo_l/det_10g.onnx"
onnx_model = onnx.load(onnx_model_path)
# Create ONNX Runtime Session
ort_session = onnxruntime.InferenceSession(onnx_model_path, providers=['CUDAExecutionProvider']) #['CPUExecutionProvider']

#TensorRT code
for _ in range(1):
with ProfTimer('TensorRT per call') as t:
# Copy the input data to the GPU
cuda.memcpy_htod_async(inputs[0]['device'], input_data.ravel(), stream)
# Run inference
if context.execute_async(batch_size=1, bindings=bindings, stream_handle=stream.handle) == 0:
print("Error: Unable to launch TensorRT inference.")
# Transfer predictions back from the GPU
if cuda.memcpy_dtoh_async(outputs[0]['host'], outputs[0]['device'], stream) == 0:
print("Error: Unable to copy results from GPU to host.")
# The result is now in outputs[0]['host']
result = outputs[0]['host']

# Synchronize the stream
stream.synchronize()

# Print the inference results
print("Inference TensorRT Results:")
print(result[:20])
stream.synchronize()

#ONNX code
for _ in range(1):
with ProfTimer('ONNX(CUDA) per call') as t:
image_path = "/app/models/buffalo_l/image.png"
image = cv2.imread(image_path)
assert image is not None

# Check if the image is loaded successfully
# Continue with image processing
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
image = cv2.resize(image, (640, 640))
image = image.astype(np.float32) / 255.0
input_data = np.expand_dims(image.transpose(2, 0, 1), axis=0)
# Run inference with the loaded image
input_name = ort_session.get_inputs()[0].name
outputs = ort_session.run(None, {input_name: input_data})
# Print the inference results
print("Inference ONNX Results:")
print(f"{np.transpose(outputs[0][:20])}")



Подробнее здесь: https://stackoverflow.com/questions/775 ... -with-onnx
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»