标签: tensorrt

没有名为“uff”的模块

目标: 将 tensorflow .pb 模型转换为 tensorrt

系统规格: Ubundu 18.04 Cuda 10.0 TensorRT 5.1

连安装 sudo apt-get install uff-converter-tf

尝试uff在 Python 中导入时出错:

ModuleNotFoundError: 没有名为“uff”的模块

python tensorflow tensorrt uff

2
推荐指数
1
解决办法
1890
查看次数

TensorRT 中的 converter.build() 有什么用?

TensorRT官方文档列出了两种将 TensorFlow SavedModel 转换为 TensorRT SavedModel 的方法:第一种是

from tensorflow.python.compiler.tensorrt import trt_convert as trt
converter = trt.TrtGraphConverterV2(input_saved_model_dir=input_saved_model_dir)
converter.convert()
converter.save(output_saved_model_dir)
Run Code Online (Sandbox Code Playgroud)

第二个是

import tensorflow as tf
from tensorflow.python.compiler.tensorrt import trt_convert as trt

conversion_params = trt.DEFAULT_TRT_CONVERSION_PARAMS
conversion_params = conversion_params._replace(
    max_workspace_size_bytes=(1<<32))
conversion_params = conversion_params._replace(precision_mode="FP16")
conversion_params = conversion_params._replace(
    maximum_cached_engiens=100)

converter = trt.TrtGraphConverterV2(
    input_saved_model_dir=input_saved_model_dir,
    conversion_params=conversion_params)
converter.convert()
def my_input_fn():
  for _ in range(num_runs):
    Inp1 = np.random.normal(size=(8, 16, 16, 3)).astype(np.float32)
    inp2 = np.random.normal(size=(8, 16, 16, 3)).astype(np.float32)
    yield inp1, inp2
converter.build(input_fn=my_input_fn)
converter.save(output_saved_model_dir)

saved_model_loaded = tf.saved_model.load(
    output_saved_model_dir, tags=[tag_constants.SERVING]) …
Run Code Online (Sandbox Code Playgroud)

python tensorflow tensorrt

2
推荐指数
1
解决办法
737
查看次数

如何将 lambda 与模板化 std::unique_ptr 一起使用?

诸如nvinfer1::IRuntime和 的NVIDIA TensorRT 对象nvinfer1::ICudaEngine不能直接存储在std::unique_ptr<>. 相反,他们有一个destroy()必须被调用的方法。

因此,要完成这项工作,您必须使用这样的删除器:

#include <NvInfer.h>
#include <cuda.h>

template<typename T>
struct NVIDIADestroyer
{
    void operator()(T * t)
    {
        t->destroy();
    }
};

template<typename T>
using NVIDIAUniquePtr = std::unique_ptr<T, NVIDIADestroyer<T>>;
Run Code Online (Sandbox Code Playgroud)

而不是std::unique_ptr<T>,然后使用NVIDIAUniquePtr<T>.

到目前为止,这工作正常。然后我在清理代码时尝试做的是用 lambda 替换删除器,这样我就可以跳过定义NVIDIADestroyer结构。但我无法弄清楚如何做到这一点。我的想法是这样的:

template<typename T>
using NVIDIAUniquePtr = std::unique_ptr<T, [](T * t)
{
    t->destroy();
}>;
Run Code Online (Sandbox Code Playgroud)

但这会导致以下错误消息:

TRT.hpp:52:45: error: lambda-expression in template-argument
using NVIDIAUniquePtr = std::unique_ptr<T, [](T * t)
                                             ^
TRT.hpp:55:2: error: template argument 2 is …
Run Code Online (Sandbox Code Playgroud)

c++ lambda unique-ptr c++17 tensorrt

2
推荐指数
1
解决办法
195
查看次数

在 TensorRT 上添加多重推理(无效资源句柄错误)

我正在尝试使用 Jetson Nano 在管道中运行两个推理。第一个推论是使用 MobileNet 和 TensorRT 进行对象检测。我的第一个推理的代码几乎是从AastaNV/TRT_Obj_Detection存储库复制的。唯一的区别是我更改了该代码,使其驻留在 Inference1 类中。

第二个推理作业使用第一个推理的输出来运行进一步分析。对于这个推论,我使用tensorflow(不是TensorRT,但我假设它是在后端调用的?)使用自定义模型。该模型是从.pb文件(冻结图)加载的。加载后,通过调用tensorflow的命令进行推理session.run()

如果我仅运行 Inference1 或 ONLY Inference2,则代码运行正常,没有任何错误。但是,当我通过管道传输它们时,出现错误[TensorRT] ERROR: cuda/caskConvolutionLayer.cpp (355) - Cuda Error in execute: 33 (invalid resource handle)

从我在日志中看到的情况来看,TensorRT 序列化图的加载没有任何问题。Tensorflow 也被导入并且它可以识别我的 GPU。从网上搜索我发现这个问题可能与CUDA Contexts有关?因此,我在下面展示了如何在下面的代码中设置 CUDA 上下文。create_cuda_context仅在 Inference1 类初始化期间调用一次。称为run_inference_for_single_image每次迭代。

代码:

def create_cuda_context(self):
    self.host_inputs, self.host_outputs = [], []
    self.cuda_inputs, self.cuda_outputs = [], []
    self.bindings = []
    self.stream = cuda.Stream()

    for binding in self.engine:
        size = trt.volume(self.engine.get_binding_shape(binding)) * self.engine.max_batch_size
        host_mem = cuda.pagelocked_empty(size, np.float32) …
Run Code Online (Sandbox Code Playgroud)

python pycuda tensorflow tensorrt nvidia-jetson

1
推荐指数
1
解决办法
5319
查看次数

标签 统计

tensorrt ×4

python ×3

tensorflow ×3

c++ ×1

c++17 ×1

lambda ×1

nvidia-jetson ×1

pycuda ×1

uff ×1

unique-ptr ×1