Mac安装CPU-only Caffe

本文详细记录了在MacOS Mojave上安装CPU-only Caffe的完整过程,包括准备环境、安装依赖、获取并编译Caffe。安装过程中提到了遇到的OpenCV依赖问题、protobuf兼容性问题以及解决方法,还强调了正确管理Python环境和包管理器(如Homebrew、Anaconda)的重要性,以避免未来可能出现的隐患。
摘要由CSDN通过智能技术生成


近期刚入职,工作环境、工作内容乃至生活都在慢慢熟悉中。鉴于工作内容涉及到caffe,虽然之前没有接触过,但带着出身牛犊不怕虎的精神以及满满的干劲,简单看了文档就开始动手在电脑上折腾了。事实证明,这是个大坑,特此记录,也希望能够前人栽树后人乘凉。事先声明,本文是针对完全新手小白的保姆式教程,以及我会尽可能少抒发感情多客观表述。感谢阅读,拒绝杠精,欢迎交流。

鸣谢

首先,感谢在此过程中给我启发和帮助的blogers。由于每个人实际情况往往不尽相同,所以博采众长。表示感谢的同时也供他人参考。
Caffe官方安装教程
一键安装脚本(没试过一键安装,但是帮助最大,非常有助于理解makefile.config的配置;如果不打算采用一键安装,就请继续看下去吧)
在Mac OS Mojave(10.14)上安装 caffe(同样很有帮助的中文文档,很清晰)
mac下配置Caffe指南(中文指南)

写在前面的后记

一年之后回头看这篇文章,虽然整个流程没问题,但其中较多的坑都在于把环境给搞复杂了,并且之后在涉及到其他包编译安装的时候很容易就把当前的环境破坏掉。尽管我们有brew/anaconda/pip一系列的包管理器,必须要先明白他们各自的作用范围,以及在编译的时候我们到底会用到哪一个库。反思一下,最为简便的方式应该是先安装anaconda(最好是一个完全干净的环境),再在anaconda下创建一个环境,随后所有的依赖包都通过conda来安装。尽量避免brew安装(虽然这样真的很省事),但是对于小白来说,你很难搞清楚依赖库究竟安装在/usr/local下还是anaconda路径下,编译时调用的又是哪一个,loader执行时又会调用哪个;这在未来很容易埋下隐患。

本地环境

系统:macOS Mojave 10.14 64bit
目标:CPU only Caffe(无需安装Cuda)

安装步骤

准备工作

需要事先安装homebrew和anaconda。

Homebrew是一款Mac OS平台下的软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能。

在terminal中依次输入下述命令即可安装homebrew。

xcode-select --install		//如果已经事先安装Xcode命令行工具,可忽略这一命令
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

若安装成功,可直接在终端中输入brew,会出现该命令的帮助文档。

Example usage:
  brew search [TEXT|/REGEX/]
  brew info [FORMULA...]
  brew install FORMULA...
  brew update
  brew upgrade [FORMULA...]
  brew uninstall FORMULA...
  brew list [FORMULA...]

Troubleshooting:
  brew config
  brew doctor
  brew install --verbose --debug FORMULA

Contributing:
  brew create [URL [--no-fetch]]
  brew edit [FORMULA...]

Further help:
  brew commands
  brew help [COMMAND]
  man brew
  https://docs.brew.sh

其次,安装anaconda。

Anaconda是一个开源的Python发行版本,其中包括了Conda、Python以及很多工具包,如numpy、pandas等。利用命令行工具conda,我们能够很方便地管理包和环境。

  • 虽然从众多教程来看,caffe对于python3的兼容性不佳,但建议还是安装anaconda3。python2.7的支持快到头了,我们只要利用anaconda,后续可以很轻松地创建python2.7的环境。我自己装的anaconda2,不想再折腾所以就将就了。[以下步骤都是py27验证没问题的,python3不确保准确性…]
  • 关于anaconda的介绍推荐看知乎回答初学 Python 者自学 Anaconda 的正确姿势是什么
  • 官方下载地址
    选择64-Bit Graphical Installer,图形化界面安装方便快捷,基本都是我的首选。
  • 安装完成后,开始设置python2.7的环境。打开terminal,创建环境
//格式:conda create --name env_name package_names
conda create --name py27 python=2.7

这样就成功创建了一个python2.7的环境。需要注意,事实上除了py27外,还有一个默认环境base。当我们打开终端,直接进入的是base环境,如果需要切换到py27环境,则需要在终端输入相应的命令。

source activate py27		//进入名为py27的环境 env_name=py27
conda deactivate			//退出当前环境,回到默认环境

感觉上各个环境是互不干涉的,如果项目需要某些包,就要在相应的环境下安装。命令执行如下图:
anaconda切换环境

安装依赖项

我们现在开始安装依赖,直接利用homebrew即可。然而考虑到兼容性问题,对于不同的依赖需要通过不同方式安装。

  • 首先是比较简单,基本不会出错的依赖
brew install -vd snappy leveldb gflags glog szip lmdb doxygen
brew install openblas
brew install hdf5
  • 接着是新版本和caffe不兼容,但好在homebrew中包括的旧版本还能够使用的依赖
    [后记:如果是python3,brew install boost boost-python3]
brew install boost@1.59 boost-python@1.59
brew link boost@1.59 --force
brew link boost-python@1.59 --force
brew install opencv@3
brew link opencv@3 --force
  • 最后是新版本和caffe不兼容,homebrew里面旧版本又太老的依赖protobuf。
    官方安装指南在此
    我选择了3.5.1的版本。
cd ~/Downloads

//如果没有安装wget,直接通过 brew install wget安装即可
wget https://github.com/protocolbuffers/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.tar.gz
tar xzvf protobuf-all-3.5.1.tar.gz
./autogen.sh
make
make check
sudo make install

安装完成后,输入protoc --version可以看到相应版本号。

关于依赖的兼容性,最初我一上手就直接利用brew安装了最新版的各种依赖,在后续编译过程出现了各式各样的问题。一路走来,我每每不信邪然后踩坑无数,因此我选择相信前辈的经验。前辈们说不兼容,我就不装。

如何判断依赖安装成功与否?需要用到brew info或者brew search。
以opencv为例,brew search opencv能够展示homebrew中包含的opencv版本。
brew search opencv
绿色的对勾✅表示本机已经安装的版本。详细信息可通过brew info opencv@3看到:
brew info opencv@3
如果依赖安装失败,可以通过brew info 看出是否有该依赖所需的其他依赖未安装。若有,则安装相应依赖即可。
在安装依赖的部分,除了兼容性外没有遇到太多问题,依赖的安装基本都是顺利的。

获取caffe

这一步是最顺利的一步了,需要先确保已经安装git,可通过git --version查看。对于命令行提示没有的命令,可以直接去搜一下如何利用brew安装,在此不再赘述。

cd ~		//这一条命令表示直接从git下载到家目录下,会生成一个caffe子目录
git clone https://github.com/BVLC/caffe.git

编译caffe

深吸一口气,让我们进入下一个环节。
官方提供了两种编译的方法,推荐使用cmake,能够自动生成配置文件,并且我们可以直接对生成的配置文件进行修改。

cd ~/caffe/
mkdir build
cd build/
cmake ..

上述命令执行成功后,会在build目录下生成一大堆文件。关于cmake过程出现的问题(会看到提示Configuring incomplete, errors occurred),我会在后文详细描述。如果出现问题,不要着急,可以到下一节看看是否有对应问题。
如果成功,我们可以在终端中看到一个表格“caffe configuration summary”。

– ******************* Caffe Configuration Summary *******************
– General:
– Version : 1.0.0
– Git : 1.0-134-g04ab089d-dirty
– System : Darwin
– C++ compiler : /Library/Developer/CommandLineTools/usr/bin/c++
– Release CXX flags : -O3 -DNDEBUG -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
– Debug CXX flags : -g -fPIC -Wall -Wno-sign-compare -Wno-uninitialized
– Build type : Release

– BUILD_SHARED_LIBS : ON
– BUILD_python : ON
– BUILD_matlab : OFF
– BUILD_docs : ON
– CPU_ONLY : OFF
– USE_OPENCV : ON
– USE_LEVELDB : ON
– USE_LMDB : ON
– USE_NCCL : OFF
– ALLOW_LMDB_NOLOCK : OFF
– USE_HDF5 : ON

– Dependencies:
– BLAS : Yes (vecLib)
– Boost : Yes (ver. 1.59)
– glog : Yes
– gflags : Yes
– protobuf : Yes (ver. 3.5.1)
– lmdb : Yes (ver. 0.9.23)
– LevelDB : Yes (ver. 1.21)
– Snappy : Yes (ver. 1.1.7)
– OpenCV : Yes (ver. 3.4.5)
– CUDA : No

– Python:
– Interpreter : /Users/admin/anaconda2/envs/py27/bin/python2.7 (ver. 2.7.16)
– Libraries : /Users/admin/anaconda2/envs/py27/lib/libpython2.7.dylib (ver 2.7.16)
– NumPy : /Users/admin/anaconda2/envs/py27/lib/python2.7/site-packages/numpy/core/include (ver 1.16.2)

– Documentaion:
– Doxygen : /usr/local/bin/doxygen (1.8.15)
– config_file : /Users/admin/caffe/.Doxyfile

– Install:
– Install path : /Users/admin/caffe/build/install

– Configuring done
– Generating done
– Build files have been written to: /Users/admin/caffe/build

注意,上述表格中Python的interpreter、libraries、numpy的位置应该保持一致,“ /Users/admin/anaconda2/envs/py27”说明都是py27所指的python。

这时候,我们需要修改两个文件CMakeCache.txt和CaffeConfig.cmake。我把它们看作是编译过程的配置文件。[后记:可以直接修改CMakeList.txt]

你可以选择用文本编辑器打开,如果熟悉vim的话也可以在命令行操作。

  • 修改CaffeConfig.cmake
set(Caffe_CPU_ONLY OFF) 	替换成	set(Caffe_CPU_ONLY ON)
  • 修改CMakeCache.txt
//避免编译时出现各种c++11 extension的warnings
CMAKE_CXX_FLAGS:STRING=	替换成	CMAKE_CXX_FLAGS:STRING=-std=c++11

//
CPU_ONLY:BOOL=OFF	替换成	CPU_ONLY:BOOL=ON

//编译时leveldb始终报错,所以选择去掉它,编译完成后未见影响
//写本文的时候,重新尝试了下发现不替换也没报错,奇怪了
//USE_LEVELDB:BOOL=ON	替换成	USE_LEVELDB:BOOL=OFF
//leveldb和lmdb是caffe支持的数据库格式,因此最好是打开的,即BOOL=ON

修改完成后,继续编译caffe

make all

当你看到

[100%] Linking CXX shared library …/lib/_caffe.dylib
Creating symlink /Users/admin/caffe/python/caffe/_caffe.so -> /Users/admin/caffe/build/lib/_caffe.so
[100%] Built target pycaffe

恭喜你!成功就在眼前啦!后面的命令直接执行就好!

make install
make runtest
make pycaffe

至此,安装过程基本结束。需要验证caffe是否安装成功,需要在python2.7环境下,输入

source activate py27
python -c "import caffe"

如果提示 ImportError: No module named caffe,那还需要进一步将caffe中的python导入到解释器中,将环境变量放到配置文件里即可。

//打开 ~/.bash_profile文件
vim ~/.bash_profile
//在文件中加入配置信息 export PYTHONPATH=~/caffe/python:$PYTHONPATH
//关闭文件,输入下述命令,让环境变量生效
source ~/.bash_profile

最终,.bash_profile文件如下图所示:
./bash_profile
此时再次输入python -c "import caffe"不会出现任何错误提示才对。至此,大功告成,撒花!

遇到的问题

遇到问题时最重要的就是读提示,直接谷歌可能可以找到解决方案,但也可能把问题弄的更复杂。找到解决方案的时候,最好弄明白为什么这样做,分析清楚才能更好地解决问题。

  1. 执行cmake时,关于opencv的报错 Could NOT find vecLib

– OpenCV found (/usr/local/share/OpenCV)
CMake Error at /Applications/CMake.app/Contents/share/cmake-3.14/Modules/FindPackageHandleStandardArgs.cmake:137 (message):
Could NOT find vecLib (missing: vecLib_INCLUDE_DIR)
Call Stack (most recent call first):
/Applications/CMake.app/Contents/share/cmake-3.14/Modules/FindPackageHandleStandardArgs.cmake:378 (_FPHSA_FAILURE_MESSAGE)
cmake/Modules/FindvecLib.cmake:24 (find_package_handle_standard_args)
cmake/Dependencies.cmake:135 (find_package)
CMakeLists.txt:49 (include)
– Configuring incomplete, errors occurred!
See also “/Users/admin/caffe/build/CMakeFiles/CMakeOutput.log”.

这个问题比较好懂,就是缺少库文件,直接找到FindvecLib.cmake这个文件。打开后发现find_path语句中指定了vecLib_INCLUDE_DIR的值。但我发现指定的路径不存在,应该是macOS版本不同,路径也发生了变化,所以我找到了vecLib.framework的路径。对FindvecLib.cmake修改如下:

${CMAKE_XCODE_DEVELOPER_DIR}/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
替换成
${CMAKE_XCODE_DEVELOPER_DIR}/SDKs/MacOSX.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/

修改完成后,重新回到caffe/build/目录下,再次执行cmake命令。
同理,如果在cmake过程中发现缺少其他依赖,或者找不到路径,相信聪明的你也能解决。

  1. caffe安装完成了,终于可以推进了。接下来就是看example了。想要打开jupyter notebook的时候报错了。

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 4: ordinal not in range(128)

分析原因后发现,python2.7中默认编码格式就是ascii,而jupyter notebook启动时要求是utf8。python3.6不会有这个问题。
刚开始在python的目录下增加了一个sitecustomize.py文件,用于每次启动时设置字符编码。但接着又出现新的问题:

[C 03:39:29.862 NotebookApp] Bad config encountered during initialization:
[C 03:39:29.863 NotebookApp] Could not decode ‘\xe6\x9c\xaa\xe5\x91\xbd\xe5\x90\x8d’ for unicode trait ‘untitled_notebook’ of a LargeFileManager instance.

最后,参考jupyter错误中的方法,启动时在终端输入LANG=zn jupyter-notebook,成功解决该问题。

  1. 印象中,在后续的编译过程中还出现过google.protobuf找不到的问题。我利用conda再次安装了一遍protobuf就好了。关于这一点,我思考了可能的原因。应该是我自行安装的protobuf少了某些链接?以至于caffe中的python不能找到这个包,只能通过在py27环境下再次安装。
    source activate py27
    //conda install package=version
    conda install protobuf=3.5.1
    
  2. 安装好opencv后,应该在python2.7环境下执行python -c "import cv2"看是否报错。刚开始一直报错,应该是因为重复安装了opencv。安装过程可以参考macOS: 安装opencv3
  3. 可能会提示缺少yaml包,利用homebrew安装即可,brew install pyyaml。

正文之外的闲话

写这篇文章的时候重新走了一遍安装流程,发现异常顺利。但此前的确是折腾了两天才搞定,现在想想主要原因就是走了太多弯路了。从最开始莽莽撞撞直接上手,到各种搞不清状况瞎改配置,以及尝试各种包的安装方法(conda\pip\brew,重复安装包带来了大量的混淆,应该也是导致编译失败的原因),期间还一度去改各种gcc设置。分析起来,还是基础知识不够扎实,cmake\make一直以来也没有好好看过。感觉身边人都很忙,所以自己一直就在瞎折腾,可以说是浪费了很多时间,但事实上也更加熟悉了很多东西,比如mac命令啊、vim操作啊、cmake等等,感触最深的还是面对问题时应该如何思考。

  • 绝不能盲目动手,分析当前的情况很重要。
  • 在找答案的时候不能太过于想当然,要多想想为什么。
  • 搜集信息时(搜索解决方案)最好是确定一个较小的范围,否则要花大量时间在过滤无效信息上。
  • 工作认真一点、思考深入一点、积极主动一点。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值