|
背景背景是需要在nvidiajetpack4.5.1的arm64设备上跑yolov8,用TensorRT加速,需要用*.engine格式的模型,但是手头上的是pt格式模型,众所周知小板子的内存都很小,连安装ultralytics依赖库的容量都没有,所以我想到在windows系统上先把模型转好,然后再直接放在板子上用。下载ultralyticsyolov8https://github.com/ultralytics/ultralytics找到exporter.py我以为是直接在这个exporter.py上直接改参数来转模型,找了半天找不到,然后直接运行这个python文件也是失败报错,后来才看到这个exporter.py上面有教如何使用安装依赖库pipinstall"ultralytics[export]1等待安装好,这需要很长时间然后不是直接运行这个exporter.py文件,而是像提示里面一样,创造一个py文件,在文件里面复制这几行然后改参数就行了fromultralyticsimportYOLOmodel=YOLO('yolov8n.pt')results=model.export(format='onnx')123结果我运行了会报错找不到gpuassertself.im.device.type!='cpu',"exportrunningonCPUbutmustbeonGPU,i.e.use'device=0'"AssertionError:exportrunningonCPUbutmustbeonGPU,i.e.use'device=012查了是需要指定gpu,然后我尝试在python里指定gpu,都还是报这个错,突然看到有提示需要device=0,我想这是加在哪里的呢,后来发现是在下面那个cli命令行加尝试一步到位转成engine模型yolomode=exportmodel=Gap.ptformat=engine1报错assertself.im.device.type!=‘cpu’,“exportrunningonCPUbutmustbeonGPU,i.e.use‘device=0’”assertself.im.device.type!='cpu',"exportrunningonCPUbutmustbeonGPU,i.e.use'device=0'"1解决办法就是在后面加一个device=0yolomode=exportmodel=Gap.ptformat=enginedevice=01把模型放在小板子上用结果报错ERROR:coreReadArchive.cpp(31)-SerializationErrorinverifyHeader:0(Magictagdoesnotmatch)查了下,我真是慌了,意思是编译engine时候的使用的tensorrt版本与使用trt推理时候的tensorrt版本不一致,需要一致才行,排查下各自是什么版本linux查tensorRT版本ldd可执行文件1可以看到生成可执行文件的tensorRT是7版本这个命令行也可以查询到dpkg-l|grepTensorRT1能看到是7.1.3版本的tensorRTwindows查tensorRT版本importtensorrtastrtprint(f'TensorRTversion:{trt.__version__}')12可以看到我在编译engine时候的使用的tensorrt版本是8.4,版本不匹配,所以trt推理失败。然后我寻思arm64环境是不方便更改的,那我就降低windows端的tensorRT版本,我就去nvidia官网下载(https://developer.nvidia.com/tensorrt/download)结果,官网都不提供7.1版本的tensorRT下载了,一下子又不知道该怎么解决了。我突然想到既然直接使用engine不行,那我用生成出来的onnx模型再在arm64上转成engine行不行aarch64上onnx转engine模型找到你本机上的trt转模型可执行文件sudofind/-nametrtexec1复制到你的模型文件夹./trtexec--onnx=/home/adlink/wjp/YoloV8-TensorRT-Jetson_Nano-main/models/yolov8n.onnx--saveEngine=yolov8n.engine--fp16=fp321结果还是报错volumemismatch,Inputdimensions[1,33,8400]havevolume277200andoutputdimensions[1,4,16,8400]havevolume537600.仿佛又没有办法解决了,难道非要统一版本,但是这上面尝试过已知道是非常困难的,我尝试用其他办法,后来尝试更换参数,发现是opset版本太高的问题,好像默认是17,而aarch64上的版本很低,需要在yolo转pt为onnx的步骤加指定opset的参数yoloexportmodel=yolov8s.ptformat=onnxopset=11simplify=True1再把生成的onnx文件用trtexec转./trtexec--onnx=/home/adlink/wjp/YoloV8-TensorRT-Jetson_Nano-main/models/yolov8n.onnx--saveEngine=yolov8n.engine--fp16=fp321就转成功了,跑模型也没问题!特别说明下[TRT]Sometacticsdonothavesufficientworkspacememorytorun.Increasingworkspacesizemayincreaseperformance,pleasecheckverboseoutput.1中间会在这个步骤停很长时间,这个不是报错,静静等待就好了,过一会就能成功转换onnx为engine模型了
|
|