- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 TensorRT(使用 python)中有一个推理代码。我想在 ROS 中运行此代码,但在尝试分配缓冲区时出现以下错误:LogicError: explicit_context_dependent failed: invalid device context - no currently active context?
该代码在 ROS 包中运行良好。 ROS 节点发布图像,给定的代码获取图像以进行推理。推理代码如下所示:
#!/usr/bin/env python
# Revision $Id$
import rospy
from std_msgs.msg import String
from cv_bridge import CvBridge
import cv2
import os
import numpy as np
import argparse
import torch
from torch.autograd import Variable
from torchvision import transforms
import torch.nn.functional as F
import torch._utils
from PIL import Image
from sensor_msgs.msg import Image as ImageMsg
import tensorrt as trt
import pycuda.driver as cuda
import pycuda.autoinit
import random
import sys
import common
import shutil
from itertools import chain
TRT_LOGGER = trt.Logger()
# cuda.init()
class ModelData(object):
def __init__(self):
self.MODEL_PATH = "./MobileNet_v2_Final.onnx" ## converted model from pytorch to onnx
self.batch_size = 1
self.num_classes = 3
self.engine = build_int8_engine(self.MODEL_PATH, self.batch_size)
self.context = self.engine.create_execution_context()
### ROS PART
self.bridge_ROS = CvBridge()
self.loop_rate = rospy.Rate(1)
self.pub = rospy.Publisher('Image_Label', String, queue_size=1)
print('INIT Successfully')
def callback(self, msg):
rospy.loginfo('Image received...')
cv_image = self.bridge_ROS.imgmsg_to_cv2(msg, desired_encoding="passthrough")
inputs, outputs, bindings, stream = common.allocate_buffers(context.engine)
[output] = common.do_inference(context, bindings=bindings, inputs=inputs, outputs=outputs, stream=stream, batch_size=effective_batch_size)
def listener(self):
rospy.Subscriber("chatter", ImageMsg, self.callback)
while not rospy.is_shutdown():
rospy.loginfo('Getting image...')
self.loop_rate.sleep()
def build_int8_engine(model_file, batch_size=32):
with trt.Builder(TRT_LOGGER) as builder, builder.create_network() as network, trt.OnnxParser(network, TRT_LOGGER) as parser:
builder.max_batch_size = batch_size
builder.max_workspace_size = common.GiB(1)
with open(model_file, 'rb') as model:
parser.parse(model.read(),)
return builder.build_cuda_engine(network)
if __name__ == '__main__':
rospy.init_node("listener", anonymous=True)
infer = ModelData()
infer.listener()
#!/usr/bin/env python
# Revision $Id$
from itertools import chain
import argparse
import os
import pycuda.driver as cuda
import pycuda.autoinit
import numpy as np
import tensorrt as trt
# Simple helper data class that's a little nicer to use than a 2-tuple.
class HostDeviceMem(object):
def __init__(self, host_mem, device_mem):
self.host = host_mem
self.device = device_mem
def __str__(self):
return "Host:\n" + str(self.host) + "\nDevice:\n" + str(self.device)
def __repr__(self):
return self.__str__()
# Allocates all buffers required for an engine, i.e. host/device inputs/outputs.
def allocate_buffers(engine):
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))
# Allocate host and device buffers
host_mem = cuda.pagelocked_empty(size, dtype)
device_mem = cuda.mem_alloc(host_mem.nbytes)
# Append the device buffer to device bindings.
bindings.append(int(device_mem))
# Append to the appropriate list.
if engine.binding_is_input(binding):
inputs.append(HostDeviceMem(host_mem, device_mem))
else:
outputs.append(HostDeviceMem(host_mem, device_mem))
ctx.pop()
del ctx
return inputs, outputs, bindings, stream
# This function is generalized for multiple inputs/outputs.
# inputs and outputs are expected to be lists of HostDeviceMem objects.
def do_inference(context, bindings, inputs, outputs, batch_size=1):
# Transfer input data to the GPU.
[cuda.memcpy_htod_async(inp.device, inp.host, stream) for inp in inputs]
# [cuda.memcpy_htod(inp.device, inp.host) for inp in inputs]
# Run inference.
context.execute_async(batch_size=batch_size, bindings=bindings, stream_handle=stream.handle)
# context.execute(batch_size=batch_size, bindings=bindings)
# Transfer predictions back from the GPU.
[cuda.memcpy_dtoh_async(out.host, out.device, stream) for out in outputs]
# [cuda.memcpy_dtoh(out.host, out.device) for out in outputs]
# Synchronize the stream
stream.synchronize()
# Return only the host outputs.
return [out.host for out in outputs]
TensorRT: 6.1.5
Python: 2.7
rosversion: 1.14.3
rosdistro: melodic
最佳答案
您需要显式创建 Cuda 设备并在工作线程(即您的回调函数)中加载 Cuda 上下文,而不是使用 import pycuda.autoinit
在主线程中,如下
import pycuda.driver as cuda
import threading
def callback():
cuda.init()
device = cuda.Device(0) # enter your Gpu id here
ctx = device.make_context()
allocate_buffers() # load Cuda buffers or any other Cuda or TenosrRT operations
ctx.pop() # very important
if __name__ == "__main__":
worker_thread = threading.Thread(target=callback())
worker_thread.start()
worker_thread.join()
import pycuda.autoinit
在两个模块中
关于python-2.7 - 在 ROS 中运行 tensorRT 时得到 "LogicError: explicit_context_dependent failed: invalid device context - no currently active context? ",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60372729/
我正在尝试使用以 TensorRT C++ API 原生编写的模型运行半精度推理(未从其他框架(如 caffe、tensorflow)解析);据我所知,没有这个问题的公共(public)工作示例;我找
batch为1时,如下: void* buffers[2]; buffers[inputIndex] = inputbuffer; buffers[outputIndex] = outputBuffe
大家好! 我在 TensorRT 中执行批量推理时遇到问题。当批量大小为 1 时,它就像一个魅力,但当我将它更改为任何其他数字时,它会给出普通的垃圾。 一步一步,我下载了 TensorRT (5.0)
从子进程运行 tensorrt 时遇到问题。我不确定这是一个 tensorrt 错误还是我做错了什么。如果这是一个集成错误,我想知道这是否已经在 tensorflow 1.7 的新版本中得到解决。 以
有了经过训练的“.h5”Keras 模型文件,我正在尝试优化推理时间: 探索了 2 个选项: 通过 TensorRT 加速推理 'int8' 量化。 此时我可以将模型文件转换为 TensorFlow
TRT::Tensor roi_align_inputs(TRT::DataType::Float); roi_align_inputs.resize(infer_batch_size * MAX_I
我正在尝试使用 TensorRT 加速 yolov3 TF2 的推理。我在tensorflow 2中使用TrtGraphConverter函数。 我的代码基本上是这样的: from tensorflo
我使用 Debian 安装在我的虚拟机上安装了 TensorRT。如果我运行“dpkg -l | grep TensorRT”,我会得到预期的结果: ii graphsurgeon-tf
这些是解决作业的指令? 将您的 TensorFlow 模型转换为 UFF 使用 TensorRT 的 C++ API 解析您的模型,将其转换为 CUDA 引擎。 TensorRT 引擎会自动优化您的模
我只是想下载TensorRT但我看到有两个不同的版本 GA和 RC .它们之间有什么区别,当我使用带有 Geforce GTX 960M 显卡的 Windows 10 机器时,我应该选择什么版本? 最
我发现我们可以通过多种方式优化 Tensorflow 模型。如果我弄错了,请告诉我。 1- 使用 TF-TRT , 这个 API 开发者由 tensorflow 和集成 TensoRT 到 Tenso
我的目标是在 C++ 应用程序中运行经过tensorrt优化的 tensorflow 图。我正在使用tensorflow 1.8和tensorrt 4。使用python api,我能够优化图形并看到性
我一直在尝试在桌面主机上编译一个基本的 tensorRT 项目——目前源代码如下: #include class Logger : nvinfer1::public ILogger { } glog
目录 1. 环境配置 1.1 OpenCV DNN 1.2 ONNXRuntime 1.3 Tenso
我在 Windows 上使用 TensorRT for python 时遇到问题。 我想在 Windows 上使用 openpose 但是它需要用于 python 的 TensorRT。当我尝试执行文
我正在尝试在 C++ 中运行 TensorRT 推理。有时,在尝试构建新引擎或从文件加载引擎时,代码会崩溃。它偶尔会发生(有时它运行没有任何问题)。我按照以下步骤准备网络: initLibNvInfe
我使用 Nvidia 的 Transfer Learning Toolkit (TLT) 进行训练,然后使用 tlt-converter 将 .etlt 模型转换为 .engine 文件。 我想在 p
我一直在使用 TensorRT 和 TensorFlow-TRT 来加速我的 DL 算法的推理。 然后我听说过: JAX https://github.com/google/jax 特拉克斯 http
我正在尝试使用 TensorRT 部署经过训练的 U-Net。该模型是使用 Keras 训练的(使用 Tensorflow 作为后端)。代码与此非常相似:https://github.com/zhix
我正在尝试加速分割模型(unet-mobilenet-512x512)。我使用 FP16 精度模式将我的 tensorflow 模型转换为 tensorRT。而且速度比我预想的要低。 在优化之前,我在
我是一名优秀的程序员,十分优秀!