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