Python - GPU を使用したトレーニングが非常に遅い

okwaves2024-01-25  8

570,000 枚の画像のデータセットがあり、90%、5%、5% の分割率でトレーニング、検証、テストに分割されています。

MobileNetV2 で転移学習を使用してモデルのトレーニングを開始しました。

データがロードされている場所:

train_dataset = image_dataset_from_directory(
    directory=TRAIN_DIR,
    labels="inferred",
    label_mode="categorical",
    class_names=["0", "10", "5"],
    image_size=SIZE,
    seed=SEED,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
)

モデル:

baseModel = MobileNetV2(
           include_top=False,
           input_shape=INPUT_SHAPE,
           weights='imagenet')

headModel = baseModel.output
headModel = AveragePooling2D(pool_size=(7, 7))(headModel)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(512, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
headModel = Dense(3, activation="softmax")(headModel)
# place the head FC model on top of the base model (this will become
# the actual model we will train)
model = Model(inputs=baseModel.input, outputs=headModel)
# loop over all layers in the base model and freeze them so they will
# *not* be updated during the training process
for layer in baseModel.layers:
    layer.trainable = False

モデルの概要:

Total params: 2,915,395
Trainable params: 657,411
Non-trainable params: 2,257,984

私が使用している Nvidia K80 は次のように活用されています。

jupyter@tensorflow-4-vm:~$ nvidia-smi
Fri Sep  4 16:23:01 2020       
+

------------------------



------------------------

-----+ | NVIDIA-SMI 418.87.01 Driver Version: 418.87.01 CUDA Version: 10.1 | |-------------------------------+----------------------+----------------------+ | GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |===============================+======================+======================| | 0 Tesla K80 Off | 00000000:00:04.0 Off | 0 | | N/A 55C P0 58W / 149W | 10871MiB / 11441MiB | 0% Default | +-------------------------------+----------------------+----------------------+ +

------------------------



------------------------

-----+ | Processes: GPU Memory | | GPU PID Type Process name Usage | |=============================================================================| | 0 8129 C /opt/conda/bin/python 10858MiB | +

------------------------



------------------------

-----+
METRICS = [
      TruePositives(name='tp'),
      FalsePositives(name='fp'),
      TrueNegatives(name='tn'),
      FalseNegatives(name='fn'), 
      BinaryAccuracy(name='accuracy'),
      Precision(name='precision'),
      Recall(name='recall'),
      AUC(name='auc'),
]

model.compile(optimizer=Adam(learning_rate=0.0001), 
              loss="categorical_crossentropy",
              metrics=METRICS)

CALLBACKS = [
    ReduceLROnPlateau(verbose=1),
    ModelCheckpoint(
        '/home/jupyter/checkpoint/model.{epoch:02d}-{val_loss:.2f}.hdf5',
        verbose=1),
]
history = model.fit(train_dataset,epochs = 50,verbose=1, batch_size= 32, callbacks= CALLBACKS, validation_data=validation_dataset)

しかし、単一エポックでのトレーニングは非常に時間がかかります。 これほど遅い原因は何でしょうか?

# Batch size = 32

Epoch 1/50
   17/16229 [..............................] - ETA: 196:20:59 - loss: 1.2727 - tp: 169.0000 - fp: 211.0000 - tn: 877.0000 - fn: 375.0000 - accuracy: 0.6409 - precision: 0.4447 - recall: 0.3107 - auc: 0.5755

データをどのようにロードしていますか、またどのバッチサイズを使用していますか?

– Dr.スヌーピー

2020 年 9 月 4 日 16:40

データは、VM インスタンスにマウントされている Google Cloud Platform ストレージ バケットからロードされています。バッチ サイズ 32 を使用しました。

– ユディエシュ

2020 年 9 月 4 日 16:41

いいえ、コード内でデータがどのように読み込まれているかということです。これはデータ読み込みのボトルネックのようです。

– 博士。スヌーピー

2020 年 9 月 4 日 16:42

ああ、image_dataset_from_directory() を使用しています

– ユディエシュ

2020 年 9 月 4 日 16:42

はい、でもどうやって?そのコードとすべてのモデル フィッティング コードを追加してください。

– Dr.スヌーピー

2020 年 9 月 4 日 16:44



------------------------

データの読み込みに問題があるのではないかと思います。ネットワーク経由で各ファイルをロードする場合、考慮すべき点がいくつかあります。最良の方法は、データをローカル ストレージにコピーしてからトレーニングすることです。 それが不可能な場合は、データのロードに TFRecord を使用してみてください (使用方法は、https://www.tensorflow.org/tutorials/load_data/tfrecord で確認できます)。また、ストレージと VM が同じリージョンにあることを確認してください。

2

バケットをインスタンスにマウントする代わりに、データを VM インスタンスに直接コピーしてみます。それがうまくいかない場合は、ja TFRecord を試してみます。

– ユディエシュ

2020 年 9 月 4 日 17:19

また、VM インスタンスとストレージ バケットは私と同じリージョンにあります。

– ユディエシュ

2020 年 9 月 4 日 17:19



------------------------

この問題は、以下を使用してデータセットを VM インスタンスに直接ロードすることで修正されました。

gcloud compute scp /Users/yudhiesh/Desktop/frames_split.zip jupyter@tensorflow-5-vm:~

次に、フォルダーを VM インスタンスのホーム ディレクトリに解凍します。

モデルのトレーニングにかかる​​時間は 1 時間未満になりましたポチ。

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。