web-dev-qa-db-fra.com

Google Colab est très lent par rapport à mon PC

J'ai récemment commencé à utiliser Google Colab et je voulais former mon premier NN convolutionnel. J'ai importé les images de mon Google Drive grâce à la réponse que j'ai obtenue ici .

Ensuite, j'ai collé mon code pour créer le CNN dans Colab et j'ai commencé le processus. Voici le code complet:

Partie 1: Configurer Colab pour importer une image depuis mon Drive

(la partie 1 est copiée de ici comme cela a fonctionné comme prévu pour moi

Étape 1:

!apt-get install -y -qq software-properties-common python-software-properties module-init-tools
!add-apt-repository -y ppa:alessandro-strada/ppa 2>&1 > /dev/null
!apt-get update -qq 2>&1 > /dev/null
!apt-get -y install -qq google-drive-ocamlfuse Fuse

Étape 2:

from google.colab import auth
auth.authenticate_user()

Étape 3:

from oauth2client.client import GoogleCredentials
creds = GoogleCredentials.get_application_default()
import getpass
!google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret} < /dev/null 2>&1 | grep URL
vcode = getpass.getpass()
!echo {vcode} | google-drive-ocamlfuse -headless -id={creds.client_id} -secret={creds.client_secret}

Étape 4:

!mkdir -p drive
!google-drive-ocamlfuse drive

Étape 5:

print('Files in Drive:')
!ls drive/

Partie 2: Copier coller mon CNN

J'ai créé ce CNN avec des tutoriels d'un cours Udemy. Il utilise des kéros avec tensorflow comme backend. Par souci de simplicité, j'ai téléchargé une version très simple, ce qui est suffisant pour montrer mes problèmes

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten 
from keras.layers import Dense 
from keras.layers import Dropout
from keras.optimizers import Adam 
from keras.preprocessing.image import ImageDataGenerator 

paramètres

imageSize=32

batchSize=64

epochAmount=50

CNN

classifier=Sequential() 

classifier.add(Conv2D(32, (3, 3), input_shape = (imageSize, imageSize, 3), activation = 'relu')) #convolutional layer

classifier.add(MaxPooling2D(pool_size = (2, 2))) #pooling layer

classifier.add(Flatten())

ANN

classifier.add(Dense(units=64, activation='relu')) #hidden layer

classifier.add(Dense(units=1, activation='sigmoid')) #output layer

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

prétraitement des images

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

test_datagen = ImageDataGenerator(rescale = 1./255) 

training_set = train_datagen.flow_from_directory('drive/School/sem-2-2018/BSP2/UdemyCourse/CNN/dataset/training_set',
                                             target_size = (imageSize, imageSize),
                                             batch_size = batchSize,
                                             class_mode = 'binary')

test_set = test_datagen.flow_from_directory('drive/School/sem-2-2018/BSP2/UdemyCourse/CNN/dataset/test_set',
                                        target_size = (imageSize, imageSize),
                                        batch_size = batchSize,
                                        class_mode = 'binary')

classifier.fit_generator(training_set,
                     steps_per_Epoch = (8000//batchSize),
                     epochs = epochAmount,
                     validation_data = test_set,
                     validation_steps = (2000//batchSize))

Maintenant vient mon problème

Tout d'abord, l'ensemble de formation que j'ai utilisé est une base de données avec 10000 photos de chiens et de chats de différentes résolutions. (8000 jeu_entraînement, 2000 jeu_test)

J'ai exécuté ce CNN sur Google Colab (avec prise en charge GPU activée) et sur mon PC (tensorflow-gpu sur GTX 1060)

Ceci est un résultat intermédiaire de mon PC:

Epoch 2/50
63/125 [==============>...............] - ETA: 2s - loss: 0.6382 - acc: 0.6520

Et ceci de Colab:

Epoch 1/50
13/125 [==>...........................] - ETA: 1:00:51 - loss: 0.7265 - acc: 0.4916

Pourquoi Google Colab est-il si lent dans mon cas?

Personnellement, je soupçonne un goulot d'étranglement consistant à tirer puis à lire les images de mon Drive, mais je ne sais pas comment résoudre ce problème autre que le choix d'une méthode différente pour importer la base de données.

8
charel-f

Comme @ Feng l'a déjà noté, la lecture des fichiers depuis le lecteur est très lente. This tutorial suggère d'utiliser une sorte de fichier mappé en mémoire comme hdf5 ou lmdb afin de surmonter ce problème. De cette façon, les opérations I\O sont beaucoup plus rapides (pour une explication complète sur le gain de vitesse du format hdf5, voir this ).

7
MROB

Il est très lent de lire un fichier à partir de Google Drive.

Par exemple, j'ai un gros fichier (39 Go).

Cela coûte plus de 10 minutes lorsque j'exécute '! Cp drive/big.file/content /'.

Après avoir partagé mon fichier et obtenu l'URL de Google Drive. Ça m'a coûté 5 minutes quand j'exécute! wget -c -O big.file http://share.url.from.drive '. La vitesse de téléchargement peut atteindre 130 Mo/s.

7
Feng

J'ai la même question quant à la raison pour laquelle le GPU sur colab semble prendre au moins aussi longtemps que mon PC local, donc je ne peux pas vraiment y aider. Mais cela étant dit, si vous essayez d'utiliser vos données localement, j'ai trouvé que le processus suivant était beaucoup plus rapide que d'utiliser simplement la fonction de téléchargement fournie dans colab.

1.) Montez Google Drive

# Run this cell to mount your Google Drive.
from google.colab import drive
drive.mount('/content/drive')

2.) Créez un dossier en dehors du dossier Google Drive dans lequel vous souhaitez que vos données soient stockées

3.) Utilisez la commande suivante pour copier le contenu de votre dossier souhaité dans Google Drive vers le dossier que vous avez créé

  !ln -s "/content/drive/My Drive/path_to_folder_desired" "/path/to/the_folder/you created"

(ceci est référencé à partir de n autre stackoverflow réponse que j'ai utilisé pour trouver une solution à un problème similaire)

4.) Maintenant, vous avez vos données à votre disposition sur le chemin, "/ chemin/vers/le_dossier/vous avez créé"

1
Nadimprodutions

Vous pouvez charger vos données sous forme de tableau numpy (format .npy) et utiliser la méthode de flux au lieu de flow_from_directory. Colab fournit 25 Go RAM, donc même pour les ensembles de données volumineux, vous pouvez charger l'intégralité de vos données en mémoire. La vitesse s'est avérée être d'environ 2,5x, avec les mêmes étapes de génération de données !!! (Encore plus rapide que les données stockées sur le disque local colab, c'est-à-dire '/ content' ou google drive.

Comme colab ne fournit qu'un seul processeur (2 threads par cœur), il semble y avoir un goulot d'étranglement avec le transfert de données CPU-GPU (disons K80 ou T4 GPU), surtout si vous utilisez un générateur de données pour un prétraitement intensif ou une augmentation des données. Vous pouvez également essayer de définir des valeurs différentes pour des paramètres tels que 'workers', 'use_multiprocessing', 'max_queue_size' dans la méthode fit_generator ...

1
anilsathyan7