https://zhuanlan.zhihu.com/p/64868319
(注意:以下内容只在Jetson Nano上尝试过,但理论上来说采用了相同架构, i.e. ARM A57,的TX1/TX2应该都可以,但AGX Xaiver不是很确定)
今天入手了一块Jetson Nano。心里幻想着能结合IoT做一些AI-based应用。
结果到手之后傻眼了——Jetson系列是基于aarch64 (Arm64)架构的。
这就意味着,很多工具包,如果没有专门为aarch64编译过,那么就需要自己手动编译甚至是彻底无法使用了。
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的摸爬滚打,最终我还是找到了解决方案。
尽管Anaconda官方并没有为aarch64架构提供可以直接安装的Installer,但是我们可以通过官方提供的工具来构建一个支持aarch64架构的安装包。这个官方构建工具叫做constructor:你只需要写一个配置文件,里面放上你需要打包的package的名字和平台,通过constructor,你就能创建一个“安装包”。这个安装包可以在安装时任意选择路径,最后通过修改环境变量(~/.bashrc)来负责控制哪个环境处于激活的状态。
说白了,此时的这个Installer,充其量算作是一个环境隔离的安装工具。而只要你需要的库本身提供了aarch64的版本,那么你都能用这种方式打包并且安装。
比较理想的是,常用的库在conda的repository中基本都提供了aarch64预编译版本,包括但不限于python3.6/3.7等。而就算没有提供aarch64的与编译版本,也可以通过pip自动并且smoothly地从源码编译,例如numpy等。
具体方法如下:
找一台普通的电脑(不能是Jetson本身)先安装上它支持的conda。
执行命令:conda install constructor
在这台电脑上用git把 conda constructor 给clone下来:git clone https://github.com/conda/constructor.git
cd examples/jetsonconda
(你没看错,conda专门为jetson搞了一个constructor的配置)。
可以看心情编辑一下construct.yaml这个文件,比如按照你的需求配置一个最base的package manifest。以后每次安装之后这些pack都会被自动装好。当然也可以什么都不动,用默认的配置文件就好。
进去之后执行constructor --platform=linux-aarch64 .
把生成的那个 JetsonConda-0.1-Linux-aarch64.sh拷贝到你的Jetson上进行安装就可以了!
但是吧,这个方法其实只是利用的conda的打包工具将最基础的库打包到了一起,并且可以反复安装而已。而conda的真谛——就是conda这条命令本身并没有被包含进去。归根结底,conda命令由于不支持aarch64所以是不可能直接通过anaconda的repository安装的。
然而随着继续深入挖anaconda的issue,我发现了下面这个anaconda在Jetson上正确的打开方式。(没错,上面的内容可以不用看了。。。。直接看下面这个就好)
其实我很好奇,为啥不少package都有aarch64的架构,但Anaconda没有。于是我在conda的issue上翻,发现其实有一个叫做“Archiconda”的项目。其目的就是将conda移植到aarch64平台上。尤其是它包括了conda这个命令工具!
而且这个项目貌似还是挺活跃的,偶有更新,应该还没死。可以直接在这里下载安装包:
Archiconda/build-tools
https://github.com/Archiconda/build-tools/releases
下载之后就和普通的anaconda一模一样。直接执行安装,会装一个基本的环境。但真正用的时候还是会conda create -p /prefix/path这样创建环境,然后source activate /prefix/path激活并使用,也就是通常所说的最佳实践。
其实看一下这个项目的介绍就会发现,当用conda install时,所安装的package只会考虑conda-forge, c4aarch64等几个特定的channel。如果这些channel都没有的话,用conda install仍然是装不上的。(但还可以用pip从源码编译安装呀)。
最让人头疼的Anaconda安装问题解决了!而直接影响生产力的问题就是:如何在Jetson上安装PyTorch。
http://PyTorch.org官方推荐使用anaconda安装。然而整个Anaconda Repository上压根就没有aarch64架构的PyTorch预编译包。
但Google之后就发现,nvidia官方还是很良心的,放出了一个官方编译过的二进制包,直接pip install xxx.whl
即可安装。具体的方法看官方的这个链接:
PyTorch for Jetson Nano
devtalk.nvidia.com
至此,我们所需要的准备工作就完成了。后面我会更新更多关于如何折腾Jetson的文章(比如如何把系统装在外置SSD中而不用忍受SD卡的速度?比如如何扩展更多的swap分区避免Jetson Nano 4G的内存爆掉等等),欢迎各位驻足交流。