在Jetson Nano (TX1/TX2)上使用Anaconda与PyTorch 1.1.0
(注意:以下内容只在Jetson Nano上尝试过,但理论上来说采用了相同架构, i.e. ARM A57,的TX1/TX2应该都可以,但AGX Xaiver不是很确定)
今天入手了一块Jetson Nano。心里幻想着能结合IoT做一些AI-based应用。
结果到手之后傻眼了——Jetson系列是基于aarch64 (Arm64)架构的。
这就意味着,很多工具包,如果没有专门为aarch64编译过,那么就需要自己手动编译甚至是彻底无法使用了。
比如大名鼎鼎的Anaconda。
Anaconda是一个包管理工具,这个工具的强大之处在于,甚至不止跨越了Python,还能在某种程度上完全隔离出一个底层环境。甚至是让很多原本会冲突的包共存。我们只需要用conda create -p /prefix/path 来指定在某个位置创建一个隔离环境,然后通过source activate /prefix/path 来激活这个环境,并且在这个环境下面可以随便折腾。比如装一个与操作系统默认版本不一致的python。玩儿坏了大不了就删掉重新建。
(强烈强烈强烈强烈不建议直接在系统自带的python环境下进行任何折腾!!一定要搞一个隔离环境折腾!!不然以后会有很多坑在等着你!!)
在日常Research和Development过程中,使用Anaconda的最佳实践就是:为一个框架,甚至专为一个项目创建一个隔离环境。
以上是使用“正常”的服务器时的经验。但是当拿到Jetson Nano之后,我感受到的第一个打击就是:Anaconda官方不支持aarch64架构。也就是说,你从官网用正规方法是无法成功把Anaconda安装在你的Jetson Nano上的。而没有了anaconda,想要安装PyTorch等框架就更加困难了!
不过怎么能这么容易就放弃!
经过一整晚Google、GitHub、Anaconda官网、PyTorch Community的摸爬滚打,最终我还是找到了解决方案。
方案:Archiconda
其实我很好奇,为啥不少package都有aarch64的架构,但Anaconda没有。于是我在conda的issue上翻,发现其实有一个叫做“Archiconda”的项目。其目的就是将conda移植到aarch64平台上。尤其是它包括了conda这个命令工具!
而且这个项目貌似还是挺活跃的,偶有更新,应该还没死。可以直接在这里下载安装包:
Archiconda/build-tools
下载之后就和普通的anaconda一模一样。直接执行安装,会装一个基本的环境。但真正用的时候还是会conda create -p /prefix/path这样创建环境,然后source activate /prefix/path激活并使用,也就是通常所说的最佳实践。
其实看一下这个项目的介绍就会发现,当用conda install时,所安装的package只会考虑conda-forge, c4aarch64等几个特定的channel。如果这些channel都没有的话,用conda install仍然是装不上的。(但还可以用pip从源码编译安装呀)。
PyTorch 1.1.0 on Jetson !
最让人头疼的Anaconda安装问题解决了!而直接影响生产力的问题就是:如何在Jetson上安装PyTorch。
http://PyTorch.org官方推荐使用anaconda安装。然而整个Anaconda Repository上压根就没有aarch64架构的PyTorch预编译包。
但Google之后就发现,nvidia官方还是很良心的,放出了一个官方编译过的二进制包,直接pip install xxx.whl
即可安装。具体的方法看官方的这个链接:
至此,我们所需要的准备工作就完成了。后面我会更新更多关于如何折腾Jetson的文章(比如如何把系统装在外置SSD中而不用忍受SD卡的速度?比如如何扩展更多的swap分区避免Jetson Nano 4G的内存爆掉等等),欢迎各位驻足交流。