Note: This article is available in Chinese only. 本文暂无英文版本。
View original
背景是要把某个 caffe model 转换成 tensorrt 的 INT8 模型,然后遇到如下报错:
1
2E0403 08:54:35.951987 5704 engine.h:62] engine.cpp (572) - Cuda Error in commonEmitTensor: 1 (invalid argument)
3E0403 08:54:35.952157 5704 engine.h:62] Failure while trying to emit debug blob.
4engine.cpp (572) - Cuda Error in commonEmitTensor: 1 (invalid argument)
5E0403 08:54:35.952235 5704 engine.h:62] cuda/caskConvolutionLayer.cpp (355) - Cuda Error in execute: 1 (invalid argument)
6E0403 08:54:35.952291 5704 engine.h:62] cuda/caskConvolutionLayer.cpp (355) - Cuda Error in execute: 1 (invalid argument)
7W0403 08:54:35.952324 5704 calibrator.cpp:45] [4, 3, 224, 224]
8F0403 08:54:35.992761 5704 tensor.h:149] Check failed: cudaMemcpy(raw_mutable_data(), b.raw_data(), size_in_bytes, cudaMemcpyDefault) == cudaSuccess (700 vs. 0)
9*** Check failure stack trace: ***
10Aborted (core dumped)cuda error 700. 原来 cuda error 的错误号可以这么大。。
查了下,说是:
in general, CUDA error 700 is drivers or timeout related.
看起来是个环境问题。然后又试了下之前转的 INT8 模型,依然没有报错。
我就很困惑了,想了下这两个模型的区别。能转的模型是从 pytorch 开始转换的,中间会 merge BN layer;而 cuda error 700 的模型是 caffe 模型,保留了 BN layer。
于是把第一个 BN 以及之后的 layer 都删除。然而仍然是这个错误。
继续删除到只剩下一个 input layer、一个 conv layer,还是报错。事情变得过于诡异了起来,看来不是模型的问题。
然后检查了一下做校准用的预处理参数,发现输入尺寸和模型的输入尺寸竟然是不一致的。跪了。。
之前的模型由于是 pytorch 模型,input size 和预处理 size 是完全由我控制的,因此不会有问题。
但是对于要转换的 caffe 模型,模型的参数和预处理部分是用户提供给我的,而我们的代码中没有做检查(似乎也不好做检查,因为校准的逻辑是在更顶层的)。
但是这个 cuda error 700 的报错也太不友好了吧。
因为之前查了 cuda error 700,发现似乎没人提到这种情况,所以还是写出来分享一下。