与我的 PC 相比,Google Colab 非常慢

Posted

技术标签:

【中文标题】与我的 PC 相比,Google Colab 非常慢【英文标题】:Google Colab is very slow compared to my PC 【发布时间】:2018-08-27 21:22:17 【问题描述】:

我最近开始使用 Google Colab,并想训练我的第一个卷积神经网络。感谢here 的回答,我从 Google Drive 导入了图片。

然后,我将创建 CNN 的代码粘贴到 Colab 中并开始了该过程。 完整代码如下:

第 1 部分:设置 Colab 以从我的云端硬盘导入图片

(第 1 部分是从 here 复制的,因为它按我的预期工作

第 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/

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

我使用 Udemy 课程中的教程创建了这个 CNN。它使用带有 tensorflow 的 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 

参数

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

图像预处理

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

这是来自 Colab:

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

在我的情况下,为什么 Google Colab 这么慢?

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

【问题讨论】:

是的,我也认为这是因为从驱动器访问数据导致的网络开销。您可以尝试将数据从驱动器复制到 colab 实例,以便在本地使用。 @charel-f 我对 colab 也有同样的问题,你找到解决方案了吗?您介意为阅读您的问题的人共享一个 colab 笔记本吗? 如果你想通了,我也在问你的答案。 抱歉@NeStack,我最近没有真正使用 colab,我没有找到比下面链接的更好的答案。 【参考方案1】:

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

【讨论】:

虽然我不再与 Google Colab 合作,但我不同意。虽然这个答案可能不是正确的 *** 风格,但它至少为未来感兴趣的读者提供了一些材料/教程,他们可以遵循这些材料/教程来获得答案。感谢您的贡献【参考方案2】:

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

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

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

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

【讨论】:

colab 实例允许的最大本地空间是多少? @Kannaiyan 您可以使用!df -h查看可用空间 是的,在我的情况下,使用图像进行训练可以使结果快 50-500 倍。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

首先,通过运行时 -> 更改运行时类型,并选择 GPU 作为您的硬件加速器,确保启用 GPU(因为它不是默认启用的)。

然后,如图here 所示,您可以使用 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)

【讨论】:

【参考方案5】:

我遇到了同样的问题。这是我解决它的方法:-

    已将数据集的 zip 文件上传到谷歌驱动器。 在 colab 中安装驱动器,然后将数据集文件解压缩到 colab 本身的单独文件夹(../drive 除外)中。 做你的事。

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

【讨论】:

【参考方案6】:

您可以将数据加载为 numpy 数组(.npy 格式)并使用 flow 方法而不是 flow_from_directory。 Colab 提供 25GB RAM,因此即使对于大数据集,您也可以将整个数据加载到内存中。发现速度提高了 2.5 倍左右,数据生成步骤相同!!! (甚至比存储在 colab 本地磁盘(即“/content”或谷歌驱动器)中的数据还要快。

由于 colab 仅提供单核 CPU(每核 2 个线程),CPU-GPU 数据传输(例如 K80 或 T4 GPU)似乎存在瓶颈,尤其是当您使用数据生成器进行繁重的预处理或数据增强时. 您也可以尝试在 fit_generator 方法中为“workers”、“use_multiprocessing”、“max_queue_size”等参数设置不同的值...

【讨论】:

Colab 还提供双核 CPU...另外结帐:ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8485684【参考方案7】:

如果你想处理来自 kaggle 的数据集,请查看 this

记住:在 Google colab Linux 中,命令通过前缀 '!'

运行

例如:

!mkdir ~/.kaggle/kaggle.json 
!ls !unzip -q downloaded_file.zip

【讨论】:

【参考方案8】:

在我的情况下,与我在 PC 上的 Nvidia GPU 卡相比,colab 上的 GPU 速度非常快——基于训练速度。但是,在进行模拟时,我只能假设涉及 CPU,我的 PC 快了近 50%(i7,第 10 代)

【讨论】:

【参考方案9】:

Google Colab 实例使用的内存比 google drive 更快。当您从谷歌驱动器访问文件时(它有更长的访问时间),所以您的速度变慢了。首先将文件复制到 colab 实例,然后训练您的网络。

【讨论】:

【参考方案10】:

我有同样的问题,为什么 colab 上的 GPU 似乎至少和我的本地电脑一样长,所以我真的无法提供帮助。但是话虽如此,如果您尝试在本地使用数据,我发现以下过程比仅使用 colab 中提供的上传功能要快得多。

1.) 挂载谷歌驱动器

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

2.) 在您希望存储数据的 google 驱动器文件夹之外创建一个文件夹

3.) 使用以下命令将内容从谷歌驱动器中所需文件夹复制到您创建的文件夹

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

(引用自 another *** 回复,我曾经找到类似问题的解决方案)

4.) 现在,您可以在路径“/path/to/the_folder/you created”中使用您的数据

【讨论】:

这个答案是错误的。 ln -s 不会复制任何内容,它会创建符号链接,并且新路径下的所有数据仍会从 Google Drive 访问。

以上是关于与我的 PC 相比,Google Colab 非常慢的主要内容,如果未能解决你的问题,请参考以下文章

我无法在 Google Colab 中安装我的另一个驱动器

为啥 Google Colab TPU 和我的电脑一样慢?

如何修复 google colab 上的 cuda 运行时错误?

在 Google Colab 中打开网络摄像头

在 Google Colab 上,来自 Javascript 的 localhost 访问失败

Conda 环境 Google Colab