与我的PC相比,谷歌Colab非常慢

cha*_*l-f 9 python neural-network jupyter-notebook google-colaboratory

我最近开始使用Google Colab,并想训练我的第一个Convolutional NN.由于我在这里的答案,我从Google云端硬盘导入了图片.

然后我粘贴了我的代码,将CNN创建到Colab中并启动了该过程.这是完整的代码:

第1部分:设置Colab从我的驱动器导入图片

(第1部分是从这里复制的,因为它对我来说是有效的

步骤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
Run Code Online (Sandbox Code Playgroud)

第2步:

from google.colab import auth
auth.authenticate_user()
Run Code Online (Sandbox Code Playgroud)

第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}
Run Code Online (Sandbox Code Playgroud)

第4步:

!mkdir -p drive
!google-drive-ocamlfuse drive
Run Code Online (Sandbox Code Playgroud)

第5步:

print('Files in Drive:')
!ls drive/
Run Code Online (Sandbox Code Playgroud)

第2部分:复制粘贴我的CNN

我用Udemy课程的教程创建了这个CNN.它使用带有张量流的keras作为后端.为了简单起见,我上传了一个非常简单的版本,足以显示我的问题

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 
Run Code Online (Sandbox Code Playgroud)

参数

imageSize=32

batchSize=64

epochAmount=50
Run Code Online (Sandbox Code Playgroud)

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())
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

图像预处理

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))
Run Code Online (Sandbox Code Playgroud)

现在来了我的问题

首先,我使用的训练集是一个包含10000种不同分辨率的狗和猫图片的数据库.(8000 training_set,2000 test_set)

我在谷歌Colab(支持GPU支持)和我的PC(GTX 1060上的tensorflow-gpu)上运行了这个CNN

这是我的PC的中间结果:

Epoch 2/50
63/125 [==============>...............] - ETA: 2s - loss: 0.6382 - acc: 0.6520
Run Code Online (Sandbox Code Playgroud)

这来自Colab:

Epoch 1/50
13/125 [==>...........................] - ETA: 1:00:51 - loss: 0.7265 - acc: 0.4916
Run Code Online (Sandbox Code Playgroud)

为什么Google Colab在我的案例中这么慢?

我个人怀疑是一个瓶颈,包括拉动然后从我的驱动器读取图像,但除了选择不同的方法导入数据库之外,我不知道如何解决这个问题.

MRO*_*ROB 8

正如@ Feng已经指出的那样,从驱动器读取文件非常慢。教程建议使用某种类型的内存映射文件,例如hdf5或lmdb,以解决此问题。这样,I \ O操作会更快(有关hdf5格式的速度增益的完整说明,请参见this)。

  • 虽然我不再使用Google Colab,但我不同意。尽管此答案可能不是正确的StackOverflow风格,但它至少为将来感兴趣的读者提供了一些他们可以遵循的材料/教程,以获取答案。感谢您的贡献 (2认同)

Fen*_*eng 7

从谷歌硬盘读取文件非常慢.

例如,我有一个大文件(39GB).

我执行'!cp drive/big.file/content /'时花费超过10分钟.

我分享了我的文件后,从谷歌驱动器获取了网址.当我执行时,它花了5分钟!wget -c -O big.file http://share.url.from.drive '.下载速度可达130MB/s.


Sim*_*amu 6

我遇到了同样的问题,这就是我解决的方法。

首先,通过转到“运行时”->“更改运行时类型”并选择 GPU 作为硬件加速器,确保启用 GPU(因为默认情况下不是)。

然后,如此处所示,可以使用cache()和prefetch()函数来优化性能。例子:

# Load dataset
train_ds = keras.preprocessing.image_dataset_from_directory('Data/train',labels="inferred")
val_ds = keras.preprocessing.image_dataset_from_directory('Data/test',labels="inferred")

# Standardize data (optional)
from tensorflow.keras import layers
normalization_layer = keras.layers.experimental.preprocessing.Rescaling(1./255)
train_ds = train_ds.map(lambda x, y: (normalization_layer(x), y))
val_ds = val_ds.map(lambda x, y: (normalization_layer(x), y))

# Cache to RAM (optional)
from tensorflow import data
AUTOTUNE = data.experimental.AUTOTUNE
train_ds = train_ds.cache().prefetch(buffer_size=AUTOTUNE)
val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)

# Train
model.fit(train_ds, validation_data=val_ds, epochs=3)
Run Code Online (Sandbox Code Playgroud)


Mri*_*tyu 6

我面临着同样的问题。我是这样解决的:-

  1. 将数据集的 zip 文件上传到 Google Drive。
  2. 将驱动器安装在 colab 中,然后将数据集文件解压缩到 colab 本身的单独文件夹(除 ../drive 之外)中。
  3. 做你的生意。

这对我有用。我不知道确切的原因,但由于 colab 访问其本地目录的速度比访问已安装的驱动器目录的速度快,这可能恰好是问题的要点。


小智 5

从谷歌驱动器读取文件会减慢你的训练过程。解决方案是将 zip 文件上传到 colab 并在那里解压缩。希望您清楚。