| --- |
| title: "Installation: OS X" |
| --- |
| |
| # OS X Installation |
|
|
| We highly recommend using the [Homebrew](http://brew.sh/) package manager. |
| Ideally you could start from a clean `/usr/local` to avoid conflicts. |
| In the following, we assume that you're using Anaconda Python and Homebrew. |
|
|
| **CUDA**: Install via the NVIDIA package that includes both CUDA and the bundled driver. **CUDA 7 is strongly suggested.** Older CUDA require `libstdc++` while clang++ is the default compiler and `libc++` the default standard library on OS X 10.9+. This disagreement makes it necessary to change the compilation settings for each of the dependencies. This is prone to error. |
|
|
| **Library Path**: We find that everything compiles successfully if `$LD_LIBRARY_PATH` is not set at all, and `$DYLD_FALLBACK_LIBRARY_PATH` is set to provide CUDA, Python, and other relevant libraries (e.g. `/usr/local/cuda/lib:$HOME/anaconda/lib:/usr/local/lib:/usr/lib`). |
| In other `ENV` settings, things may not work as expected. |
|
|
| **General dependencies** |
|
|
| brew install -vd snappy leveldb gflags glog szip lmdb |
| # need the homebrew science source for OpenCV and hdf5 |
| brew tap homebrew/science |
| brew install hdf5 opencv |
| |
| If using Anaconda Python, a modification to the OpenCV formula might be needed |
| Do `brew edit opencv` and change the lines that look like the two lines below to exactly the two lines below. |
|
|
| -DPYTHON_LIBRARY=#{py_prefix}/lib/libpython2.7.dylib |
| -DPYTHON_INCLUDE_DIR=#{py_prefix}/include/python2.7 |
| |
| If using Anaconda Python, HDF5 is bundled and the `hdf5` formula can be skipped. |
|
|
| **Remaining dependencies, with / without Python** |
|
|
| # with Python pycaffe needs dependencies built from source |
| brew install --build-from-source --with-python -vd protobuf |
| brew install --build-from-source -vd boost boost-python |
| # without Python the usual installation suffices |
| brew install protobuf boost |
| |
| **BLAS**: already installed as the [Accelerate / vecLib Framework](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man7/Accelerate.7.html). OpenBLAS and MKL are alternatives for faster CPU computation. |
|
|
| **Python** (optional): Anaconda is the preferred Python. |
| If you decide against it, please use Homebrew. |
| Check that Caffe and dependencies are linking against the same, desired Python. |
|
|
| Continue with [compilation](installation.html#compilation). |
|
|
| ## libstdc++ installation |
|
|
| This route is not for the faint of heart. |
| For OS X 10.10 and 10.9 you should install CUDA 7 and follow the instructions above. |
| If that is not an option, take a deep breath and carry on. |
|
|
| In OS X 10.9+, clang++ is the default C++ compiler and uses `libc++` as the standard library. |
| However, NVIDIA CUDA (even version 6.0) currently links only with `libstdc++`. |
| This makes it necessary to change the compilation settings for each of the dependencies. |
|
|
| We do this by modifying the Homebrew formulae before installing any packages. |
| Make sure that Homebrew doesn't install any software dependencies in the background; all packages must be linked to `libstdc++`. |
|
|
| The prerequisite Homebrew formulae are |
|
|
| boost snappy leveldb protobuf gflags glog szip lmdb homebrew/science/opencv |
| |
| For each of these formulas, `brew edit FORMULA`, and add the ENV definitions as shown: |
|
|
| 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++" |
| ... |
| |
| To edit the formulae in turn, run |
|
|
| for x in snappy leveldb protobuf gflags glog szip boost boost-python lmdb homebrew/science/opencv; do brew edit $x; done |
| |
| After this, run |
|
|
| for x in snappy leveldb gflags glog szip lmdb homebrew/science/opencv; do brew uninstall $x; brew install --build-from-source -vd $x; done |
| brew uninstall protobuf; brew install --build-from-source --with-python -vd protobuf |
| brew install --build-from-source -vd boost boost-python |
| |
| If this is not done exactly right then linking errors will trouble you. |
|
|
| **Homebrew versioning** that Homebrew maintains itself as a separate git repository and making the above `brew edit FORMULA` changes will change files in your local copy of homebrew's master branch. By default, this will prevent you from updating Homebrew using `brew update`, as you will get an error message like the following: |
|
|
| $ brew update |
| error: Your local changes to the following files would be overwritten by merge: |
| Library/Formula/lmdb.rb |
| Please, commit your changes or stash them before you can merge. |
| Aborting |
| Error: Failure while executing: git pull -q origin refs/heads/master:refs/remotes/origin/master |
| |
| One solution is to commit your changes to a separate Homebrew branch, run `brew update`, and rebase your changes onto the updated master. You'll have to do this both for the main Homebrew repository in `/usr/local/` and the Homebrew science repository that contains OpenCV in `/usr/local/Library/Taps/homebrew/homebrew-science`, as follows: |
|
|
| cd /usr/local |
| git checkout -b caffe |
| git add . |
| git commit -m "Update Caffe dependencies to use libstdc++" |
| cd /usr/local/Library/Taps/homebrew/homebrew-science |
| git checkout -b caffe |
| git add . |
| git commit -m "Update Caffe dependencies" |
| |
| Then, whenever you want to update homebrew, switch back to the master branches, do the update, rebase the caffe branches onto master and fix any conflicts: |
|
|
| # Switch batch to homebrew master branches |
| cd /usr/local |
| git checkout master |
| cd /usr/local/Library/Taps/homebrew/homebrew-science |
| git checkout master |
| |
| # Update homebrew; hopefully this works without errors! |
| brew update |
| |
| # Switch back to the caffe branches with the formulae that you modified earlier |
| cd /usr/local |
| git rebase master caffe |
| # Fix any merge conflicts and commit to caffe branch |
| cd /usr/local/Library/Taps/homebrew/homebrew-science |
| git rebase master caffe |
| # Fix any merge conflicts and commit to caffe branch |
| |
| # Done! |
| |
| At this point, you should be running the latest Homebrew packages and your Caffe-related modifications will remain in place. |
|
|