使用tensorrt的一些问题

1.碰到如下报错:

[TensorRT] ERROR: INVALID_CONFIG: The engine plan file is generated on an incompatible device, expecting compute 7.5 got compute 8.6, please rebuild.
[TensorRT] ERROR: engine.cpp (1646) - Serialization Error in deserialize: 0 (Core engine deserialization failure)
[TensorRT] ERROR: INVALID_STATE: std::exception
[TensorRT] ERROR: INVALID_CONFIG: Deserialize the cuda engine failed.

最终报错:AttributeError: 'NoneType' object has no attribute 'create_execution_context'

原先以为是环境的问题,tensorrt从8换到7又换到8,cudnn版本也是从7换到8.2又换到8.1,最后发现,原来是trt权重是在其他电脑转换的,显卡不一样,其实他的报错说明了,设备不匹配,只是他说rebuild,我始终以为是tensorrt不对,所以只需要在本机再重新转换一次就可以了。不过好像当前的torch2trt不支持tensorrt8.

补充说一下,我这边用两张一样的显卡,同品牌同型号,在B卡只用A转换的权重的时候,还是会报警告,但是能运行,也不知道会不会有隐患。所以,这搞得好严格,如果是一机多卡的,不能用同一权重的话,可以做一下判断,每张卡用各自的权重就好了。

2.在用torch2trt的时候,出现报错:

ValueError: Expected more than 1 value per channel when training, got input size XXX

待转换的模型需要做eval()

出现报错:

TypeError: cannot pickle 'tensorrt.tensorrt.ICudaEngine' object

保存模型的时候,之前的写法是

torch.save(model_trt, "model_trt.pth")

这样就报了上面的错,需要保存权重,而不是模型,所以应该是

torch.save(model_trt.state_dict(), "model_trt.pth")

3.

安装tensorrt的时候,我用的是tar包,会省一点事,deb包会报错,据说跟cuda的安装方式有关,这个没有深究。下载的tar包,其名字会比网页写的详细,他详细写了支持的cuda版本和cudnn的版本,不匹配的话,可能会在引用的时候报错,找不到某so库,并且so库还写了版本。

安装方式,只需要在tar包里面的python文件夹中,直接pip安装相应python版本的whl,还有其他几个文件夹,然后将lib文件夹放在bashrc中。

然后在安装torch2trt的时候,可能会报找不到h头文件,此时我是在把include文件夹也放在bashrc中,但是和lib不一样,include应该是

export C_INCLUDE_PATH

export CPLUS_INCLUDE_PATH

分别对应c和c++,不过我不知道应该是哪个,都设置呗,不过百度得到,这个是对win有效,但是我设了也确实没报错了

torch2trt安装plugins的时候,可能会有一些莫名其妙的错,然后,官方是说要加sudo,但是我担心用sudo的话,就装到root的python里面了,然后为避免意外,我是

sudo /home/XXX/miniconda3/bin/python setup.py install --plugins

直接指定当前用户的python执行的,有的报错,用sudo就不会报错了。

如果报错提示找不到库,或者还是提示找不到头文件,此时如果用了sudo的话,bashrc就是root目录下的了,lib文件的话,就干脆在/usr/lib下建立链接算了,头文件,那就是/usr/include,一般最终就是报-lnvinfer找不到,这个就建立链接算了,别折腾了。

特别的,好像当前torch2trt不太支持tensorrt8,安装plugins会各种报错,然后在转换的时候会报'tensorrt.tensorrt.Builder' object has no attribute 'max_workspace_size',github上的issue上两人也是这个问题,下面回复回退到7.2.3,果然问题解决。

4.转换后的trt模型,不能做batch运算:

原因可能是在转换的时候,使用的默认参数,在torch2trt类中,有个参数是max_batch_size,默认为1,设为需要的值再转换就可以了

还有很多参数,可以看着设置试一试,比如fp16_mode

你可能感兴趣的:(小知识,python,深度学习)