Jetson Xavier NX虚拟环境中安装tensorflow
工程需要,入手了Jetson Xavier NX Development Kit,在其上安装tensorflow-gpu经历百般挫折,最终整理成这篇blog。其主要原因是很多python包对ARM64架构支持并不是很完善,导致原本在X86 Windows上只需要一句就可以安装的包,现在需要从源码编译安装。
一 硬件组成
到手的Development Kit主要包括:主板(包括核心板)、19V电源线、2.4G无线键鼠套件、15寸显示屏(显示屏支架)、显示屏电源线、DP接口数据线、HDMI接口数据线、micro usb数据线、128G SSD
二 镜像烧录
烧录镜像主要有两种方式,第一种是通过SD卡烧录,需要至少32G的SD卡和读卡器,第二种是通过NVIDIA SDK Manager软件烧录,需要micro usb即可。
1. SD卡烧录
博主使用第二种方式,这一小节参考官方教程:
首先从Nvidia官网下载官方提供的镜像,镜像地址,从该地址中下载的镜像文件名为jetson-nx-jp441-sd-card-image.zip
,默认是最新版本,如果需要下载其他版本,例如Jetpack4.4版本,可以在官网搜索下载。
使用SDFormatter格式化SD卡,下载地址:https://www.sdcardformatter.com/。
使用官方推荐的balenaEtcher将镜像烧录至SD卡中,下载地址:https://etcher.balena.io/。或者使用Win32DiskImager烧录。
以Etcher为例,打开安装好的软件,从本地选择下载好的镜像文件(无需解压缩),选择烧录设备,开始烧录。
烧录完成后,将SD卡插入设备底部的插槽中,打开计算机显示器并连接,连接键鼠,提供电源(最后连接电源),开机后即可使用。
2. SDK Manager烧录
注:烧录之前,如果设备上插着SSD(一般是M.2接口),一定确保SSD被格式化过,否则烧录后无法启动Linux内核。已经导致系统无法启动的情况下,需要使用硬盘盒格式化SSD,然后再插上SSD,重新烧录镜像。
1)虚拟机Ubuntu系统安装
因为SDK Manager仅支持Linux系统,因此需要安装Ubuntu系统,虚拟机或物理机均可以。
博主在虚拟机上安装Ubuntu18.04,这部分教程网上很多,不详细介绍。重点是分配给虚拟机的硬盘空间至少30G(推荐40),因为使用SDK Manager安装时软件会自动下载Jetpack到虚拟机上,需要确保足够空间,否则在安装过程中会不断提示磁盘空间不足。
2)安装SDK Manager
在Ubuntu中下载SDK Manager,官方地址:https://developer.nvidia.com/zh-cn/embedded/jetpack
下载前注册Nvidia开发者账号,注意注册账号使用的邮箱最好不是edu邮箱,否则没有安装系统的权限(亲测),可以选择QQ邮箱。最好下载最新版本,如果你以前注册过账号,使用较低版本的SDK Manager时,会报无法获得系统的错误。
3)安装系统镜像
以上软件准备好之后,使用杜邦线或者跳线帽连接GND和FC REC接口,使设备进入recovery模式。使用micro usb连接设备和计算机,如果使用虚拟机,会弹出选择连接的设备,选择连接至虚拟机。最后接上电源。
打开SDK Manager,使用注册的开发者账号登陆软件,进入STEP 01。
STEP 01中选择Jetson、目标设备和想要安装的Jetpack版本,不勾选Host Machine和Additional sdks,有的时候选择目标设备时有两个选项,选择核心板(另一个是开发套件),进入STEP 02。
STEP 02中仅勾选Jetson OS,下面的Jetson SDK Components不用勾选,因为自带的16G存储无法安装全部组件,勾选同意license,不勾选Download now. Install later
,进入STEP 03,在进入之前会提示创建目录、输入密码等,这些按照提示正常进行即可。在进入之后,需要选择手动or自动安装,选择手动manually,OEM configuration选择runtime。
STEP 03即安装过程,等待即可。安装完成后Finish即可。
4)开机验证
安装完成后,断开全部连接,连接键鼠、显示器,上电,进入正常的Linux安装向导。
注:有时刚烧录镜像的设备第一次启动无法成功启动,断电重启即可。
3. 名词介绍
1)Tegra
Tegra是Nvidia推出的基于ARM架构的通用处理器品牌,能够为便携设备提供高性能、低功耗体验。本质是通用处理器、嵌入式计算机or单板机,主要是ARM架构CPU和Nvidia自研架构(GeForce、Pascal、Maxwell等)的GPU组合。
2)L4T
L4T是Linux for Tegra的缩写,因为Jetson系列用的是Tegra架构,因此L4T可以理解为Jetson定制的Linux操作系统,具体的来说就是Ubuntu定制款。
通常来说编译内核的工作是为了客户基于Jetson产品自己定制一些功能,比如增加一些硬件设备的驱动。
简单来说我们使用的Linux操作系统是通过源码编译出来的,源码和可执行文件之间的关系不用多提,当然操作系统远比普通的可执行文件程序复杂,但可以用这个思路理解,所以如果想要给系统增加底层的功能,就需要更改kernel源码,然后重新编译,然后把一些生成的文件刷进当前的系统中,就实现了操作系统的更新。编译内核是更改系统的最基础的操作。
NVIDIA给我们提供了每个版本的源码文件,首先下载这些源码,然后选择一个平台进行编译。
具体来说有两种思路:1.直接在jetson上编译(也叫目标平台编译,因为我们编译出来的文件是要刷到这个机器上的,所以叫目标平台)优点是不跨平台,编译命令简单,缺点是慢,真的慢。2.交叉编译(就是在一台x86 PC上编译,因为我们是在一个硬件上编译出来给另一个硬件用,相当于跨平台了)优点是速度快,不会把目标平台搞乱,缺点是需要进行交叉编译配置。
3)Jetpack
Jetpack SDK是Nvidia用于构建AI应用程序的最全面的开发环境包,支持所有Jetson模块和开发套件。Jetpack是和Jetson同级别概念的软件包。
JetPack SDK包括最新的Linux驱动程序包(L4T),具有Linux操作系统以及CUDA-X加速库和API,用于深度学习,计算机视觉,加速计算和多媒体。它还包括用于主机和开发人员工具包的示例,文档和开发人员工具,并支持更高级别的SDK,例如用于流视频分析的DeepStream和用于机器人技术的Isaac。
也就是Jetpack打包了很多AI开发必须要的基础软件,我们所谓的刷机就是把安装好Jetpack。但是需要注意的是,每个版本的Jetpack,里面包含了对应版本的软件。
注:所以说,官网提供的针对Jetpack版本安装tensorflow或者pytorch,这其实不是必要的,因为如果从SDK Manager仅安装Jetson OS,里面的cuda、cudnn可以后续自主选择版本,唯一问题是这些软件包不一定有对应的支持arm架构的版本,且安装比较麻烦,通常需要从源码编码安装。
三 系统基本配置
进入Ubuntu系统后,为了提升体验感,可以进行一些基本配置。
1. 扩容至M.2 Nvme SSD并设置第一启动项
Jetson NX的一个重要特点是其M.2关键M连接器,经过测试,来自SSD的读取速度是SD卡的7倍,因此肯定会提高Jetson NX的性能。
1)格式化SSD
安装好SSD并启动设备,然后打开菜单并搜索disk
,启动磁盘应用程序

选中SSD,ctrl+F
格式化磁盘,格式化过程中,选项默认。格式化后,新建分区,分离出16G的Free Space Following用于交换文件,为分区取名后create,即可完成新卷的创建。
2)设置SSD为第一启动项
终端中依次输入
1 | git clone https://github.com/jetsonhacks/rootOnNVMe.git |
重新启动即可生效,在计算机
中右键查看属性即可查看容量。
2. 设置系统中文并安装中文输入法
首先明确,得先安装语言包,才能设置系统语言和输入法。
打开设置界面中的语言后,会提示是否安装语言包,同意安装即可。
因为源的问题安装较慢。安装完成后,手动更换系统语言,添加中文输入法(pinyin intelligence input),以后可以通过右上角或快捷键ctrl+space
切换。
linux的输入法框架主要有fcitx(谷歌拼音、搜狗拼音、搜狗五笔等)、ibus(拼音、五笔)和xim(现在用的比较少)。三种框架中,输入法软件提供商,支持比较多的是fcitx。Jetson Xavier NX默认使用ibus。
可以终端通过apt-get
安装框架和具体输入法,如sudo apt install ibus-pinyin
3. 换源
博主不太喜欢换源,因为镜像源提供的软件不一定是最新的,如果下载速度很慢,可以通过-i
指定下载源,一般情况下也可以通过科学上网加快下载速度。
需要换源的软件一般有:apt、pip、conda
。
注:apt和apt-get是debian和ubuntu Linux上常用的软件包管理工具,它们的主要区别是apt具有更智能化的软件包依赖性解决算法,可以更好的处理软件包依赖性问题。
4. 科学上网
关于linux如何科学上网,参考Linux科学上网
5. 安装Miniforge
anaconda不支持arm架构,因此可以安装Miniconda,需要下载对应版本whl
文件通过pip
安装。但博主更推荐Miniforge。
Miniforge 使用conda-forge
作为默认 channel,而 Miniconda 使用anaconda.org
作为默认channel。channel的含义在这里介绍一下:
conda channels (源) 是 packages 存储的位置,也即是你是从哪个来源下载这个包,对应到conda内部处理则是下载文件的链接。因为不同源会有相同名字的包,因此必须指定来源,同时安装conda的时候也会有一个默认的channel。目前主流的就是 conda-forge,齐全且更新快。如果有多个channel,他们会按顺序确定优先级,优先的源上找不到,就会到下一个优先级的源上去找。还可以设置channel的优先级是否strict,如果是strict的话,则只会在这一个源上查找。
Miniforge 比 Anaconda\Miniconda 更早支持了Apple M1芯片。2022年5月6日Anaconda官方宣布原生支持了Apple M1版本。在苹果官方的Tensorflow加速训练教程中也是推荐的Miniforge。
简言之,我个人更倾向于 Miniforge,社区万岁。
Miniforge的安装可以去github下载release版本的sh文件,在Ubuntu终端执行脚本即可。
6. 安装jtop
jtop软件可以理解成windows中的设备/任务管理器,可以实时查看CPU、GPU、内存等硬件设备的使用情况,同时方便开启风扇以及更改风扇的转数。
1 | sudo apt-get install python3-pip # 安装pip3 |
使用jtop
启动jtop,q退出。界面中可以查看很多信息和操作提示。
四 安装cuda和cudnn
在Ubuntu终端输入nvcc -V
查看cuda版本,“未找到指令”表示未安装cuda。cuda和cudnn的安装有两种方式,一种是在Jetson Xavier NX上手动安装,另一种是通过SDK Manager安装。
1. SDK Manager安装
这种方式安装cuda和cudnn和刷镜像差不多,但切记在STEP 02中不要勾选Jetson OS,这是系统镜像。
2. Ubuntu上手动安装
这是博主采用的方式。博主安装的是cuda10.2和cudnn8.2。
1)安装cuda10.2
下载cuda10.2:
1 | sudo apt-get update |
下载cuda后,配置环境:
1 | sudo gedit ~/.bashrc |
将以下内容复制到最后一行:
1 | export PATH=/usr/local/cuda-10.2/bin${PATH:+:${PATH}} |
保存退出后:
1 | source ~/.bashrc |
2)安装cudnn8.2
理论上对应cuda10.2版本是cudnn8.0,但是博主选择的安装方法是从SDK Manager下载软件包(博主没找到其他方式,因为cudnn官网提供的是基于amd架构文件,所以只有在运行Jetpack安装包后才会有arm架构的版本),而SDK Manager选择固定版本的Jetpack所提供的cudnn版本也是固定的。
这种方式是通过SDK Manager刷镜像时可以选择Jetson SDK Components,而主机会先把软件包下载到本地,然后再通过micro usb传给Jetson。因此在SDK Manager下载完Jetson SDK Components时,停止继续安装。在/home/用户/nvidia
和/home/用户/下载/nvidia
目录下就是下载的全部components。
找到下面三个文件:
1 | libcudnn8_8.2.0.180-1+cuda10.2_arm64.deb |
将这三个文件拷贝到Jetson设备上,运行:
1 | sudo dpkg -i libcudnn8_8.2.0.180-1+cuda10.2_arm64.deb |
安装完成后,其实是直接安装到了默认安装路径usr/include和usr/lib下的,因此需要将其拷贝到cuda安装路径下:
1 | sudo cp /usr/include/cudnn.h /usr/local/cuda/include/ |
至此cuda10.2和cudnn8.2安装就完成了。通过nvcc -V
可以查看安装的cuda版本。
五 虚拟环境中安装tensorflow-gpu
1. 查看开发板属性
首先通过指令查看开发板属性,熟悉开发板。
1 | head -n 1 /etc/nv_tegra_release |
这个指令查看 /etc/nv_tegra_release 的第一行,当前板卡属性为R32,REVISION:4.4, GCID: 23942405, BOARD: t186ref, EABI: aarch64
这是L4T的版本,即32.4.4,然后在官网查找对应的Jetpack版本。或者直接sudo apt-cache show nvidia-jetpack
查看Jetpack版本。
查看系统的属性可以通过jtop或者使用指令查看。
2. 创建虚拟环境
这步不在本博客的介绍内容中,可以参考其他博客。
3. 参考官网安装tensorflow
官网提供了不同的Jetpack版本、python版本安装tensorflow的版本和具体指令,以Jetpack4.6.3为例。
官网Python 3.6+JetPack4.6.3
1 | sudo apt-get update |
按照该指令可以安装所需全部依赖和tensorflow,但是官网教程是几年前的,有些软件包更新导致不再兼容,导致安装失败。
博主更新过程:
首先进入虚拟环境。
1 | 注:使用sudo指令安装的包均位于系统默认软件安装位置 /usr/local/中 |
重点,博主没有和官网一样,直接通过pip安装keras_applications和cython,因为keras_applications基于h5py包,而h5py包基于HDF5和cython,HDF5上面已经安装过,现在就是cython和h5py包的问题。通过conda先安装cython==0.29.x(这里不用指定版本,默认安装的就是满足需要的版本)!!!再通过conda安装h5py==3.1.0(必须指定版本)
为什么这样做?因为conda安装方式和pip很重大的区别在于conda是从二进制安装,即已经编译好的文件,而pip会从whl(二进制)或源码方式安装,而采用官方推荐pip安装h5py时,会从源码安装,调用安装好的cython,博主没找到和Jetpack对应的cython、h5py版本,所以只能通过conda安装。如果使用pip安装,在安装h5py时,会报大量错误,关键错误是无法解析cython文件。
最后从Nvidia官网(https://developer.download.nvidia.com/compute/redist/jp/v461)手动下载对应版本tensorflow的whl文件,在虚拟环境中通过`pip install`指令安装。
一段时间后即可安装成功tensorflow。在虚拟环境中进入python,测试是否安装成功。
1 | import tensorflow as tf |
如果返回不是[]
表示tensorflow-gpu安装成功!