花了两天的时间打算在tk1上面跑一下yolo,中间遇到了一些问题,探索后记录下来,也让后来人少走一些弯路吧。
TK1是tegra for kelper1 的简称,是nvidia在针对移动端推出的深度学习运行芯片,为soc架构。更多关于TK1的了解欢迎点击这里。
yolo是目前一个非常不错的深度学习模型,依赖的库比较少,只需要装cuda和opencv。关于yolo的介绍感兴趣的童鞋可以看这里。
第一步就是烧录系统,在这个地方我也是遇到了一些麻烦,最开始以为可以使用jetpack烧录系统,后来试了很久才发现不行,原来我所用的电路板和芯片并非是官方所制定的封装和电路板,是购买了芯片之后自己设计外围电路的。我所用的芯片封装为TD580,而nvidia所用的芯片封装为CD580,两者并不相同。所以在我使用jetpack烧录系统时,进入recovery模式后,运行一段时间,烧录系统时,terminal没有任何反应,一直停留在那里,起初以为是我操作问题,后来才试了几遍,发现一直是这种状况,后来就知道了封装不同烧录模式也不一样。后来找到了Liunx for tegra 系统,再重新进行烧录模式就没有任何问题了。
系统装好了,是ubuntu14.04的系统,当然还是L4T的。安装完系统之后,就可以开始考虑安装CUDA啦。
L4T ubuntu14.04系统本身并没有安装CUDA 和opencv,而如果是采用jetpack安装的话,里面本身会安装cuda 和 opencv for tegra。所以我们只能自己一步一步手动的去安装了。经过在网上查看了解到,tk1本身出来的比较早,安装比较新的8.0不是很可靠,所以决定安装cuda6.5.安装教程在这里,照着去做,应该不会有问题,步骤非常详细。
安装完cuda6.5以后,下一步就是安装opencv。在这里也是碰到了一些弯路,安装几个版本,先安装了较新版本的opencv3.1.0,后来安装不成功,就安装了opencv2.4.9,后来也是提示会有故障,最后安装opencv2.4.10,这次终于没有报错了。安装教程在这里,可以运行例程,如果没有问题,那就说明安装ok。
最后安装yolo,安装步骤非常简单,可以在darknet的官网上找到相应的教程接着做就可以了。
最后就是安装完了的运行demo了,发现问题很多,基本上大部分都是和cuda有关系。
主要的报错如下:
/usr/bin/ld: cannot find -lcudart
/usr/bin/ld: cannot find -lcublas
/usr/bin/ld: cannot find -lcurand
/usr/bin/ld: cannot find -lnpps
/usr/bin/ld: cannot find -lnppi
/usr/bin/ld: cannot find -lnppc
这个地方困扰了我两天,中间也是查了一些别人的解决方案,包括在/etc/ld.so.conf.d文件夹中添加相应的文件目录,完了以后sudo ldconfig,还有其他的比如重新链接,最后发现都不能解决问题。
最后在网上发现这哥们的方法,试了一下,发现不报错了,运行成功了。
运行的命令如下:
sudo cp /usr/local/cuda-6.5/lib/libcudart.so /usr/local/lib/libcudart.so && sudo ldconfig
sudo cp /usr/local/cuda-6.5/lib/libcublas.so /usr/local/lib/libcublas.so && sudo ldconfig
sudo cp /usr/local/cuda-6.5/lib/libcurand.so /usr/local/lib/libcurand.so && sudo ldconfig
sudo cp /usr/local/cuda-6.5/lib/libnppi.so /usr/local/lib/libcudart.so && sudo ldconfig
sudo cp /usr/local/cuda-6.5/lib/libnpps.so /usr/local/lib/libcublas.so && sudo ldconfig
sudo cp /usr/local/cuda-6.5/lib/libnppc.so /usr/local/lib/libcurand.so && sudo ldconfig
经过上面以后,发现程序就能够运行成功啦。可是现在又出现另外一个问题,那就是跑yolo程序经常会跑不通,经过运行过程中会出现killed命令。打开nvidia本身的资源运行命令./tegrastats,查看才发现原来我的内存为2G,运行yolo时,内存接近全部用掉,所以没有多余的内存,因此会出现经常killed的情况出现,如果是4g的内存的话,情况会好很多。运行tiny yolo,占的内存是少了很多,可是准确率也是急速下降,识别的一点也不准。TX1上面之前也跑过,yolo2运行没有任何问题,速度会比tk1要快,且也不会出现内存全部被占用的情况出现。