1

I'm quite new in deep learning and, in order to improve my knowledge, I've been reading some books and following a video course on line. In this videocourse I have to do an exercise with convolution neaural network. I've builded a CNN with 10.000 images with dimension 64x64 pixels. (to recognize cats and dogs images)

from keras.models import Sequential
from  keras.layers import Convolution2D
from  keras.layers import MaxPooling2D
from  keras.layers import Flatten
from  keras.layers import Dense

# Initialising the CNN

classifier = Sequential()

# Step 1 - Convolution
classifier.add(Convolution2D(32,3,3,input_shape=(64,64,3),activation='relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2,2)))


classifier.add(Convolution2D(32,3,3,activation='relu'))
classifier.add(MaxPooling2D(pool_size = (2,2)))

# Step 3 - Flattening
classifier.add(Flatten())

#step 4 - Full Connection CNN
classifier.add(Dense(output_dim = 128 ,activation='relu'))
classifier.add(Dense(output_dim = 1 ,activation='sigmoid'))

# Compiling the CNN

classifier.compile(optimizer = 'adam' , loss = 'binary_crossentropy', metrics = ['accuracy'])

# Fitting the CNN to the images
from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)

traininig_set = train_datagen.flow_from_directory(
        'dataset/training_set',
        target_size=(64, 64),
        batch_size=32,
        class_mode='binary')

test_set = test_datagen.flow_from_directory(
        'dataset/test_set',
        target_size=(64, 64),
        batch_size=32,

        class_mode='binary')

classifier.fit_generator(traininig_set,
        steps_per_epoch=8000,
        epochs=25,
        validation_data=test_set,
        validation_steps=2000)

The first time I installed Anaconda I didn't install the GPU module and when I started fitting my CNN I had to wait 1190 seconds per epoch with the CPU working at 70%. For your information my computer is quite fast. It's an i7 6800k overclocked to 4.2ghz an MSI GTX1080 video cards and 32gb 3333Mhz. I've tought that with this computer installing the tensorflow gpu module was almost compulsory.

I watched in some posts how to check if the tensorflow is correctly configured to use GPU and launching:

In [1]: from tensorflow.python.client import device_lib
In [2]: print(device_lib.list_local_devices())

I have this result:

2017-10-16 10:41:25.780983: W C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
2017-10-16 10:41:25.781067: W C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\platform\cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use AVX2 instructions, but these are available on your machine and could speed up CPU computations.
2017-10-16 10:41:26.635590: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:955] Found device 0 with properties:
name: GeForce GTX 1080
major: 6 minor: 1 memoryClockRate (GHz) 1.8225
pciBusID 0000:03:00.0
Total memory: 8.00GiB
Free memory: 6.61GiB
2017-10-16 10:41:26.635807: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:976] DMA: 0
2017-10-16 10:41:26.636324: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:986] 0:   Y
2017-10-16 10:41:26.637179: I C:\tf_jenkins\home\workspace\rel-win\M\windows-gpu\PY\35\tensorflow\core\common_runtime\gpu\gpu_device.cc:1045] Creating TensorFlow device (/gpu:0) -> (device: 0, name: GeForce GTX 1080, pci bus id: 0000:03:00.0)
[name: "/cpu:0"
device_type: "CPU"
memory_limit: 268435456

locality {
}
incarnation: 16495731140373557390
, name: "/gpu:0"
device_type: "GPU"
memory_limit: 6740156088

locality {
  bus_id: 1
}
incarnation: 6266244792178813148
physical_device_desc: "device: 0, name: GeForce GTX 1080, pci bus id: 0000:03:00.0"
]

With gpu:0, I read in the documentation that TensorFlow automatically will use GPU for computation.

Launching the fit method with this configuration I have to wait 950 sec per epoch, well better than 1190 seconds. The cpu never gets over 10% and, strangely, the GPU never gets over 10-13%. I assume there is something wrong with my configuration because, the teacher in the course, with a MacBook notebook (I don't know the exact configuration actually) without tensorflow GPU module takes approximately 90 seconds per epoch.

I'm not a python or tensorflow expert, but it really seems there is something wrong or something else to understand.

Could someone give some advice, something to read, some tests to do to understand better where is the bottleneck? Thank you

Lorenzo522
  • 21
  • 6

2 Answers2

1

I don't have a GPU on windows, but I got a really good deal installing the Intel Distribution of Python with Anaconda: https://software.intel.com/en-us/articles/using-intel-distribution-for-python-with-anaconda.

For tensorflow, the best seems to be a python 3.5 environment (in the previous link, use python=3.5)

I then installed tensorflow with pip inside this environment made with anaconda. Follow installing with anaconda.

Then Keras with conda install keras. (But make sure it won't replace previous numpy and other installations, find proper installation commands not to replace these optimal packages). Maybe pip install keras could be better in case the conda version doesn't work. (Again, use the proper options not to replace your existing packages) - Don't let this keras installation replace your numpy packages or your tensorflow packages!

This gave me all processors absolutely 100% (according to windows resource monitor)

If this doesn't solve your problem, you can also try getting the numpy and scipy packages from here. Unfortunately I had no success at all with the keras and tensorflow packages from this source, but numpy is quality stuff.


With GPU, your problem may be the lack of a proper CUDA driver and the CUDNN library? Follow this and this.

Unfortunatelly these things vary a lot from computer to computer. I followed strictly the instructions in these sites, and in tensorflow site, for a linux machine, and the results were astonishing.

Daniel Möller
  • 84,878
  • 18
  • 192
  • 214
  • Thanks for your reply. I've followed your advice following your link, I've updated cuda e cudnn but unfortunately there aren't any kind of messages while fitting the cnn and the GPU remains on 9-10% – Lorenzo522 Oct 16 '17 at 15:14
  • Have you "reinstalled" all the packages after updating CUDA and CUDNN? – Daniel Möller Oct 16 '17 at 15:32
  • I've created a brand new enviroment with the lastest version of tensorflow-gpu (1.3.0) and keras Keras (2.0.8) but unfortunately the GPU doesn't get over 10% again – Lorenzo522 Oct 17 '17 at 11:03
  • Hmm.... Have you performed the verify installation (docs.nvidia.com/cuda/cuda-installation-guide-microsoft-windows/index.html#verify-installation) steps for CUDA? If you pass, check that you have these environment vars: `CUDA_PATH` (as demanded in the installation guide), `CUDA_HOME` and `CUDA_ROOT` (who knows if tensorflow is not looking for different vars? I had set the three on my linux installation, just to be sure). – Daniel Möller Oct 17 '17 at 15:21
  • Make sure the CUDA version you installed is 8.0 and that cuDNN is 6.0. And check that all the environment vars for cuDNN are exactly like in the following link. Just in case, I'd also create the `LD_LIBRARY_PATH`, although that's meant for linux installations. http://developer2.download.nvidia.com/compute/machine-learning/cudnn/secure/v6/prod/Doc/cudnn_install-2.txt?iYgYqa5KTxZb5_Bl-lNIYuwDILxY4libpXpn1hZWjoDUuK5zY1KfOExUsEfgpOSb338Q7BWKf1USkZf5JzAfM1khLoQSTm4L0brJoYqoT1ZcsgE6yVLVN5EWtLmvXMvTRGqnQfIIQMHwojO0Vli-qtTUa4csfTHthB4zPZJKgzp5Jp2_ – Daniel Möller Oct 17 '17 at 15:30
0

On top of Daniel's answer (check CUDA & cuDNN) - it is never a good idea to have both tensorflow and tensorflow-gpu packages installed side by side; most probably, you are using the tensorflow (i.e. the CPU) one.

To avoid this, you should uninstall both packages, and then re-install tensorflow-gpu, i.e.:

pip uninstall tensorflow tensorflow-gpu
pip install tensorflow-gpu

See also accepted answer (and comment) here, on a similar issue.

desertnaut
  • 57,590
  • 26
  • 140
  • 166
  • I've unistalled tensorflow, now there's only tensorflow-gpu, but unfortunately the GPU remains on 9%. – Lorenzo522 Oct 16 '17 at 15:14
  • I'd remove tensoflow-gpu and keras, just in case. And install them again. Checking carefully if keras is not trying to install a second tensorflow. – Daniel Möller Oct 16 '17 at 15:33
  • @DanielMöller Keras used to require `tensorflow` (i.e. CPU version), but it seems not anymore https://github.com/fchollet/keras/blob/master/setup.py – desertnaut Oct 16 '17 at 15:41
  • I had this problem not very long ago. I installed tensorflow-gpu, but when I tried to install keras it was automatically trying to install tensorflow. I don't remember if it was the `conda install keras` or the `pip install keras`, but they had certainly different behaviors. In the end, I stayed with the one that didn't want to install tensorflow. – Daniel Möller Oct 16 '17 at 15:43
  • @DanielMöller Yes, me too (it was with `pip`)! But it seems they have removed the explicit dependency in the latest version – desertnaut Oct 16 '17 at 15:46