Mac OS X10.10 下安装caffe

Mac OS X10.10 下安装caffe


[email protected]

http://blog.csdn.net/surgewong


     在Linux学习 Caffe【1】有一段时间了,也渐渐地对 Caffe 的框架有了一点认识。在 Linux 下学习 Caffe 的人很多,网上的参考资料也想对比较多。安装配置教程很多,出了问题都相对比较好解决。前两天老大弄了一台Mac 笔记本过来,叫我帮他在 Mac上安装 Caffe。穷屌丝以前没有玩过 Mac 笔记本,冲着对 Mac 的这份好奇,开始痛苦的安装之旅。


一、Mac下软件安装方式

     习惯了Linux下的 sudo apt-get install XXXX 的软件安装方式,对 Mac下 brew install XXXX 很容易上手。不过之前对 Mac 几乎没有任何基础,要了解其中的一些特定术语,比如:formula,framework还是有些困难的。多用几次,就开始慢慢对其有些了解。brew 的方式安装是通过一个叫着 homebrew【2】 软件包管理工具来实现的。围绕 brew 的安装的常用命令有:

     brew install XXXX          --> 安装软件包或者相应的库

     brew uninstall XXXX         --> 卸载软件包或者相应的库

     brew update              --> 更新 Homebrew自己

     brew upgrade             -->  升级所有可以升级的软件(通过brew方式安装的)

     brew list               -->  列出所有通过 brew 安装的软件

     brew doctor              --> 诊断是否安装成功

     brew edit XXXX            --> 编辑 XXXX (Formula)相应的软件配安装置文件

     brew help               --> 列出常用命令


二、 安装 Caffe 必要的依赖

    参考官方教程【3】,Caffe需要安装的内容有:

     CUDA                     最好是 6.5 版本

     BLAS                     可以通过ATLAS,MKL,OpenBLAS 提供

     Opencv                   版本大于或等于 2.4 

     Boost                    版本大约或等于 1.5, 如有必要还需要提供 python 版本

     glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb

下面是非必需的:

    Python                     Python 2.7  numpy 版本大于或等于1.7

    Matlab                     提供 mex 编译器


三、CUDA 及 BLAS 的安装

   1. CUDA 的安装: Mac 下面 CUDA 的安装相比 Linux 要简单很多,直接下载【4】,然后直接双击,按照提示直接安装就可以,其他的相关设置可以参考文档【5】。

   主要是需要设置 cuda 相关的路径,可以在 /etc/profile 中设置下面环境变量:

   export PATH=/Developer/NVIDIA/CUDA-6.5/bin:$PATH

   export DYLD_LIBRARY_PATH=/Developer/NVIDIA/CUDA-6.5/lib:$DYLD_LIBRARY_PATH


   2. Atlas 的安装: Mac 系统下面的 vecLib 框架(Accelerate Frame)本身就集成了 Atlas的实现,在编译Caffe的时候只需要指定相应头文件所在的目录就可以。


   3. OpenBlas 的安装: 使用 brew 安装 就可以。(直接使用brew安装可能有些问题,后面会介绍)

      brew install  homebrew/science/openblas          ---> 直接安装

      brew install --build-from-source homebrew/science/openblas     --> 通过编译源码安装


   4. MKL 的安装: Intel MKL 是一个商业化针对CPU优化的一个库,可以使用学生免费版,可以到intel官网【6】注册一个帐号,下载相应的mac版本的 MKL。


四、 OpenCV, glog, gflags, protobuf, leveldb, snappy, hdf5, lmdb 的安装

  从Mac 10.9 开始 系统默认的C/C++ 编译器是 clang/clang++ 而不是 gcc/g++,相应使用的C++ 标准库是 libc++ (主要是针对 C++ X11)。在Caffe中很多依赖库主要是基于libstdc++ 库,所以使用默认编译选项时,很容易出现undefined symbols for architecture x86_64 的错误。要解决这个问题,就不必须,保证其相应的依赖本身就是基于 libstdc++ 来编译安装的。

  首先可以通过 brew 的方式来安装上述依赖,不过需要选择通过源码安装,并且在编译时选择使用 libstdc++库进行编译。使用这种方式可以通过编辑 相应的 homebrew formula。前面提到的 openblas 最好也通过该方式进行编译安装。对于每个需要安装的Homebrew formula: 


    boost snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv


  使用 brew edit FORMULA(例如 brew edit boost) 加入相应的环境 ENV定义:


  def install
      # ADD THE FOLLOWING:
      ENV.append "CXXFLAGS", "-stdlib=libstdc++"
      ENV.append "CFLAGS", "-stdlib=libstdc++"
      ENV.append "LDFLAGS", "-stdlib=libstdc++ -lstdc++"
      # The following is necessary because libtool likes to strip LDFLAGS:
      ENV["CXX"] = "/usr/bin/clang++ -stdlib=libstdc++"

  对于每个 formula 按顺序 先卸载然后重新通过源码编译安装:


for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source --fresh -vd $x; done
brew uninstall protobuf; brew install --build-from-source --with-python --fresh -vd protobuf
brew install --build-from-source --fresh -vd boost boost-python

  注: 即便是上面编译安装成功,在编译caffe过程中,可能会提示缺失 tr1/truple 头文件,这还需要安装hdf5 依赖,通过上述类似方式安装即可。


五、OpenCV 本地源码编译,以及 gflags ,glog 本地源码编译

  1. OpenCV的安装:上面提到的 brew 的安装方式可能会安装失败。笔者在安装 opencv 的遇到了不少麻烦。

    a. 直接使用 brew install homebrew/science/opencv 能够成功安装 opencv,但是该 opencv 没有编译 有关 cuda 库,其本身是通过默认的 libc++ 库编译的,因此在使用编译 Caffe 的时候就会出现上述讲的 undefined symbols for architecture x86_64 错误。这种方式是不可取的。


    b. 笔者在使用 brew install --build-from-source --fresh -vd homebrew/science/opencv 的方式安装,系统安装的是2.4.10.1 版本,该版本,有个与cuda兼容性问题的 bug,无法正常编译。(注:对Mac不是很熟悉,没有尝试方法修复 该问题)笔者在Linux下使用的版本是 2.4.9,遇到过类似的 bug【7】。因此放弃使用该方法,转而使用 2.4.9 源码直接编译。


    c. 在使用源码编译的时候,最大的就是如何在 opencv 编译的时候 让其选择 libstdc++ 而不是 libc++。OpenCV 是通过 cmake 来生成 makefile的,要添加 相应的设置就需要修改相应的 cmake 配置。由于对 cmake 的语法不是很熟悉,只能大概猜测。笔者对文件cmake/OpenCVDetectCUDA.cmake第 151行处 添加了

set(CUDA_NVCC_FLAGS  ${CUDA_NVCC_FLAGS}  "-Xcompiler -stdlib=libstdc++; -Xlinker -stdlib=libstdc++")

      然后直接按照正常的编译步骤即可,不过编译时间比较长。


  2.  gflags的安装:笔者使用 第四步的 brew 的方式 安装并没有使得 gflags 成功使用 libstdc++库进行编译(编译caffe报错)。同样的对 gflags的 cmake 相关文件 添加 相应的配置。笔者在 cmake/CMakeCXXInformation.cmake 中 第 209 行出添加 

              set(CMAKE_CXX_FLAGS "-stdlib=libstdc++" ${CMAKE_CXX_FLAGS})

      然后直接按照正常的编译步骤编译安装。


  3.  glog的安装:glog对 gflags 有依赖,所以安装 glog之前 必须安装 gflags,在编译 glog 时,部分文件(*unittest.cc)编译错误,其主要问题是名字空间的问题(没有深究其原因,这里只给出解决方案)。只需要在相应的文件中加入

                      using namespace gflags;


六、编译 Caffe

     在编译 Caffe 时,需要设置好相关依赖的路径以及库依赖,然后等待 make 成功。至此好好享受在 Mac 下使用 Caffe 编程吧!



参考资料:


【1】 Caffe主页

【2】 Homebrew 主页 

【3】 Caffe 安装官网 

【4】 CUDA 官网

【5】 CUDA 在线文档 

【6】 Intel 官网 MKL 

【7】 一个OpenCV 2.4.9 与 CUDA 兼容性的 Bug





郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。