Dji ManiFold-2G(Nivida Jetson TX2)源码安装Tensorflow-1.12.0
- Cuda 9.0
- Jetpack 3.3
- Python 3.5
- cuDNN 7.4.1(严格匹配!其他版本会出现问题!)
1. 使用背景:
使用TensortRt在DJI MANIFOLD-2G 部署加速目标检测模型。Nivida 提供了一些版本的tensorflow wheel安装。
由于Dji ManiFold-2G内置的Jetpack 3.3,Cuda9.0,Jetpack和Cuda版本不可随便变更,所以在安装tensorflow时需要注意按照版本进行匹配。在TX2上安装tensorflow-0.8.0经过测试是可以正常使用的,但是在转换和加载目标检测模型是会出现一些问题,因此尝试更高版本的tensoflow。
2. 准备工作:
2.1 创建虚拟内存空间
由于MANIFOLD-2G 的内存只有8G,在源码编译tensorflow这种大型项目时需要足够的内存,因此建议在硬盘上创建8G虚拟内存(按照自己实际需求创建虚拟内存)。
$ sudo fallocate -l 8G /swapPath/8GB.swap
$ sudo mkswap /swapPath/8GB.swap
$ sudo swapon /swapPath/8GB.swap
此时可以使用free-m
看到已经新建了8GB的虚拟内存,为了保证该虚拟内存在计算机重启后仍有效,需要将下面语句添加到/etc/fstab
后并重启计算机:
$ /swapPath/8GB.swap none swap sw 0 0
注: 在TX-2这种开发板上创建虚拟内存空间十分重要,这保证一些大型程序的编译有足够的内存空间,如果不建立这样的内存空间在编译TF时会出现内存不足的错误。
3. 安装步骤:
作者在安装学习的过程中主要参考JK Jung blog,该博客给作者的工作提供了极大的帮助,因此这里也主要借鉴JK Jung所提供的相关内容。
-
如果你已经安装了tensorflow、tensorboard,需要先讲其卸载
$ sudo pip3 uninstall -y tensorflow tensorboard
-
从Github上下载安装源码,这里直接使用JK Jung的Github的jetson_nano仓库
$ cd /project $ git clone https://github.com/jkjung-avt/jetson_nano.git $ cd jetson_nano
-
安装libprotobuf-3.6.1,安装该版本的libprotobuf主要是由于在使用TensorRt加速模型时大幅度提升对模型文件(xx.pd)载入的时间。
$ ./install_protobuf-3.6.1.sh
在安装protobuf过程中比较顺利没有出现问题,但是编译时间较长。如编译中遇到问题可以交流。
-
安装bazel-0.15.2,bazel主要是tensorflow的源码编译工具。
./install_bazel-0.15.2.sh
bazel编译中出现的问题:
Q1. 无法解压tensorflow/third_party/asm/asm-6.0.jar
该问题主要是由于使用unzip对.jar文件解压失败造成的,笔者没有找到更合适的方法解决这个问题,但是尝试了一种比较笨拙的方式解决了该问题。
首先,进入到出现问题的文件夹:
cd /src/tensorflow/third_party/asm
其次,将asm中.jar文件加上.zip后缀后变成xxx.jar.zip,再使用unzip解压时发现是正确的,按照此方法可以解决该问题。
Q2. 解压正确,但是后面运行时仍提示无xxx.jar文件
出现这个问题很迷惑,笔者尝试解压完文件后将原来的xxx.jar文件又放回到 /src/tensorflow/third_party/asm目录中,编译正确执行。(上述问题的出现用着两种方法可以解决,但是笔者总觉得这不是最合适的方法,没有从根本解决这个问题,如果大家有更好的解决方法,欢迎交流!!)
-
源码安装tensorflow-1.12.2,执行安装脚本,包括下载tensorflow所依赖的环境。
./install_tensorflow-1.12.2.sh
编译中出现的问题:
Q3. bazel构建文件出现的release-62-1.tar.gz错误解决
该问题主要是由于下载release-62-1.tar.gz的错误,搭建一个本地的http服务,自己下载release-62-1.tar.gz并将其放到相应的位置。具体步骤如下:
① 搭建本地http服务:
$ sudo apt-get install httpd $ sudo apt-get install apache2 $ sudo apt-get install apache2-dev
安装成功后使用
sudo systemctl status apache2
查看状态,在浏览器中输入localhost出现下面界面即为成功。② 安装release-62-1.tar.gz
下载地址,将下载好的文件复制到
/var/www/html
目录下,并将https://localhost/release-62-1.tar.gz
添加到tensorflow/third_party/icu/workspace.bzl
的url中。继续执行会出现下面的问题,需要在进行一处修改:
将tensorflow/third_party/icu/workspace.bzl
中的Checksum
改成报错内容中出现的序列,即86b85…这一行序列③ 注意
在完成上述步骤后,记得要copy一个
workspace.bzl
文件,因为在编译tensorflow是会更新这个文件,注意当编译时更新文件之后,迅速将更新的文件改成重新写好的workspace.bzl
,这里源码编译会让你确认cuda版本,在确认版本之前更改这个文件即可。
- 源码编译结束后安装wheel文件即可。脚本中已写好,无需自己安装。这里给大家提供一下我编译安装好的wheel文件。
tensorflow-1.12.2-cp35-cp35m-linux_arrach64.whl
4. 常见问题
-
在成功安装tensoflow-1.12.2后,在测试程序的时候出现如下问题
Error : Failed to get convolution algorithm. This is probably because cuDNN failed to initialize, so try looking to see if a warning log message was printed above.
查阅了一些解决办法,最后发现是因为我的cuDnn版本不匹配导致的,之前我将Manifold-2G的cuDNN版本更新了一次,更改成了7.6.5版本,但是这个版本与编译的tensoflow不匹配,所以导致该错误发生。建议读者严格按照文章开始提到的环境安装。
问题解决来源 https://github.com/tensorflow/tensorflow/issues/24828
才疏学浅,如有问题请多指教!