NVIDIA 发布了用于在 Jetson AGX Orin 的深度学习加速器(DLA)上执行和管理推理的 Python 绑定。开发者无需通过 C++ 控制运行时,即可将推理交给 DLA,并在同一程序中衔接 GPU 任务。
1. 在 Python 中管理运行时
新绑定是 CUDA Python 项目 cuda-bindings 13.3.0 中的 cuda.bindings.cudla。绑定是让其他语言能够使用现有 API 的连接层,此次可通过 Python 处理从创建设备到提交推理任务的操作。
DLA 运行时是支持程序执行的基础软件,已包含在 JetPack 中,无需单独安装。执行已编译、即已转换为可执行代码的模型时使用该运行时,只有将模型转换为可执行格式时才需要 TensorRT。
绑定最低要求 Python 3.10。NVIDIA 也介绍了在需要时准备 3.12 虚拟环境并安装的方法。
2. 分离模型转换与设备端执行
DLA loadable 是将训练好的网络转换为专用加速器可直接读取的二进制文件。通过 TensorRT 的 trtexec 生成一次后,无需在每次推理时重新运行模型转换工具。
NVIDIA 的构建示例在 Jetson AGX Orin 上使用 JetPack 7.2.2 或更高版本。
工具版本为 TensorRT 11.4.1 和 CUDA 13.4 Update 1。
以下命令适用于输入尺寸固定的 ONNX 模型。模型张量采用 16 位浮点格式,命令指定第一个 DLA 引擎,即执行推理运算的执行单元,以及输入输出数据的布局格式,即数据排列顺序。
trtexec \
--onnx=your_model_fp16.onnx \
--useDLACore=0 \
--inputIOFormats=chw16 \
--outputIOFormats=chw16 \
--memPoolSize=dlaSRAM:1 \
--saveEngine=model.bin \
--buildDLAStandalone该命令生成的是供 DLA 使用的二进制文件,推理时无需模型转换工具即可运行。将构建产物与执行分离后,Python 应用就能专注于加载准备好的模型并提交任务。
3. 用同一个任务队列连接 GPU 与 DLA
在 GPU 与 DLA 协作的混合模式中,使用 CUDA 流这一按顺序放入任务的队列。将 GPU 预处理、DLA 推理和 GPU 后处理放入同一队列,即可把输入准备到结果处理串成一个流程。
执行时先初始化 CUDA 并加载模型,再根据模型的张量信息向 DLA 注册 GPU 内存,张量即按多维排列的数值数据。复制输入并提交推理任务后,将完成的结果取回 CPU 内存,在 Python 中进行后处理。
从模型读取的张量信息包含缓冲区大小和数据格式,缓冲区是临时存放数据的内存空间。利用这些信息分配内存和安排输入输出数据布局,可减少为每个模型在代码中写死尺寸的工作。返回的字节数组也按这些信息解析,再交给 Python 进行后续处理。
4. 释放 GPU 余力,但需管理模型与内存
据 NVIDIA 介绍,将受支持的运算交给 DLA,可提高能效,并为其他应用任务保留 GPU 余力。开发者可以分配使用不同加速器,同时将协调执行的代码保留在 Python 中。
DLA 支持的层比 GPU 少,可能需要调整模型图中前后相接的运算,模型图即模型内部运算的连接结构。开发者还须负责缓冲区注册与复制、同步(协调任务完成时机的过程)及资源释放。此次绑定仅支持混合模式,设备句柄不会随 Python 自动内存回收而释放。
5. 将错误处理与退出也纳入 Python 流程
cuDLA 调用失败时,会抛出包含状态码和可读错误名称的 Python 异常。开发者可以捕获异常,针对无效参数或硬件错误编写相应处理逻辑。
NVIDIA 建议将清理代码放在 try/finally 中。清理流程使用与创建操作对应的释放调用,清理已注册内存、模型模块与设备、GPU 内存及流。这相当于将模型执行、错误应对和退出都整合到同一程序流程中。
对于希望将推理交给专用加速器、让 GPU 处理其他任务的边缘开发者,cuDLA Python 绑定提供了用同一种语言管理执行流程的选择。
