Google Colab работает очень медленно по сравнению с моим ПК

Недавно я начал использовать 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

Я создал этот CNN с помощью руководств по курсу Udemy. Он использует керасы с тензорным потоком в качестве бэкэнда. Для простоты я загрузил действительно простую версию, которой достаточно, чтобы показать мои проблемы.

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 наборов тренировок, набор тестов 2000)

Я запустил этот CNN в Google Colab (с включенной поддержкой графического процессора) и на своем ПК (tensorflow-gpu на GTX 1060).

Это промежуточный результат с моего ПК:

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 такой медленный?

Лично я подозреваю, что узкое место состоит в извлечении и последующем чтении изображений с моего Диска, но я не знаю, как решить эту проблему, кроме выбора другого метода для импорта базы данных.


person charel-f    schedule 19.03.2018    source источник
comment
Да, я также думаю, что это происходит из-за накладных расходов на сеть из-за доступа к данным с диска. Вы можете попытаться скопировать данные с диска в экземпляр colab, чтобы они были доступны локально.   -  person Ankur Ankan    schedule 19.03.2018
comment
@ charel-f У меня такая же проблема с colab, вы нашли решение? Не могли бы вы поделиться колаб-блокнотом с людьми, читающими ваш вопрос?   -  person NeStack    schedule 27.08.2019
comment
Я тоже прошу вашего ответа, если вы догадались.   -  person Mohammed Noureldin    schedule 17.05.2020
comment
Извините, @NeStack, в последнее время я действительно не работал с colab, и я не нашел лучшего ответа, чем те, которые указаны ниже.   -  person charel-f    schedule 18.05.2020


Ответы (9)


Как уже отмечал @ Фэн, чтение файлов с диска происходит очень медленно. В этом руководстве предлагается использовать какой-то файла с отображением памяти, такого как hdf5 или lmdb, чтобы решить эту проблему. Таким образом, операции ввода-вывода выполняются намного быстрее (полное объяснение увеличения скорости формата hdf5 см. В this).

person MROB    schedule 02.11.2018
comment
Хотя я больше не работаю с Google Colab, я не согласен. Хотя этот ответ, возможно, не соответствует правильному стилю StackOverflow, он, по крайней мере, предоставляет будущим заинтересованным читателям некоторый материал / учебник, которым они могут следовать, чтобы, возможно, получить ответ. Спасибо за вклад - person charel-f; 03.11.2018

Очень медленно читать файл с дисков Google.

Например, у меня есть один большой файл (39 ГБ).

Когда я выполняю '! Cp drive / big.file / content /', это стоило более 10 минут.

После того, как я поделился своим файлом и получил URL-адрес с диска Google. Когда я выполнял, это стоило 5 минут! wget -c -O big.file http://share.url.from.drive '. Скорость загрузки может достигать 130 МБ / с.

person Feng    schedule 19.03.2018
comment
Какое максимальное локальное пространство разрешено для экземпляра colab? - person Kannaiyan; 19.03.2018
comment
@Kannaiyan Вы можете проверить доступное пространство, используя !df -h - person Ankur Ankan; 21.03.2018
comment
Да, в моем случае это дает в 50-500 раз более быстрый результат, обучение с изображениями. - person saurabheights; 10.01.2019

Чтение файлов с диска Google замедляет тренировочный процесс. Решение - загрузить zip-файл в colab и разархивировать там. Надеюсь, для вас это понятно.

person 红领巾    schedule 09.01.2020

Я столкнулся с той же проблемой. Вот как я это решил: -

  1. Загрузил zip-файл набора данных на Google Диск.
  2. Смонтируйте диск в colab, а затем распакуйте файл набора данных «в» в отдельную папку (кроме ../drive) в самом colab.
  3. Делай свой бизнес.

У меня это сработало. Я не знаю точной причины, но поскольку colab получает доступ к своему локальному каталогу быстрее, чем к каталогу смонтированного диска, это может быть сутью проблемы.

person Mrityu    schedule 28.01.2021

Вы можете загрузить свои данные в виде массива numpy (формат .npy) и использовать метод потока вместо flow_from_directory. Colab предоставляет 25 ГБ оперативной памяти, поэтому даже для больших наборов данных вы можете загружать все данные в память. Прирост скорости оказался в 2,5 раза выше при тех же этапах генерации данных !!! (Даже быстрее, чем данные, хранящиеся на локальном диске colab, то есть '/ content' или google drive.

Поскольку colab предоставляет только одноядерный процессор (2 потока на ядро), похоже, существует узкое место с передачей данных CPU-GPU (скажем, K80 или T4 GPU), особенно если вы используете генератор данных для тяжелой предварительной обработки или увеличения данных. Вы также можете попробовать установить разные значения для таких параметров, как 'worker', 'use_multiprocessing', 'max_queue_size' в методе fit_generator ...

person anilsathyan7    schedule 06.08.2019
comment
Colab также предоставляет двухъядерный ЦП ... Также проверьте: ieeexplore.ieee.org/ штамп / штамп.jsp? arnumber = 8485684 - person anilsathyan7; 22.09.2019

Если вы хотите работать с наборами данных из kaggle, проверьте это

Помните: внутри команды Google colab Linux команды запускаются с префиксом '!'

например:

!mkdir ~/.kaggle/kaggle.json 
!ls !unzip -q downloaded_file.zip
person Tushar Gupta    schedule 10.06.2020

У меня была такая же проблема, и вот как я ее решил.

Во-первых, убедитесь, что графический процессор включен (потому что он не включен по умолчанию), перейдя в раздел «Время выполнения» - ›Изменить тип времени выполнения и выбрав графический процессор в качестве аппаратного ускорителя.

Затем, как показано здесь вы можете использовать функции 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)
person Simon Iyamu    schedule 29.07.2020

У меня тот же вопрос, почему графический процессор на colab, кажется, занимает не меньше времени, чем мой локальный компьютер, поэтому я не могу там помочь. Но с учетом сказанного, если вы пытаетесь использовать свои данные локально, я обнаружил, что следующий процесс будет значительно быстрее, чем просто использование функции загрузки, предоставляемой в colab.

1.) смонтировать гугл диск

# 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"

(на это есть ссылка в ответе другого stackoverflow, который я использовал, чтобы найти решение аналогичной проблема )

4.) Теперь ваши данные доступны по пути "/ path / to / the_folder / you created".

person Nadimprodutions    schedule 25.06.2019
comment
Это неверный ответ. ln -s ничего не копирует, он создает символическую ссылку, и все данные по новому пути будут по-прежнему доступны с Google Диска. - person toriningen; 28.09.2019

Экземпляры Google Colab используют более быструю память, чем Google Drive. Поскольку вы получаете доступ к файлам с диска Google (у него большее время доступа), вы получаете низкую скорость. Сначала скопируйте файлы в экземпляр colab, затем обучите свою сеть.

person Muhammad Ali Abbas    schedule 19.12.2020