Google Colab与我的PC相比非常慢

2024-09-28 21:23:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近开始使用Google Colab,想训练我的第一个卷积神经网络。我从我的Google驱动器中导入了图像,这要感谢我得到的答案dataset-folder-or-zip-located-in-google-drive-to-google-colab">here。

然后我把我的代码粘贴到Colab中创建CNN,并开始了这个过程。 下面是完整的代码:

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

(第1部分是从here复制的,因为它对我的工作方式是exptected

步骤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

步骤2:

from google.colab import auth
auth.authenticate_user()

步骤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}

步骤4:

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

步骤5:

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

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

我用Udemy课程的教程创建了这个CNN。它使用keras和tensorflow作为后端。 为了简单起见,我上传了一个非常简单的版本,足够显示我的问题

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 

参数

imageSize=32

batchSize=64

epochAmount=50

有线电视新闻网

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())

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

图像预处理

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))

现在我的问题来了

首先,我使用的训练集是一个数据库,里面有10000张不同分辨率的狗和猫的图片。(8000套训练,2000套测试)

我在Google Colab(启用了GPU支持)和我的PC(GTX 1060上的tensorflow GPU)上运行这个CNN

这是我的电脑的中间结果:

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

这是科拉布的:

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

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

就我个人而言,我怀疑存在一个瓶颈,那就是从我的驱动器中提取并读取图像,但除了选择不同的方法导入数据库之外,我不知道如何解决这个问题。


Tags: fromimportclientaddlayersgoogle步骤drive
3条回答

可以将数据加载为numpy数组(.npy格式),并使用flow方法而不是flow_from_目录。Colab提供25gbram,因此即使是大数据集,也可以将整个数据加载到内存中。速度大约是2.5倍,数据生成步骤相同!!! (甚至比存储在colab本地磁盘(即'/content'或google drive)中的数据还要快。

由于colab只提供一个单核CPU(每个核2个线程),CPU-GPU数据传输(比如K80或t4gpu)似乎存在瓶颈,特别是在使用数据生成器进行大量预处理或数据扩充时。 您也可以尝试为参数设置不同的值,如“workers”、“use_multiprocessing”、“max_queue_size”in fit_generator method。。。

正如@Feng已经指出的,从驱动器读取文件非常慢。This教程建议使用某种内存映射文件,如hdf5或lmdb,以克服此问题。这样,I/O操作就快得多(有关hdf5格式的速度增益的完整解释,请参见this)。

从google驱动器读取文件非常慢。

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

我执行的时候花了10多分钟!cp drive/big.file/content/’。

在我分享了我的文件,并从谷歌驱动器获得了网址之后。我执行的时候花了5分钟!wget-c-O big.filehttp://share.url.from.drive。下载速度可达130MB/s

相关问题 更多 >