英偉達jetson tx1開發套件配置tensorflow

英偉達jetson tx1開發套件配置tensorflow

本文爲原創作品,未經本人同意,禁止轉載,禁止用於商業用途!本人對博客擁有最終解釋權

歡迎關注我的博客:http://blog.csdn.net/hit2015springhttp://www.cnblogs.com/xujianqing/

 

Jetson tx1本身具有的內存和存儲容量是比較小的,而且它是基於ARM架構的cpu更是與intel的處理器架構不一樣,所以很多網上的分享不適用於TX1的配置。這裏從英偉達的jetson hacks上面的官方教程來配置tensorflow。

參考文章:Jetson hacks

http://www.jetsonhacks.com/2016/12/30/tensorflow-nvidia-jetson-tx1-development-kit/

http://www.jetsonhacks.com/2017/01/28/install-samsung-ssd-on-nvidia-jetson-tx1/

http://www.jetsonhacks.com/2016/12/21/jetson-tx1-swap-file-and-development-preparation/

這裏分成三步執行

配置外置SSD

這裏用的是三星 EVO 250G的SSD,支持SATA接口,ssd插上去開機是不能用的,TX1是沒有識別的,需要的格式化爲linux支持的文件系統ext4.一系列配置之後可以把ssd設置爲外置的存儲,然後再把文件系統拷貝到SSD中,設置爲從SSD啓動系統。和PC機從BIOS啓動不一樣的是,TX1可以用好幾種方式啓動它。只要配置exlinux.conf就OK了。仔細看視頻就可以配置好

  1. 斷電,插ssd,上電
  2. 通過gui界面來設置,搜索DISKS,如圖

     

  3. 格式化新建一個分區

     

 

 

新建:

name輸入名字jetsonssd-256

Ok完成。

這裏新建分區的時候是要輸入盤的大小,輸入250G,這個三星的ssd不能全部新建。

配置swapfile

這一步配置交換空間,TX1的內存只有4G,用來配置tensorflow是不夠用的,在配置tensorflow之前要給它加一個交換空間,這個空間的功能是當物理內存不夠時,將某些內存當中所佔的程序暫時移動到swap當中,讓物理內存可以被需要的程序來使用。另外,如果你的主機支持電源管理模式,也就是說,你的linux主機系統可以進入休眠狀態的話,娜美運行當中的程序狀態則會被記錄到swap當中去,以作爲喚醒主機狀態的依據。

命令行:


git clone https://github.com/jetsonhacks/postFlashTX1.git
cd postFlashTX1\
ls
$ sudo ./createSwapfile.sh -d [directory location] -s[size in gigabytes] –a


[directory location]:這裏填寫你的ssd路徑地址

[size in gigabytes]:這裏填寫你要設置的swap的大小,以G爲單位。

-a:是默認開機自啓動swap,在/etc/fstab中自己設置

我設置了20G,默認是8G,一般的swap設置爲內存的兩倍。

 

下面這段話是該文章裏頭提到的一點問題,這裏我們用不到,但是可以幫助以後找問題。

在SSD或其他閃存類型內存上設置交換文件可能會導致設備磨損。大多數當前閃存具有可以執行的讀取和寫入的生存期數量,繁忙的交換文件可以消耗大量的那些。請注意,硬盤驅動器也是如此。較新的SSD已經建立了幫助分發"寫磨損"的機制。一如往常,備份您的驅動器,並將其存儲。在視頻中,交換文件在計算機引導時自動安裝。這是偉大的開發,但之後,你可能要禁用該功能。爲此:

$ sudo gedit / etc / fstab

並註釋掉執行"swapon"的行。確保保存文件,重新啓動並檢查以確保交換已關閉。

此外,你可能想要有一個更硬的核心關於你的交換區。您可以留出"交換分區",並使用它而不是交換文件。這種方法可能更快,因爲交換區域連續放置。此路由類似於設置交換文件,但超出了本文的範圍。

運行完後開始在disks裏頭設置

按照圖中正確選擇

然後重啓系統。

設置從SSD啓動系統:

開發板自帶的emmc存儲只有16G,第一步安裝系統後只有4.4G,本次搭建tensorflow環境需要很多存儲,所以需要擴展存儲,但是不能就單單加個SSD就可以,這樣把文件放在SSD是不好用的,需要將系統運行在SSD上才行,按視頻教程後半部分將系統文件複製到SSD中,修改啓動配置文件,使之從SSD內啓動:


$ sudo cp -ax / '/media/ubuntu/jetsonssd'


修改配置文件

The last setup step is to modify the file extlinux.conf file on the eMMC. The system will boot from the internal eMMC, then the kernel will set the root directory to point to the SATA drive


$ cd /boot/extlinux
$ sudo cp extlinux.conf extlinux.conf.original
$ sudo gedit /boot/extlinux/extlinux.conf


這裏主要修改幾個地方

 

 

 

其實整個文件如下:

TIMEOUT 30
DEFAULT satassd

MENU TITLE p2371-2180 eMMC boot options

LABEL satassd
MENU LABEL primary SATA SSD
LINUX /boot/Image
INITRD /boot/initrd
FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb
APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0root=/dev/sda1 rw rootwait

LABEL emmc
MENU LABEL Internal eMMC
LINUX /boot/Image
INITRD /boot/initrd
FDT /boot/tegra210-jetson-tx1-p2597-2180-a01-devkit.dtb
APPEND fbcon=map:0 console=tty0 console=ttyS0,115200n8 androidboot.modem=none androidboot.serialno=P2180A00P00940c003fd androidboot.security=non-secure tegraid=21.1.2.0.0 ddr_die=2048M@2048M ddr_die=2048M@4096M section=256M memtype=0 vpr_resize usb_port_owner_info=0 lane_owner_info=0 emc_max_dvfs=0 touch_id=0@63 video=tegrafb no_console_suspend=1 debug_uartport=lsport,0 earlyprintk=uart8250-32bit,0x70006000 maxcpus=4 usbcore.old_scheme_first=1 lp0_vec=${lp0_vec} nvdumper_reserved=${nvdumper_reserved} core_edp_mv=1125 core_edp_ma=4000 gpt android.kerneltype=normal androidboot.touch_vendor_id=0 androidboot.touch_panel_id=63 androidboot.touch_feature=0 androidboot.bootreason=pmc:software_reset,pmic:0x0 net.ifnames=0 root=/dev/mmcblk0p1 rw rootwait

標紅的地方是修改的

重啓ok

如果要從emmc啓動,則改一下這裏的配置就OK了。Label那個位置該一下。

配置tensorflow

配置tensorflow真是一個巨坑,歸功於我們牛逼的牆,導致我翻牆失敗,下載安裝依賴項的時候數據包下載不完整,配置不成功,還找不到問題的關鍵。

然後就開始在github裏面看配置的源碼,一個一個找問題。這裏就給出他們的源碼,和解析!

其實這個配置就是一段命令行的配置:

上github把英偉達的配置demo下載下來:

git clone https://github.com/jetsonhacks/installTensorFlowTX1
cd installTensorFlowTX1


配置動態鏈接庫的路徑

./setLocalLib.sh

下載一些安裝依賴項,包括java protobuf等

./installPrerequisites.sh

下載tensorflow源碼


./cloneTensorFlow.sh
./setTensorFlowEV.sh

兩個選擇 n,y

./buildTensorFlow.sh
./packageTensorFlow.sh

這一步要超級權限

sudo pip install $HOME/tensorflow-0.11.0-py2-none-any.whl
cd $HOME/tensorflow
time python tensorflow/models/image/mnist/convolutional.py


這是github裏面的文檔說明:

最少要8g的內存,然後存儲大小最少要5.5g的大小,所以告訴你要給它配置一個硬盤。當然還要設置好庫路徑,這裏面通過setlocallib.sh這個文件來設置。

這裏需要編譯兩個版本的Protobuf,一個(v3.1.0)是用於grpc,一個v3.0.0-beta-2用於bazel,安在:$HOME/lib and $HOME/bin.

Grpc 0.15.0版本,補丁支持arm架構

grpc-java v0.15.0 requires > v3.0.0-beta-3 of protobuf. A patch is applied for aarch64.

Bazel

Builds version 0.3.2. Includes patches for compiling under aarch64.

這個版本里頭的補丁支持arm64架構

 

 

 

 

Before installing TensorFlow, a swap file should be created (minimum of 8GB recommended). The Jetson TX1 does not have enough physical memory to compile TensorFlow. Also, if TensorFlow is being compiled on the built-in 16GB flash drive, a standard JetPack installation may consume too much room on the drive to successfully build TensorFlow. Extraneous files will need to be removed. Eliminating the .deb files in the home directory appears to be enough to allow TensorFlow to build. Successful builds tend to have more than 5.5GB free. Also, for a successful build it is recommended to set local lib using the included script setLocalLib.sh, as grpc-java in particular seems to run into issues if it /usr/local/lib is not in the path.

Note: Most of this procedure was derived from the thread: https://github.com/tensorflow/tensorflow/issues/851

TensorFlow should be built in the following order:

installPrerequisites.sh

Installs Java and other dependencies needed. Also builds:

Protobuf

Two versions of protobuf are compiled. The first (v3.1.0) is needed to build grpc-java. This version ends up being installed in $HOME/lib and $HOME/bin. The second version (v3.0.0-beta-2) is used to build bazel

grpc-java

grpc-java v0.15.0 requires > v3.0.0-beta-3 of protobuf. A patch is applied for aarch64.

Bazel

Builds version 0.3.2. Includes patches for compiling under aarch64.

cloneTensorFlow.sh

Git clones r0.11 from the TensorFlow repository and patches the source code for aarch64

setTensorFlowEV.sh

Sets up the TensorFlow environment variables. This script will ask for the default python library path.

buildTensorFlow.sh

Builds TensorFlow.

packageTensorFlow.sh

Once TensorFlow has finished building, this script may be used to create a 'wheel' file, a package for installing with Python. The wheel file will be in the $HOME directory, tensorflow-0.11.0-py2-none-any.whl

Install wheel file

$ pip install $HOME/tensorflow-0.11.0-py2-none-any.whl

Test

Run a simple TensorFlow example for the initial sanity check:

$ cd $HOME/tensorflow

$ time python tensorflow/models/image/mnist/convolutional.py

Build Issues

For various reasons, the build may fail. The 'debug' folder contains a version of the buildTensorFlow.sh script which is more verbose in the way that it describes both what it is doing and errors it encounters. See the debug directory for more details.

Notes

As of this writing (Jan 15, 2017) the TensorFlow repository has an issue which does not allow incremental compilation to work correctly. This is due to an issue in the file:

tensorflow/third_party/gpus/cuda_configure.bzl

Where the rule:

cuda_configure = repository_rule( implementation = _cuda_autoconf_impl, local = True, )

forces Bazel to always rebuild the CUDA configuration, which in turn foobars the incremental build process. The cloneTensorFlow.sh script patches the file to remove the local = True statement. Additionally, buildTensorFlow.sh sets TensorFlow environment variables to reflect the CUDA structure of the Jetson TX1.

Since v0.11 was published, the location of the zlib library being used has moved. This is also taken into account by the cloneTensorFlow.sh script, which patches the library location.

 

遇到問題

Unzipping /home/ubuntu/.gradle/wrapper/dists/gradle-2.13-bin/4xsgxlfjcxvrea7akf941nvc7/gradle-2.13-bin.zip to /home/ubuntu/.gradle/wrapper/dists/gradle-2.13-bin/4xsgxlfjcxvrea7akf941nvc7

Exception in thread "main" java.util.zip.ZipException: error in opening zip file

at java.util.zip.ZipFile.open(Native Method)

at java.util.zip.ZipFile.<init>(ZipFile.java:219)

at java.util.zip.ZipFile.<init>(ZipFile.java:149)

at java.util.zip.ZipFile.<init>(ZipFile.java:163)

at org.gradle.wrapper.Install.unzip(Install.java:214)

at org.gradle.wrapper.Install.access$600(Install.java:27)

at org.gradle.wrapper.Install$1.call(Install.java:74)

at org.gradle.wrapper.Install$1.call(Install.java:48)

at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)

at org.gradle.wrapper.Install.createDist(Install.java:48)

at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)

at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)

 

 

解決方法:直接進入

/home/ubuntu/.gradle/wrapper/dists/gradle-2.13-bin/4xsgxlfjcxvrea7akf941nvc7

這個路徑,把那個壓縮包去掉,然後自己去官網下一個gradle-2.13-bin.zip包,(網絡真坑爹),當然是放在原來的路徑下嘍!

然後就OK!

另一個問題:

 

說git下載有問題,RPC failed curl 56 GnuTLS recv error (-9)

簡單粗暴,卸載git,再重新安裝




最後給一個很福利的東西    https://github.com/rwightman/tensorflow/commit/a1cde1d55f76a1d4eb806ba81d7c63fe72466e6d有好東西,一鍵安裝

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章