| | --- |
| | 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. |
| |
|