tensorflow - 对于相同的模型和超参数,为什么 PyTorch 比 Keras 慢 2 倍?

标签 tensorflow keras deep-learning neural-network pytorch

我在定制模块上也遇到过这种情况,但在这个例子中,我专门使用 the official PyTorch examples 之一。和 MNIST 数据集。

我已经将 Keras 和 TF2 中的确切架构移植到了 Eager 模式,如下所示:

model = keras.models.Sequential([ keras.layers.Conv2D(32, (3, 3) , input_shape=(28,28,1), activation='relu'),
                                 keras.layers.Conv2D(64, (3, 3)),
                                 keras.layers.MaxPool2D((2, 2)),
                                 keras.layers.Dropout(0.25),
                                 keras.layers.Flatten(),
                                 keras.layers.Dense(128, activation='relu'),
                                 keras.layers.Dropout(0.5),
                                 keras.layers.Dense(10, activation='softmax')]
                                )

model.summary()

model.compile(optimizer=keras.optimizers.Adadelta(), loss=keras.losses.sparse_categorical_crossentropy, metrics=['accuracy'])

model.fit(train_data,train_labels,batch_size=64,epochs=30,shuffle=True, max_queue_size=1)

PyTorch 中的训练循环是:
def train(args, model, device, train_loader, optimizer, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()

和我一起计时每个时代:
for epoch in range(1, args.epochs + 1):
    since = time.time()
    train(args, model, device, train_loader, optimizer, epoch)
    # test(args, model, device, test_loader)
    # scheduler.step()
    time_elapsed = time.time() - since
    print('Training complete in {:.0f}m {:.0f}s'.format(
        time_elapsed // 60, time_elapsed % 60))

我已经证实:
  • 两个版本都使用相同的优化器 (AdaDelta)
  • 两个版本的可训练参数数量大致相同(120 万)
  • 我删除了 dataLoader 中的规范化,只剩下一个 toTensor() 调用。
  • 对于 PyTorch 代码,pin_memory 设置为 True,num_workers 设置为 1。
  • 根据 Timbus Calin 的建议我将 max_queue_size 设置为 1,结果是相同的。

  • Keras 版本每个 epoch 运行大约 4-5 秒,而 PyTorch 版本每个 epoch 运行大约 9-10 秒。

    为什么会这样,这次我该如何改进?

    最佳答案

    我认为必须考虑到一个细微的差异;我最好的选择/预感如下:这不是每个 GPU 本身的处理时间,而是 max_queue_size=10参数,在 Keras 中默认为 10。

    由于默认情况下,在 PyTorch 的普通 for 循环中,数据没有排队,Keras 受益的队列允许更快地将数据从 CPU 传输到 GPU;从本质上讲,为 GPU 提供数据所花费的时间要少得多,因为它从内部队列中消耗得更快/从 CPU 到 GPU 传输数据的开销减少了。

    除了我以前的观察之外,我看不到任何其他明显的差异,也许其他人可以指出新的发现。

    关于tensorflow - 对于相同的模型和超参数,为什么 PyTorch 比 Keras 慢 2 倍?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60029607/

    相关文章:

    tensorflow - 如何更改 channel 数量以在 Keras 中微调 VGG16 网络

    python - 如何在keras CNN中使用黑白图像?

    python - Python光标提取器生成器

    python - TensorFlow 模型拟合和 train_on_batch 之间的区别

    python - TensorFlow Extended (TFX) : Clarify Beam, Airflow 和 Kubeflow 使用

    Tensorflow:如何获取多个矩阵的对角线(批处理模式)

    python - 如何理解tf.Session的target?

    python - 在 keras 的预训练密集层之间添加 dropout 层

    python - 如何反转标签的 One-Hot Encoding 以评估 ML/DL 模型?

    tensorflow - '属性错误: 'Tensor' object has no attribute '_keras_history' during implementing perceptual loss with pretrained VGG using keras