ubuntu16.04-arm版 下载和编译pytorch

博客1:

https://blog.csdn.net/weixin_46969696/article/details/106930043?utm_term=arm%E5%AE%89%E8%A3%85pytorch&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-0-106930043&spm=3001.4430

博客2

https://blog.csdn.net/weixin_39965127/article/details/102686314?utm_term=arm%E5%AE%89%E8%A3%85pytorch&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-1-102686314&spm=3001.4430

 

要在华为的atlas 200dk上配置一下深度学习的推理环境。

网上编译好的包不能直接用,要重新开始编译。
下载pytorch
对系统进行更新
1.sudo apt update && sudo apt upgrade
创建python的虚拟环境,因为这个架构还不支持conda,所以要用venv创建虚拟环境。
2.python3 -m venv pytorch
如果是指定版本的,将python3改为python3.6,python3.7即可。但是要先执行如下代码。
3.sudo apt-get install python3.6-venv
接下来使用git下载源代码。
4.git clone --recursive https://github.com/pytorch/pytorch
5.cd pytorch
切换到自己想要的版本,比如V1.0.1
6.git checkout tags/v1.0.1 -b build
7.git submodule update --init --recursive
在编译pytorch之前,我们还是需要安装依赖的python包。安装依赖包:
8.pip install -r requirements.txt
9.设置环境变量

export NO_CUDA=1
export NO_DISTRIBUTED=1
export NO_MKLDNN=1
export NO_NNPACK=1
export NO_QNNPACK=1

也可以使用sudo USE_CUDA=0 USE_MKLDNN=0 USE_QNNPACK=0 USE_NNPACK=0 USE_DISTRIBUTED=0 python3 setup.py build
如果不进行环境变量设置 进行

10.对pytorch进行编译,这个要很久很久。

python setup.py build
  • 1

在这里插入图片描述
11.编译完成后,利用命令进行安装。

python setup.py install


第二个版本:

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

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

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

                                                                                                                       
# /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                                                                                                                                                                                                                                                                                                                                                                                           
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

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

sudo service dphys-swapfile restart
  • 1

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

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

其中安装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
  • 2
  • 3
  • 4
    也可以使用sudo USE_CUDA=0 USE_MKLDNN=0 USE_QNNPACK=0 USE_NNPACK=0 USE_DISTRIBUTED=0 python3 setup.py build 
    如果不进行环境变量设置 进行
  1. 所以准备工作做好之后,你可以选择创建虚拟环境,用来隔离pytorch和其他python的包。这一步是可选的,所以我并没有这么做。
    具体并不麻烦,命令行:
python3 -m venv pytorch
source pytorch/bin/activate
  • 1
  • 2
  1. 下载pytorch的源码:
    切换到你喜欢的路径下,比如新建一个~/pytorch_install的路径。通过git命令下载:
git clone --recursive https://github.com/pytorch/pytorch
  • 1
  1. 然后编译pytorch
    这一步是最耗费时间的了!!!!!!!也是我非常想吐槽的一个地方。首先cd pytorch进入git下来的安装路径。然后通过命令
python3 setup.py build
  • 1

编译。先说一下编译时间吧!网上的教程说大概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.
  • 1

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

git submodule update --remote third_party/protobuf
  • 1

就可以继续正常编译了。

好了,我就在这里继续昨天没完成的记录了。经过两天断断续续地编译,终于见到了这样的编译结果:我仿佛感受到了我的树莓派cpu发着高烧使出吃奶的劲儿终于来到这一步
我仿佛感受到了我的树莓派cpu发着高烧使出吃奶的劲儿终于来到这一步!anyway,这里说no longer necessary to use ‘build’ or 'rebuild’意思就是成功啦,然后是最后一步,网上教程都是这样的命令:

python3 setup.py install
  • 1

这时候,又报了一个小错,说我没有权限把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 "<frozen importlib._bootstrap>", line 1006, in _gcd_import
  File "<frozen importlib._bootstrap>", line 983, in _find_and_load
  File "<frozen importlib._bootstrap>", 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`
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

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

**

测试

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以看到我们的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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

总结

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

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

 

遇到的问题和解决方法

https://github.com/pytorch/pytorch/issues/26455

 

 

 
posted @ 2021-02-22 19:27  水木清扬  阅读(2206)  评论(0编辑  收藏  举报