pth->onnx->trt踩坑笔记1

本文解决了TensorRT在编译、链接及模型转换过程中遇到的典型问题,包括找不到CUDA头文件、链接错误、网络输出缺失等,并提供了详细的解决步骤。
部署运行你感兴趣的模型镜像

1、在make的时候遇到问题,无法找到cuda的头文件:

error: cuda_runtime_api.h: No such file or directory
 #include "cuda_runtime_api.h"
          ^~~~~~~~~~~~~~~~~~~~
compilation terminated.

解决办法,将cuda_runtime_api.h的路径加入到.bashrc中的CPATH中,如下操作

export CPATH="/usr/local/cuda/targets/x86_64-linux/include:/mnt/TSB2T01/sda15/TensorRT-7.2.1.6/include:/usr/include/c++/7.5.0:$CPATH"

source .bashrc之后,问题解决。

2、最近编译一个torch的pth转TensorRT的trt工具的时候遇到的错误:

/usr/bin/ld: 找不到 -lnvinfer

/usr/bin/ld: 找不到 -lcudart

collect2: error: ld returned 1 exit status

make[2]: *** [CMakeFiles/dbnet.dir/build.make:120:dbnet] 错误 1

make[1]: *** [CMakeFiles/Makefile2:95:CMakeFiles/dbnet.dir/all] 错误 2

make: *** [Makefile:103:all] 错误 2

遇到这种错误,第一反应是LD_LIBRARY_PATH没有添加相关的路径,于是,检查了cuda和TensorRT的LD_LIBRARY_PATH,发现都是对的,没什么问题。

后来翻看Makefile,发现作者已经在Makefile中以-Wl,-rpath的方式指定了动态库的链接地址,将动态库的链接地址改到我们自己的cuda的动态库的地址,再把TensorRT的库全复制到cuda存库的地址,问题解决。

3、在使用转换成功的onnx文件转trt的时候遇到报错:

[TensorRT] ERROR: Network must have at least one output
[TensorRT] ERROR: Network validation failed.

查阅相关的博客,发现只要在with open(onnx_file_path, 'rb') as model:之后加两行:

last_layer = network.get_layer(network.num_layers - 1)

network.mark_output(last_layer.get_output(0))

问题解决。

import tensorrt as trt

def ONNX_build_engine(onnx_file_path):
    '''
    通过加载onnx文件,构建engine
    :param onnx_file_path: onnx文件路径
    :return: engine
    '''
    # 打印日志
    G_LOGGER = trt.Logger(trt.Logger.WARNING)
    explicit_batch = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH)
    with trt.Builder(G_LOGGER) as builder, builder.create_network(explicit_batch) as network, trt.OnnxParser(network, G_LOGGER) as parser:
        builder.max_batch_size = 100
        builder.max_workspace_size = 1 << 20

        print('Loading ONNX file from path {}...'.format(onnx_file_path))
        with open(onnx_file_path, 'rb') as model:
            print('Beginning ONNX file parsing')
            parser.parse(model.read())
        last_layer = network.get_layer(network.num_layers - 1)
        network.mark_output(last_layer.get_output(0))
        print('Completed parsing of ONNX file')

        print('Building an engine from file {}; this may take a while...'.format(onnx_file_path))
        engine = builder.build_cuda_engine(network)
        print("Completed creating Engine")

        # 保存trt文件
        with open('my.engine', "wb") as f:
            f.write(engine.serialize())
        return engine

if __name__=='__main__':
    ONNX_build_engine('./my.onnx')

4、在加了问题2的两行之后,出现了新的问题:

python3: ../builder/Network.cpp:1205: virtual nvinfer1::ILayer* nvinfer1::Network::getLayer(int) const: Assertion `layerIndex >= 0' failed.

经查阅其他人博客,在这位博主的博客中找到问题所在https://blog.youkuaiyun.com/qq_23116521/article/details/107617442

trt7若缺少explicit_batch = 1 << (int)(trt.NetworkDefinitionCreationFlag.EXPLICIT_BATCH),会产生上面的报错,按照问题2中的代码加上这一行,问题解决。

5、在onnx->trt的过程中遇到以下问题:

[TensorRT] ERROR: Try increasing the workspace size with IBuilderConfig::setMaxWorkspaceSize() if using IBuilder::buildEngineWithConfig, or IBuilder::setMaxWorkspaceSize() if using IBuilder::buildCudaEngine.

出现此问题后,无法正常转成engine,根据提示,在转换脚本中做如下修改:

builder.max_workspace_size = 1 << 30
再次运行转换脚本,问题解决。

 

您可能感兴趣的与本文相关的镜像

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

int avts_telemetry_caculate_cipc_data(CIPC_TELEMETRY_VIDEO *timestamp_data, CIPC_TELEMETRY_VIDEO_DATA *telemetry_data) { if (!timestamp_data || !telemetry_data) { return ERROR; } memset(telemetry_data, 0, sizeof(CIPC_TELEMETRY_VIDEO_DATA)); dump_cipc_video_info(timestamp_data); telemetry_data->ct = timestamp_data->ct; strncpy(telemetry_data->tid, timestamp_data->tid, RELAY_MAX_SID_LEN); telemetry_data->req_utc_time = timestamp_data->req_utc_time; telemetry_data->rsp_utc_time = timestamp_data->rsp_utc_time; telemetry_data->pth_process_du = (int)(timestamp_data->rsp_up_time - timestamp_data->req_up_time); telemetry_data->rsp_code = timestamp_data->rsp_code; if (timestamp_data->end_conn_time) { telemetry_data->conn_time_cost = (int)(timestamp_data->end_conn_time - timestamp_data->st_conn_time); } if (timestamp_data->st_conn_time) { telemetry_data->trans_fail_res = timestamp_data->conn_fail_code; } if (timestamp_data->send_post_time) { telemetry_data->send_post = (int)(timestamp_data->send_post_time - timestamp_data->end_conn_time); } if (timestamp_data->recv_post_time) { telemetry_data->recv_post_du = (int)(timestamp_data->recv_post_time - timestamp_data->send_post_time); } if (timestamp_data->recv_start_time) { telemetry_data->recv_start_du = (int)(timestamp_data->recv_start_time - timestamp_data->recv_post_time); telemetry_data->recv_start_time = timestamp_data->recv_start_utc; } if (timestamp_data->first_iframe_utc) { telemetry_data->fir_keyif_time = timestamp_data->first_iframe_utc; telemetry_data->start_keyif_du = (int)(timestamp_data->first_iframe_time - timestamp_data->recv_start_time); telemetry_data->post_keyif_du = (int)(timestamp_data->first_iframe_time - timestamp_data->recv_post_time); telemetry_data->total_du = (int)(timestamp_data->first_iframe_time - timestamp_data->req_up_time); } telemetry_data->is_dir_push = timestamp_data->is_dir_push; telemetry_data->is_pre = timestamp_data->is_pre; telemetry_data->end_reson = timestamp_data->end_code; if (timestamp_data->end_vedio_time) { telemetry_data->play_du = (int)(timestamp_data->end_vedio_time - timestamp_data->end_conn_time); } telemetry_data->is_over_flow = timestamp_data->is_over_flow; return OK; }
最新发布
12-18
这段代码是函数 `avts_telemetry_caculate_cipc_data()`,它的功能是 **将原始视频时间戳结构 `CIPC_TELEMETRY_VIDEO` 换为用于上报或分析的统计结构 `CIPC_TELEMETRY_VIDEO_DATA`**。 --- ### ✅ 函数功能解析: #### 1. **参数检查** ```c if (!timestamp_data || !telemetry_data) { return ERROR; } ``` - 如果任意一个指针为 NULL,说明参数无效,函数返回错误码 `ERROR`。 --- #### 2. **初始化目标结构体** ```c memset(telemetry_data, 0, sizeof(CIPC_TELEMETRY_VIDEO_DATA)); ``` - 清空 `telemetry_data` 结构体,确保初始状态为 0。 --- #### 3. **打印调试信息** ```c dump_cipc_video_info(timestamp_data); ``` - 调用之前定义的 `dump_cipc_video_info()` 函数,输原始时间戳信息,便于调试。 --- #### 4. **数据拷贝与计算** 将 `timestamp_data` 中的字段拷贝到 `telemetry_data`,并计算一些关键性能指标: | 指标 | 含义 | |------|------| | `pth_process_du` | 请求到响应的处理耗时(单位:ms) | | `conn_time_cost` | 网络连接耗时 | | `trans_fail_res` | 连接失败原因码 | | `send_post` | 发送 POST 请求耗时 | | `recv_post_du` | 接收 POST 响应耗时 | | `recv_start_du` | 接收开始耗时 | | `fir_keyif_time` | 首帧 I 帧时间(UTC) | | `start_keyif_du` | 从接收开始到首帧 I 帧的时间 | | `post_keyif_du` | 从接收完成到首帧 I 帧的时间 | | `total_du` | 从请求到首帧 I 帧的总耗时 | | `play_du` | 视频播放持续时间 | --- ### ✅ 示例结构体定义(简化): ```c typedef struct { long long ct; // 创建时间 char tid[32]; // 事务 ID long long req_utc_time; // 请求 UTC 时间 long long rsp_utc_time; // 响应 UTC 时间 int pth_process_du; // 请求到响应处理耗时 int conn_time_cost; // 连接耗时 int trans_fail_res; // 传输失败码 int send_post; // 发送 POST 耗时 int recv_post_du; // 接收 POST 耗时 int recv_start_du; // 接收开始耗时 long long recv_start_time; // 接收开始时间 long long recv_start_utc; // 接收开始 UTC 时间 long long fir_keyif_time; // 首帧 I 帧时间 int start_keyif_du; // 接收到首帧耗时 int post_keyif_du; // 接收完成后到首帧耗时 int total_du; // 总体延迟 int is_dir_push; // 是否为直推模式 int is_pre; // 是否为预览模式 int end_reson; // 结束原因码 int play_du; // 播放时长 int is_over_flow; // 是否溢 } CIPC_TELEMETRY_VIDEO_DATA; ``` --- ### ✅ 使用示例: ```c CIPC_TELEMETRY_VIDEO video_info = {0}; CIPC_TELEMETRY_VIDEO_DATA telemetry_data = {0}; avts_telemetry_caculate_cipc_data(&video_info, &telemetry_data); ``` --- ### ❗ 注意事项: - **字段单位一致性**:确保所有时间戳单位一致(如毫秒),避免计算结果错误。 - **结构体拷贝安全**:使用 `strncpy()` 时注意字符串截断问题,建议使用 `sizeof()` 控制长度。 - **字段命名规范**:如 `end_vedio_time` 存在拼写错误,建议统一为 `video`。 - **性能分析用途**:该函数主要用于性能分析、延迟统计、上报日志等场景。 --- ###
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值