在树莓派上安装Pytorch (Installing Pytorch on Raspberry Pi) ---- 一个比较详细的版本

Torch有太多好处啦,很Pythonic,简单易学,内置了caffe2等等。因为要在树莓派上跑一点简单的深度学习的小程序,所以最近研究了以下在Pi上安装Pytorch的方案。下面会为大家详细介绍如何安装,以及我遇到的所有障碍和解决办法(方法一到现在还没解决呢~)。

背景

首先说一下我的软硬配置:

  1. 目前最新的树莓派系统,NOOBS安装的v3.2.1
  2. 系统自带的Python3.7 pip3自带18.1的版本,我没有对它进行更新
  3. 目标Pytorch版本为1.2,网上有人说0.4以前的版本可以通过pip3直接获得,但是0.4和目前最新的1.2还是差别很大,而且新版好用一些,我也没有做尝试,所以在这不讨论那个版本的情况了。
  4. 3B+的板,1核1G的配置,没舍得买最新的4B+,一会儿会吐槽这个配置。
  5. 32G的TF卡,这个会影响到方法二的编译环节,建议使用32G或以上的闪存卡。

上面提到过pip3的安装办法,那么为什么不用这个办法去安装1.2的torch呢?答案很简单,官网没有提供Debian的安装命令,直接拿来Linux的命令来安装会发现找不到1.2版本的报错(虽然我用pip3 search找到了最新的1.2版本)。好吧,要另辟蹊径了!

方法一

其实Google Installing Pytorch on Raspberry Pi之后,出来的方案并不算太多,utube上貌似也只有一个教程真的是在讲安装的tutor(其他貌似是在说树莓派上可以跑深度学习的程序以及可以实现什么样的人工智能应用)。这位操着“斯拉夫“口音的小哥哥在这里(是个油管的连接,国内科学上网才看到)用英语解释它的安装过程。

如果看不到也没关系,我简单描述一下他视频的内容,就在本文记作方法一吧:
首先他介绍了以下背景balabalabala,然后说他的这个办法适用于任何一个版本的树莓派(注意是从0到最新的4B+哦!反正在我的3B+上是没有成功的)。接下来sudo apt-get update,没错,要安装依赖库了。据他说要这样:

sudo apt-get install libopenblas-dev libblas-dev m4 cmake cython python3-dev python3-yaml python3-setuptools python3-wheel python3-pillow python3-numpy

接下来通过pytorch-arm-builds来安装pytorch。小哥哥在他的github上传了各个版本的whl文件,当你把git clone下来他的资源以后,在树莓派输入uname -m查看你的Pi machine hardware name,我的是armv7l,那么就安装对应的版本

pip3 install torch-1.2.0a0+8554416-cp37-cp37m-linux_armv7l.whl

接下来是安装过程,其实这个过程蛮快的,大概一两分钟就好了,接下来你就可以测试了,进入python3的交互环境输入:

import torch

当我兴高采烈地以为要成功的时候,他报错了:No module named 'torch._C',谷歌了一下看到绝大多数是在说路径的问题–你的路径下有一个讲torch的文件夹,切换路径就可以解决该问题。然而我试了各种不同路径,也不奏效。在本站上面搜索,看到各种说法,如cuda配置的,anaconda配置的等。最终在这里找到了solution,哥们写的很详细,按照他说的修改对应路径(每个人安装的torch文件路径可能有些不同)配置文件的名字,将它缩短,然后重新python3并import torch就不再报这个错啦!

不再报这个错的意思并不是成功导入torch了,而是报了新的错:
/usr/lib/aarch64-linux-gnu/libstdc++.so.6: version GLIBCXX_3.4.26' not found ,其实这个报错在很多地方都蛮常见的,首先sudo apt-get install libstdc++6,Pi回馈当前包已经是最新的了。无奈继续谷歌,解决办法不外乎类似这里说的,通过这个语句:

$ strings /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 | grep GLIBCXX

列出所有的c++.so.6的版本,可是我的Pi只显示出25版本,压根就没有26,所以按照网上说的其他解决办法也解决不了这个问题了。

到目前我还没有找到解决的方案,网上也有人说是系统级别的错误,如果你熟悉这方面或者知道该怎样解决这个问题欢迎在下面留言、分享。

好了,方法一行不通就另寻出路吧!

方法二

方法二就是大家都能想到的直接编译源代码,pytorch是用C++写的,直接在树莓派上编译就好了。这个方法的步骤在本站、知乎还有外文网站上都有详细描述,我参考了几篇,其实都是大同小异,步骤如下:

  1. 准备工作:增加交换区的大小到2G
    众所周知,3B+的板只有1G的RAM,亲测在编译torch的时候,内存会爆掉(而且不止一次,无奈只有断电强制reboot),所以必须通过增加交换区大小来帮助树莓派在内容不够用的时候使用闪存空间完成编译。这一步网上的教程都是修改/etc下的配置文件:
sudo nano /etc/dphs-swapfile

打开以后,你会看到如下的文件:

                                                                                                                       
# /etc/dphys-swapfile - user settings for dphys-swapfile package                                                       
# author Neil Franklin, last modification 2010.05.05                                                                   
# copyright ETH Zuerich Physics Departement                                                                            
#   use under either modified/non-advertising BSD or GPL license                                                       
                                                                                                                       
# this file is sourced with . so full normal sh syntax applies                                                         
                                                                                                                       
# the default settings are added as commented out CONF_*=* lines                                                       
                                                                                                                       
                                                                                                                       
# where we want the swapfile to be, this is the default                                                                
#CONF_SWAPFILE=/var/swap                                                                                               
                                                                                                                       
# set size to absolute value, leaving empty (default) then uses computed value                                         
#   you most likely don't want this, unless you have an special disk situation                                         
CONF_SWAPSIZE=100                                                                                                                                                                                                                                                                                                                                                                                           

下面还有一部分代码,为了节省篇幅,我就不在此展示了。这里树莓派是默认的100Mb的交换空间,我们把它修改成4096,也就是4Gb。最尾有一个最大限制的参数–CONF_MAXSWAP,把它前面的井号标注去掉,并把这个参数也改成4096。其实我一开始设置的是2Gb,因为我是这样以为的:

网上有人说建议提高到4096也就是4Gb,其实个人测试过程感觉没有必要,我没有一直盯着编译过程的内存使用情况,不过我偶尔瞄了几眼,记得使用最大的时候,无非也就是在树莓派自身的内存几乎被占用的时候,交换空间给出了1800多Mb的空间,所以2Gb的swap是完全足够的。
但是当后来跑到97%的时候,内存又爆掉了,机器卡死。我已经不记得这是我第几次通过关掉电源reboot了。所以乖乖地设置4G的swap,并把这篇文章做了修改。然后通过命令行生效刚才的改变:

sudo service dphys-swapfile restart

这里不同的教程给出的命令行语句是不同的,不管你用哪一个,你可以在真正编译开始之前top一下看看交换空间变了没有在树莓派上安装Pytorch (Installing Pytorch on Raspberry Pi) ---- 一个比较详细的版本_第1张图片
为了确保万无一失,建议重启一下,我这里是可能由于没有reboot吧,所以swap空间仍然是100M,编译的时候爆掉内存,重新开机才看到swap空间增加到2G(记得改4G哦,这里的2G是最后一次爆内存前的版本):在树莓派上安装Pytorch (Installing Pytorch on Raspberry Pi) ---- 一个比较详细的版本_第2张图片
关于top的使用,推荐这一个教程大家可以看一下。这里看到我的Pi只能给出874.5M的内存,重要的事情再说一遍:在编译前一定确认好有足够的swap空间,为了稳妥起见用4G、4G、4G。这就是为什么开头那里我建议用32G或以上的tf卡的原因。

  1. 安装依赖的包:
sudo apt-get install libopenblas-dev cython3 libatlas-dev m4 libblas-dev cmake

其中安装libblas-dev的时候,会报错,你按照它的提示安装libatlas-base-dev这个包就好了。网上有个人也问过这个问题,我是这么回答他的。

跟着下来,配置环境变量,树莓派不支持GPU:

export NO_CUDA=1
export NO_DISTRIBUTED=1
export NO_MKLDNN=1
export NO_NNPACK=1
export NO_QNNPACK=1
  1. 所以准备工作做好之后,你可以选择创建虚拟环境,用来隔离pytorch和其他python的包。这一步是可选的,所以我并没有这么做。
    具体并不麻烦,命令行:
python3 -m venv pytorch
source pytorch/bin/activate
  1. 下载pytorch的源码:
    切换到你喜欢的路径下,比如新建一个~/pytorch_install的路径。通过git命令下载:
git clone --recursive https://github.com/pytorch/pytorch
  1. 然后编译pytorch
    这一步是最耗费时间的了!!!!!!!也是我非常想吐槽的一个地方。首先cd pytorch进入git下来的安装路径。然后通过命令
python3 setup.py build

编译。先说一下编译时间吧!网上的教程说大概2-4个小时,我呵呵了,我从昨天不到10点开始编译,编译到50%多的时候报了一次内存,然后继续编译,中间也就耽误了十几分钟的时间吧,然后一直到我晚上六点下班才编译到70%多。于是我就这么开着,当我今天早上一进办公室准备开心开心的时候,发现树莓派又卡死了,屏幕上的时间显示在早上6点多,进程来到94%,好吧,我的Pi奋战了一夜还是gg了。我尝试了一下ssh和vnc(虽然我没指望它有什么反应),最后还是断电重启了。直到现在他还是在编译,reboot之后从80%多开始继续编译,但愿不要再出错了,上帝保佑!

另外在编译过程中会见到一个报错:

subprocess.CalledProcessError: Command '['cmake', '--build', '.', '--target', 'install', '--config', 'Release', '--', '-j', '4']' returned non-zero exit status 2.

这个报错也是害得我花了好久才解决啊,在这里可以找打答案,原因是编译caffe2的时候有问题,按照网页底部说的

git submodule update --remote third_party/protobuf

就可以继续正常编译了。

好了,我就在这里继续昨天没完成的记录了。经过两天断断续续地编译,终于见到了这样的编译结果:在树莓派上安装Pytorch (Installing Pytorch on Raspberry Pi) ---- 一个比较详细的版本_第3张图片
我仿佛感受到了我的树莓派cpu发着高烧使出吃奶的劲儿终于来到这一步!anyway,这里说no longer necessary to use ‘build’ or 'rebuild’意思就是成功啦,然后是最后一步,网上教程都是这样的命令:

python3 setup.py install

这时候,又报了一个小错,说我没有权限把torch写入site-packages文件夹内,这时候我建议你直接开启根用户,通过sudo su,如果你没有特地设置,这一步树莓派是不要求密码的。重复上面的命令,这时又报了一个如下的错误:

Building wheel torch-1.4.0a0+d403410
-- Building version 1.4.0a0+d403410
Traceback (most recent call last):
  File "setup.py", line 365, in check_pydep
    importlib.import_module(importname)
  File "/usr/lib/python3.7/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "", line 1006, in _gcd_import
  File "", line 983, in _find_and_load
  File "", line 965, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'yaml'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "setup.py", line 759, in <module>
    build_deps()
  File "setup.py", line 303, in build_deps
    check_pydep('yaml', 'pyyaml')
  File "setup.py", line 367, in check_pydep
    raise RuntimeError(missing_pydep.format(importname=importname, module=module))
RuntimeError: Missing build dependency: Unable to `import yaml`.
Please install it via `conda install pyyaml` or `pip install pyyaml`

因为我不用conda,直接通过pip3安装了,安装完pyyaml这个包就没再报错了。

**

测试

**
这个环节就很简单了,python3进入交互式环境:

>>> import torch                                                                                                             
>>> torch.__version__                                                                                                        
'1.4.0a0+d403410'
>>> z = torch.zeros(2,2)                                                                                                     
>>> z
tensor([[0., 0.],
        [0., 0.]])

可以看到我们的torch版本正是刚刚git下来编译好的1.4的版本,赋值一个张量也完全不会报错。好了,可以算是成功在树莓派上安装pytorch了。为了上面这几行代码的运行,小白我可是费了好几天的时间啊!

关于torchvision

pi@raspberrypi:~$ pip3 search torchvision                                                                                    
torchvision-raspi (0.2.1.1)                      - Torchvision for Raspberry Pi 3B armv7l
torchvision-enhance (0.1.3)                      - Enhance torchvision for multi-channel images, 16-bit image,
                                                   segmentation...
torchvision (0.4.1.post2)                        - image and video datasets and models for torch deep learning
  INSTALLED: 0.2.2.post3
  LATEST:    0.4.1.post2
opencv-torchvision-transforms-yuzhiyang (0.0.1)  - an opencv based rewriting of the "transforms" in torchvision package
quadratum (0.1.5)                                - Additional torchvision image transforms for practical usage.
invertransforms (0.2.1)                          - A library which turns torchvision transformations invertible and
                                                   replayable.

对于torchvision,树莓派的版本也暂时只提供旧的0.2版本,这里就先不讨论0.4版本的安装了。

总结

上面详细介绍了小白在树莓派上安装pytorch的过程,一个没行通的方案和一个费时编译的方案。同时介绍了几个可能会遇到的困难和解决办法。
对于小白来说,做项目真的就是不断发现问题并不断摸索解决问题的过程。正当要为成功感到高兴的时候,它给你报错来了。哈哈~做项目不要高兴的太早。遇到问题要慢慢一个一个地解决。

关于本文,欢迎大家批评、建议、抬杠、纠正,如果喜欢你也可以点赞。谢谢大家!

你可能感兴趣的:(在树莓派上安装Pytorch (Installing Pytorch on Raspberry Pi) ---- 一个比较详细的版本)