[PYTHON] Utilisez Colab uniquement comme environnement GPU externe (à partir de 2020.6 / environnement Mac)

J'écrirai sur la façon d'utiliser Colab uniquement en tant qu'environnement GPU externe, pas en tant qu'éditeur.

Avantages de Colab

Pour les MAC qui ne peuvent pas utiliser Cuda (GPU), Google Colaboratory est l'une des options intéressantes, mais il a aussi ses inconvénients.

Démérite

Solution

Ainsi, après le codage sur la machine locale, déplacez le fichier vers Colab et laissez Colab l'exécuter uniquement sur le GPU. ――Pour les projets qui nécessitent une longue période de calcul, le téléchargement du fichier lui-même n'est pas tellement de travail, il est donc étonnamment efficace.

procédure

--Combinez le fichier python principal, le fichier de module et le fichier de données dans un seul dossier.

from google.colab import drive 
drive.mount('/content/drive')

Les dossiers Google Drive sont affichés dans le volet gauche, comme indiqué ci-dessous. image.png


import os
os.chdir('/content/drive/My Drive/colab/face_detection/')

Vous pouvez également effectuer les opérations suivantes sur la ligne de commande: (Notez que si vous utilisez cd sur la ligne de commande Colab, vous devez ajouter% et mettre le chemin entre guillemets.)

%cd "content/drive/My drive/colab/face_detection/"

Si vous le vérifiez, il a été correctement modifié.


!pwd
/content/drive/My Drive/colab/face_age_detection

Exécutez le fichier Python.

!python main.py

tester

Je l'ai essayé dans le projet Keras qui reconnaît les expressions faciales. (À propos, si vous double-cliquez sur le fichier .py sur l'écran Colab, l'écran de l'éditeur apparaîtra sur le côté droit, vous pouvez donc éditer le code source directement.) Dans le cas de ce projet, il y a environ 20000 images 100 * 100, Conv a 3 couches et Dense a 2 couches, ce qui est un traitement un peu lourd.


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os, zipfile, io, re
from PIL import Image
from sklearn.model_selection import train_test_split
import tensorflow.keras
from tensorflow.keras.models import Sequential, Model, load_model
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import GlobalAveragePooling2D
from tensorflow.keras.callbacks import EarlyStopping, ReduceLROnPlateau
from tensorflow.keras.preprocessing.image import ImageDataGenerator

image_size = 100

X = np.load("data/X_data.npy" )
Y = np.load("data/Y_data.npy")

X_train, X_test, y_train, y_test = train_test_split(
    X,
    Y,
    random_state = 0, #Graine aléatoire. S'il vaut 0, il est aléatoire à chaque fois. Constante aléatoire lorsqu'elle est prédéfinie avec un entier.
    test_size = 0.2
)
X_train = X_train.astype('float32') / 255
X_test = X_test.astype('float32') / 255

X_train, X_val, y_train, y_val = train_test_split(
    X_train,
    y_train,
    random_state = 0, #L'ordre des données est mélangé.
    test_size = 0.2
)

def create_model(X, y):
    model = Sequential()
    model.add(Conv2D(32, (3, 3), padding='same',input_shape=X.shape[1:], activation='relu'))
    model.add(Conv2D(32, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Conv2D(64, (3, 3), padding='same', activation='relu'))
    model.add(Flatten()) #Convertir en un vecteur unidimensionnel
    model.add(Dense(64, activation='relu'))        
    model.add(Dense(1))
    model.compile(loss='mse',optimizer='Adam',metrics=['mae'])
    return model

#Fonctions de visualisation du processus d'apprentissage
def plot_history(history):
    plt.plot(history.history['loss'],"o-",label="loss",)
    plt.plot(history.history['val_loss'],"o-",label="val_loss")
    plt.title('model loss')
    plt.xlabel('epoch')
    plt.ylabel('loss')
    plt.legend(loc='upper right')
    plt.show()
    
# Data Augmentation
datagen = ImageDataGenerator(
    featurewise_center = False,
    samplewise_center = False,
    featurewise_std_normalization = False,
    samplewise_std_normalization = False,
    zca_whitening = False,
    rotation_range = 0,
    width_shift_range = 0.1,
    height_shift_range = 0.1,
    horizontal_flip = True,
    vertical_flip = False
)

# EarlyStopping
early_stopping = EarlyStopping(
    monitor = 'val_loss',
    patience = 10,
    verbose = 1
)

# reduce learning rate
reduce_lr = ReduceLROnPlateau(
    monitor = 'val_loss',
    factor = 0.1,
    patience = 3,
    verbose = 1
)

model = create_model(X_train, y_train)
history = model.fit_generator(
datagen.flow(X_train, y_train, batch_size = 128),
    steps_per_epoch = X_train.shape[0] // 128,
    epochs = 50,
    validation_data = (X_val, y_val),
    callbacks = [early_stopping, reduce_lr],
    shuffle = True,
    verbose = 1)

model.save('age_prediction.hdf5')
plot_history(history) 

model = load_model('age_prediction.hdf5')

preds=model.predict(X_test[0:30])

plt.figure(figsize=(16, 6))
for i in range(30):
    plt.subplot(3, 10, i+1)
    plt.axis("off")
    pred = round(preds[i][0],1)
    true = y_test[i]
    if abs(pred - true) < 3.0:
        plt.title(str(true) + '\n' + str(pred))
    else:
        plt.title(str(true) + '\n' + str(pred), color = "red")
    plt.imshow(X_test[i])
plt.show()

Quand je l'exécute,

Machine locale(CPU 2.4Ghz 8-Core Core i9)116 minutes
Colab(GPU)28 minutes

C'était environ 2,5 fois les performances du processeur.

Recommended Posts

Utilisez Colab uniquement comme environnement GPU externe (à partir de 2020.6 / environnement Mac)
GPU ~ Implémentation de PlaidML sur Mac ~ (à partir de mai 2020)
CHEMIN lors de l'utilisation de l'environnement virtuel ANACONDA avec Pycharm (à partir de Mac 2020/10/03)
Construire un environnement pour python3.8 sur Mac
[Python] Création d'un environnement avec Anaconda [Mac]
Utilisation de virtualenv, un environnement d'exécution indépendant pour Python
Utilisez Ghost.py comme alternative à PhantomJS