Machine Learning on external GPU with CUDA and late MBP 2016? I would like to know what the external GPU (eGPU) options are for macOS in 2017 with the late 2016 MacBook Pro.

I did my research, however on the internet I find a lot of confusing information. Some say it can work, but it requires Windows (dual-boot). Others say, it can only work for the older graphics cards as CUDA is not supported for the newer graphics cards (GTX 1080). Ideally, I would like to run the 1080 GTX of NVIDIA. My only purpose is to use Keras and TensorFlow with it. However, I do not know all the things that are important to get it to work. My question therefore is, is it possible to use TensorFlow with CUDA and eGPU on the late MacBook Pro 2016 (15")? I want to use the graphics card in macOS (with late MacBook Pro 15") as an eGPU (no dual-boot/Windows/Linux partition).

Side note: I have seen users making use of eGPU's on macbook's before (Razor Core, AKiTiO Node), but never in combination with CUDA and Machine Learning (or the 1080 GTX for that matter). People suggested renting server space instead, or using Windows (better graphics card support) or even building a new PC for the same price that allows you to use a eGPU on Mac. (I do not prefer that option.)
I could finally install Nvidia Titan XP + MacBook Pro + Akitio Node + Tensorflow + Keras

I wrote a gist with the procedure, hope it helps

https://gist.github.com/jganzabal/8e59e3b0f59642dd0b5f2e4de03c7687

Here is what I did:

This configuration worked for me, hope it helps

It is based on:
https://becominghuman.ai/deep-learning-gaming-build-with-nvidia-titan-xp-and-macbook-pro-with-thunderbolt2-5ceee7167f8b

and on:
https://stackoverflow.com/questions/44744737/tensorflow-mac-os-gpu-support

Hardware


Nvidia Video Card: Titan Xp
EGPU: Akitio Node
MacBook Pro (Retina, 13-inch, Early 2015)
Apple Thunderbolt3 to Thunderbolt2 Adapter
Apple Thunderbolt2 Cable


Software versions


macOS Sierra Version 10.12.6
GPU Driver Version: 10.18.5 (378.05.05.25f01)
CUDA Driver Version: 8.0.61
cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0: Need to register and download
tensorflow-gpu 1.0.0
Keras 2.0.8


Procedure:

Install GPU driver


ShutDown your system, power it up again with pressing (⌘ and R) keys until you see , this will let you in Recovery Mode.
From the Menu Bar click Utilities > Terminal and write ‘csrutil disable; reboot’ press enter to execute this command.
When your mac restarted, run this command in Terminal:

cd ~/Desktop; git clone https://github.com/goalque/automate-eGPU.git
chmod +x ~/Desktop/automate-eGPU/automate-eGPU.sh
sudo ~/Desktop/automate-eGPU/./automate-eGPU.sh

Unplug your eGPU from your Mac, and restart. This is important if you did not unplug your eGPU you may end up with black screen after restarting.
When your Mac restarted, Open up Terminal and execute this command:

sudo ~/Desktop/automate-eGPU/./automate-eGPU.sh -a



Plug your eGPU to your mac via TH2.
Restart your Mac.



Install CUDA, cuDNN, Tensorflow and Keras

At this moment, Keras 2.08 needs tensorflow 1.0.0. Tensorflow-gpu 1.0.0 needs CUDA 8.0 and cuDNN v5.1 is the one that worked for me. I tried other combinations but doesn't seem to work


Download and installing CUDA 8.0 CUDA Toolkit 8.0 GA2 (Feb 2017)
Install it and follow the instructions
Set env variables

vim ~/.bash_profile
export CUDA_HOME=/usr/local/cuda
export DYLD_LIBRARY_PATH="$CUDA_HOME/lib:$CUDA_HOME:$CUDA_HOME/extras/CUPTI/lib"
export LD_LIBRARY_PATH=$DYLD_LIBRARY_PATH



(If your bash_profile does not exist, create it. This is executed everytime you open a terminal window)


Downloading and installing cuDNN (cudnn-8.0-osx-x64-v5.1) Need to register before downloading it
Copy cuDNN files to CUDA

cd ~/Downloads/cuda
sudo cp include/* /usr/local/cuda/include/
sudo cp lib/* /usr/local/cuda/lib/

Create envirenment and install tensorflow

conda create -n egpu python=3
source activate egpu
pip install tensorflow-gpu==1.0.0

Verify it works


Run the following script:

import tensorflow as tf
with tf.device('/gpu:0'):
    a = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[2, 3], name='a')
    b = tf.constant([1.0, 2.0, 3.0, 4.0, 5.0, 6.0], shape=[3, 2], name='b')
    c = tf.matmul(a, b)

with tf.Session() as sess:
    print (sess.run(c))



Install Keras in the envirenment and set tensorflow as backend:

pip install --upgrade --no-deps keras # Need no-deps flag to prevent from installing tensorflow dependency
KERAS_BACKEND=tensorflow python -c "from keras import backend"


Output:

Using TensorFlow backend.
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcublas.8.0.dylib locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcudnn.5.dylib locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcufft.8.0.dylib locally
I tensorflow/stream_executor/dso_loader.cc:126] Couldn't open CUDA library libcuda.1.dylib. LD_LIBRARY_PATH: /usr/local/cuda/lib:/usr/local/cuda:/usr/local/cuda/extras/CUPTI/lib
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcuda.dylib locally
I tensorflow/stream_executor/dso_loader.cc:135] successfully opened CUDA library libcurand.8.0.dylib locally