web-dev-qa-db-ja.com

Google Colabは私のPCに比べて非常に遅い

最近、Google Colabの使用を開始し、最初のConvolutional NNをトレーニングしたいと考えました。 here と答えたおかげで、Googleドライブから画像をインポートしました。

次に、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 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が非常に遅いのですか?

個人的には、ドライブから画像を取得して読み取ることで構成されるボトルネックが疑われますが、データベースをインポートする別の方法を選択する以外、これを解決する方法がわかりません。

8
charel-f

@ Feng が既に述べたように、ドライブからのファイルの読み取りは非常に遅いです。 This チュートリアルでは、この問題を克服するために、hdf5やlmdbなどのメモリマップファイルを使用することをお勧めします。このようにして、I\O操作ははるかに高速になります(hdf5形式の速度向上の詳細については、 this を参照してください)。

7
MROB

Googleドライブからファイルを読み取るのは非常に遅いです。

たとえば、1つの大きなファイル(39GB)があります。

'!cp drive/big.file/content /'を実行すると、10分以上かかります。

ファイルを共有し、GoogleドライブからURLを取得した後。実行するのに5分かかりました '! wget -c -O big.file http://share.url.from.drive 'ダウンロード速度は最大130MB/sです。

7
Feng

ColabのGPUが少なくともローカルPCと同じくらい長くかかっているように見えるのと同じ質問があるので、私はそこでは助けにはなりません。しかし、そうは言っても、データをローカルで使用しようとすると、次のプロセスが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"

(これは (別のstackoverflow 同様の問題の解決策を見つけるために使用した応答から参照されます)

4.)これで、パス「/ path/to/the_folder/you created」でデータを使用できるようになりました。

1
Nadimprodutions

データをnumpy配列(.npy形式)としてロードし、flow_from_directoryの代わりにflowメソッドを使用できます。 Colabは25GB RAMを提供しているので、大きなデータセットでもデータ全体をメモリにロードできます。同じデータ生成ステップで速度が2.5倍になりました!!! (colabローカルディスクに保存されているデータ、つまり '/ content'またはgoogleドライブよりも高速です。

ColabはシングルコアCPU(コアあたり2スレッド)のみを提供するため、特に重い前処理またはデータ増強のためにデータジェネレーターを使用する場合、CPU-GPUデータ転送(たとえばK80またはT4 GPU)にボトルネックがあるようです。また、fit_generatorメソッドの「workers」、「use_multiprocessing」、「max_queue_size」などのパラメーターに異なる値を設定してみることもできます...

1
anilsathyan7