【torch加速】python onnx to tensorRT报错NotImplementedError: Converting dtype(‘float16‘) to a ctypes type

文章讲述了在将PyTorch模型转换为TensorRT并进行推理时遇到的NotImplementedError,涉及到float16到ctype类型的转换问题。作者通过将float16替换为int16作为临时解决方案,参考了TensorRTGitHub项目中的Yolov3示例。
部署运行你感兴趣的模型镜像

在进行torch加速时,使用了torch-onnx-torch的思路,当前阶段已成功生成tensorrt engine,但是在使用tensor RT engine进行推理的过程中遇到了该报错:NotImplementedError: Converting dtype(‘float16’) to a ctypes type


推理实现过程参考的tensorRT github项目的example中的yolov3-https://github.com/NVIDIA/TensorRT/tree/release/8.6/samples/python/yolov3_onnx

报错是出现在common文件的HostDeviceMem函数中,意思是float16类型在ctype中没有定义,解决方式见TensorRT issue #3222

I made a workaround :

 1. Initialize np.ndarray from int16 ctypes point 
 2. use arr.dtype = np.float16 to change dtype inplace.

其意思就是既然ctype没有该类型,就在开辟内存时用int16类型来代替float16,因为他们占用的内存大小是一样的。

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

PyTorch 2.5

PyTorch 2.5

PyTorch
Cuda

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

### 解析 `torch.onnx.export` 函数中的 `ValueError` 当遇到 `torch.onnx.export` 报错 `ValueError: too many values to unpack (expected 5)` 时,这通常意味着函数调用过程中尝试解包的数量与实际返回值数量不匹配。具体来说,在此场景下可能是传递给 `export` 方法的参数数目或结构不符合预期。 #### 原因分析 错误提示表明期望有五个值被解开分配给变量,但实际上接收到的数据包含了更多或更少的内容。对于 `torch.onnx.export()` 来说,常见的原因包括但不限于: - 输入张量列表长度不对。 - 动态形状处理不当。 - 版本兼容性问题导致的行为差异[^1]。 #### 解决方案 针对上述情况,建议采取以下措施来解决问题: 1. **验证输入参数** 确保传入 `torch.onnx.export` 的模型、输入张量和其他必要参数完全按照官方文档的要求设置。特别是要仔细核对用于模拟推理过程的实际输入数据形式是否正确无误。 2. **调整输出格式** 如果确实存在额外的输出项,则应该相应修改接收这些输出的方式。例如,如果是从环境中获取状态信息时遇到了多余的返回值,那么可以在定义接收变量的地方增加占位符 `_` 来忽略不需要的部分,就像之前提到的例子那样做更改 `s_, r, done, info = env.step(a)` 改成 `s_, r, done, info, _ = env.step(a)`。 3. **更新库版本** 考虑到不同版本之间可能存在行为上的变化,有时降低某些依赖库(如 PyTorchONNX)至特定稳定版也可能有助于消除此类异常。不过在此之前应当先查阅相关项目的发行日志了解是否存在已知的相关 bug 和对应的解决方案[^2]。 4. **调试模式下的测试** 启用详细的日志记录功能可以帮助定位确切的问题所在。通过打印出每次调用前后各个阶段的状态以及最终产生的结果集大小,能够更容易发现哪里出现了偏差。 ```python import torch from torch import onnx # 设置环境以便于捕获更多信息 onnx.set_default_opset_version(11) dummy_input = ... # 定义合适的虚拟输入 model = MyModel() # 初始化待导出的模型实例 try: with torch.no_grad(): output = model(dummy_input) print(f"Output shape before export: {output.shape}") # 尝试导出ONNX文件前先单独执行一次forward pass查看是否有其他潜在问题 torch.onnx.export( model, dummy_input, "mymodel.onnx", input_names=["input"], output_names=["output"], dynamic_axes={"input":{0:"batch_size"}, "output":{0:"batch_size"}}, opset_version=11, verbose=True ) except Exception as e: print(e) finally: print("Debug information printed above.") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

↣life♚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值