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

Google Colab is very slow compared to my PC

我最近开始使用 Google Colab,并想训练我的第一个卷积神经网络。由于得到 .

的回答,我从我的 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

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

安娜

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 training_set, 2000 test_set)

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

这是我的 PC 的中间结果:

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 在我的情况下这么慢?

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

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

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

我执行 '!cp drive/big.file /content/' 时花费了 10 多分钟。

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

如@Feng has already noted, reading files from drive is very slow. This tutorial suggests using some sort of a memory mapped file like hdf5 or lmdb in order to overcome this issue. This way the I\O Operations are much faster (for a complete explanation on the speed gain of hdf5 format see this).

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

1.) 安装google驱动器

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

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

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

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

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

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

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

由于 colab 仅提供一个核心 CPU(每个核心 2 个线程),CPU-GPU 数据传输(例如 K80 或 T4 GPU)似乎存在瓶颈,尤其是如果您使用数据生成器进行大量预处理或数据扩充。 您还可以尝试在 fit_generator 方法中为 'workers'、'use_multiprocessing'、'max_queue_size ' 等参数设置不同的值 ...

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

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

记住: 内部 Google colab Linux 命令是 运行 通过前缀 '!'

例如:

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

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

首先,通过转至运行时 -> 更改运行时类型并选择 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)

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

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

  1. 已将数据集的 zip 文件上传到 google 驱动器。
  2. 在 colab 中安装驱动器,然后将数据集文件解压缩 'in' 在 colab 本身中的一个单独的文件夹(除了 ../drive)。
  3. 做你的事。

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

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