You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Nvidia Jetson Nano上TensorRT反序列化引擎PyInstaller编译后CUDA初始化错误

解决PyInstaller打包TensorRT反序列化引擎失败的问题

我之前在Jetson Nano上也碰到过一模一样的问题——直接运行Python代码完全正常,PyInstaller打包后反序列化TensorRT引擎却返回None,还报CUDA初始化错误。结合你的环境和代码情况,下面是可能的原因和对应的解决办法:

一、核心原因分析

问题本质出在PyInstaller打包逻辑上:

  • 构建引擎时,TensorRT会实时生成并加载内核,依赖的库会被Python进程自动触发加载,PyInstaller能轻松捕获到这些依赖;
  • 反序列化引擎时,需要加载预编译的TensorRT内核和底层CUDA库,这些系统级的动态库往往不会被PyInstaller自动检测并打包,导致运行时找不到依赖,触发初始化错误。

二、具体解决办法

1. 手动指定TensorRT/CUDA依赖库打包

PyInstaller默认不会自动包含系统级的TensorRT和CUDA动态库,需要在spec文件中手动添加:

  • 先生成spec文件:
    pyinstaller --name trt_app temp.py
    
  • 打开生成的trt_app.spec文件,修改binaries字段,添加Jetson上的TensorRT和CUDA库路径(根据你的实际路径调整):
    binaries=[
        ('/usr/lib/aarch64-linux-gnu/libnvinfer.so.7', '.'),
        ('/usr/lib/aarch64-linux-gnu/libnvinfer_plugin.so.7', '.'),
        ('/usr/lib/aarch64-linux-gnu/libnvonnxparser.so.7', '.'),
        ('/usr/local/cuda/lib64/libcudart.so.10.2', '.'),
        ('/usr/local/cuda/lib64/libcublas.so.10', '.'),
        ('/usr/local/cuda/lib64/libcufft.so.10', '.')
    ]
    
    你可以通过ldd $(python -c "import tensorrt; print(tensorrt.__file__)")命令查看tensorrt模块依赖的所有动态库,把缺失的都补充进去。
  • 用spec文件重新打包:
    pyinstaller trt_app.spec
    

2. 确保运行时环境变量正确设置

打包后的程序可能无法继承系统的LD_LIBRARY_PATH,导致找不到CUDA/TensorRT库:

  • 方法一:在Python代码开头添加环境变量设置:
    import os
    # 优先指定TensorRT和CUDA的库路径
    os.environ['LD_LIBRARY_PATH'] = '/usr/lib/aarch64-linux-gnu:/usr/local/cuda/lib64:' + os.environ.get('LD_LIBRARY_PATH', '')
    
  • 方法二:写一个启动shell脚本(更可靠):
    #!/bin/bash
    export LD_LIBRARY_PATH=/usr/lib/aarch64-linux-gnu:/usr/local/cuda/lib64:$LD_LIBRARY_PATH
    ./dist/trt_app/trt_app
    
    给脚本加执行权限后,通过脚本启动程序。

3. 添加隐藏导入项

PyInstaller可能漏掉了TensorRT和PyCUDA的一些子模块,在spec文件的hiddenimports中补充:

hiddenimports=['tensorrt', 'tensorrt.runtime', 'pycuda.driver', 'pycuda.autoinit']

4. 验证序列化引擎的兼容性

虽然你是同一设备生成的引擎,但还是要确认trtexec的参数和你的反序列化环境匹配:

  • 比如生成引擎时是否指定了--fp16(你的代码里构建引擎用了float16),确保序列化引擎的精度和反序列化时的环境一致;
  • 可以用trtexec重新生成引擎,命令示例:
    trtexec --onnx=model.onnx --saveEngine=model.trt --fp16 --explicitBatch
    

5. 调整PyInstaller版本

旧版本PyInstaller对Jetson上的Python扩展库支持可能有问题,建议使用适配Python3.6的PyInstaller 4.x版本(Jetson Nano 2020系统默认Python版本为3.6):

pip install pyinstaller==4.5.1

三、验证步骤

打包完成后,先在终端运行打包后的程序,查看详细错误日志,如果还有库缺失的提示,继续把对应的库添加到spec文件的binaries中,直到所有依赖都被正确包含。

内容的提问来源于stack exchange,提问作者Kroshka Kartoshka

火山引擎 最新活动