【问题标题】:Difference in Performance between Cloud Compute VM and AI Platform云计算虚拟机与 AI 平台的性能差异
【发布时间】:2020-02-26 10:20:58
【问题描述】:

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

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

问题

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

当训练在complex_model_m_p100 AI平台机器上运行时,我相信它相当于VM,我可以设置最大batch size为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 机器上运行?欢迎任何建议!

【问题讨论】:

  • AI Platform 默认提供常规的 100GB 永久磁盘,如果您访问本地磁盘上的数据集,可能会影响 IO 吞吐量。您能否在具有常规永久性磁盘的 GCE 虚拟机上尝试一下,看看这是否是瓶颈?
  • 这不是编程问题,而是关于服务器配置的问题,应该在serverfault.com - What topics can I ask about here? 上询问
  • @GuoqingXu 记录在哪里,我很想知道。我有 1TB 的训练数据,我认为 AI Platform Training 不适合我,只是在容器启动时从 GCS 获取 18GB 的​​文件失败了 46%,它就放弃了。
  • 您能否向 cloudml-feedback@google.com 发送一封描述问题的电子邮件?我们将确保这些问题得到解决。

标签: tensorflow google-cloud-platform google-cloud-ml gcp-ai-platform-training


【解决方案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 看起来更像虚拟机: https://cloud.google.com/ai-platform/training/docs/machine-types#gpus-and-tpus, 因为您现在使用的是旧版机器。

【讨论】:

  • 感谢您的建议!我在这样配置的机器上运行了一个比较作业:masterType: n1-highcpu-16 masterConfig: acceleratorConfig: count: 4 type: NVIDIA_TESLA_P100,但我仍然看到了 ~4 倍的减速!
  • 4x 减速将建议您只使用 4 个 GPU 中的一个。您可以尝试比较 VM-2GPU 和 AIPlatform-2GPU,看看是否会出现 2 倍的减速
  • 为了解决您可能需要添加某种 DistributedTraining 策略的问题,AIPlatform 可能出于某种奇怪的原因设置了与标准 tensorflow 不同的默认策略。
  • 好的,这很奇怪。使用 4 个 GPU:每个 epoch 160 秒,2 个 GPU:每个 epoch 160 秒,1 个 GPU:每个 epoch 80 秒!有什么想法会发生这种情况吗?
  • 嗯该死的,这仍然是 2 倍的减速,这意味着它仍然是别的东西。您是否尝试过带有 1 个 GPU 的虚拟机,是 80 秒 / 纪元吗?我的猜测是 AIPlatforms 使用的分发策略会使您的性能恶化 2 倍,而不是提高 2 倍,这就是为什么您会看到性能降低 4 倍的原因
【解决方案2】:

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

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

有一个指南描述了如何做到这一点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 秒。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-21
    • 2015-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多