-1

我有一个 GCP 云计算 VM,它是一个n1-standard-164 个 P100 GPU,以及一个用于存储数据的固态驱动器。我将其称为“VM”。

我之前使用虚拟机来训练基于 tensorflow 的 CNN。我想从这个转向使用 AI Platform,这样我就可以同时运行多个作业。但是我遇到了一些问题。

问题

当在 VM 上运行训练时,我可以将批量大小设置为 400,完成一个 epoch 的标准时间约为 25 分钟。

当训练在一个complex_model_m_p100我认为相当于 VM 的 AI 平台机器上运行时,我可以设置最大批量大小为 128,完成一个 epoch 的标准时间是 1 小时 40 分钟。

差异:VM 与 AI 平台

  • VM 使用 TF1.12,AI Platform 使用 TF1.15。因此,GPU 驱动程序存在差异(CUDA 9 与 CUDA 10)。

  • VM配备了固态驱动器,我认为AI平台机器不是这种情况。

我想了解减少批量大小的原因,并将 AI Platform 上的 epoch 时间减少到与 Glamdring 相当的水平。有没有其他人遇到过这个问题?我是否在正确类型的 AI Platform 机器上运行?任何的建议都受欢迎!

4

2 回答 2

1

可能是一堆东西。有两种方法可以让 VM 看起来更像 AI Platform:

export IMAGE_FAMILY="tf-latest-gpu" # 1.15 instead of 1.12
export ZONE=...
export INSTANCE_NAME=...

gcloud compute instances create $INSTANCE_NAME \
  --zone=$ZONE \
  --image-family=$IMAGE_FAMILY \
  --image-project=deeplearning-platform-release \
  --maintenance-policy=TERMINATE \
  --metadata="install-nvidia-driver=True"

n 然后连接 4 个 GPU。

...或使 AI Platform 看起来更像 VM: https ://cloud.google.com/ai-platform/training/docs/machine-types#gpus-and-tpus ,因为您现在使用的是旧版机器.

于 2020-02-26T10:38:40.330 回答
0

在遵循@Frederik Bode 的建议并创建一个安装了 TF 1.15 和相关驱动程序的副本 VM 后,我设法解决了我的问题。

而不是multi_gpu_model在 tf.keras 中使用函数调用,实际上最好使用分布式策略并在该范围内运行模型。

有一个指南描述了如何做到这一点here

基本上现在我的代码如下所示:

mirrored_strategy = tf.distribute.MirroredStrategy()

with mirrored_strategy.scope():

    training_dataset, validation_dataset = get_datasets()

    model = setup_model()

    # Don't do this, it's not necessary!
    #### NOT NEEDED model = tf.keras.utils.multi_gpu_model(model, 4)

    opt = tf.keras.optimizers.Adam(learning_rate=args.learning_rate)

    model.compile(loss='sparse_categorical_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])

    steps_per_epoch = args.steps_per_epoch
    validation_steps = args.validation_steps

    model.fit(training_dataset, steps_per_epoch=steps_per_epoch, epochs=args.num_epochs,
                validation_data=validation_dataset, validation_steps=validation_steps)

我设置了一个小数据集,这样我就可以快速制作原型。

使用单个 P100 GPU,纪元时间平均为 66 秒。

对于 4 个 GPU,使用上面的代码,平均 epoch 时间为 19 秒。

于 2020-03-05T13:13:57.240 回答