首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么对于相同的模型和超参数,PyTorch 2x比Keras慢2x?

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

Stack Overflow用户
提问于 2020-02-02 19:10:47
回答 1查看 1.2K关注 0票数 10

我也在定制模块中经历过这种情况,但在本例中,我特别使用了官方的PyTorch示例和MNIST数据集之一。

我在Keras和TF2中移植了精确的体系结构,其模式如下所示:

代码语言:javascript
复制
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中的培训循环是:

代码语言:javascript
复制
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()

每一个时代都是这样的:

代码语言:javascript
复制
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()调用。
  • pin_memory设置为True,对于PyTorch代码,num_workers设置为1。
  • 根据蒂姆布斯·卡林的建议,我将max_queue_size设为1,结果是一致的。

Keras版本的运行速度约为每一个时期4-5秒,而PyTorch版本的运行时间大约为9-10秒。

为什么是这样,这次我如何改进呢?

EN

回答 1

Stack Overflow用户

发布于 2020-02-02 19:25:05

我认为有一个微妙的区别必须考虑;我最好的赌注/预感是:它不是每个GPU本身的处理时间,而是max_queue_size=10参数,默认情况下在Keras中是10。

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60029607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档