Pytorch 模型评估持续时间与模型列车
我们在培训和评估模型时遇到了奇怪的行为 从一段时间以来,我们一直在努力优化我们的表现,但我们遇到了一个奇怪的行为 为了训练一个历元,我们需要大约70min和5400个输入。到 评估模型在4600个输入上大约需要55分钟 这有意义吗?我们有一批32号的。每个批次大约需要1.5秒才能加载到内存中 跟随我们的列车和评估环路: 我从代码中删除了日志记录和计时,以使其更加紧凑: Main.pyPytorch 模型评估持续时间与模型列车,pytorch,Pytorch,我们在培训和评估模型时遇到了奇怪的行为 从一段时间以来,我们一直在努力优化我们的表现,但我们遇到了一个奇怪的行为 为了训练一个历元,我们需要大约70min和5400个输入。到 评估模型在4600个输入上大约需要55分钟 这有意义吗?我们有一批32号的。每个批次大约需要1.5秒才能加载到内存中 跟随我们的列车和评估环路: 我从代码中删除了日志记录和计时,以使其更加紧凑: Main.py for epoch in range(1, config.general['epochs'] + 1):
for epoch in range(1, config.general['epochs'] + 1):
closs = runner.train(train_loader=train_loader,
epoch=epoch,
log_interval=config.general['log_interval'],
batch_size=config.data['batch_size'])
vloss = runner.test(test_loader=test_loader, log_interval=config.general['log_interval'])
scheduler.step()
Runner.py
def train(self, train_loader, epoch, log_interval, batch_size):
self.model.train()
closs = 0
for batch_idx, (data, target) in enumerate(train_loader):
self.optimizer.zero_grad()
data = data.to(self.device)
target = target.to(self.device)
output = self.model(data)['normalized']
loss = self.loss_function(output, target)
loss.backward()
closs = closs + loss.detach().item()
self.optimizer.step()
return closs
def test(self, test_loader, log_interval):
self.model.eval()
with torch.no_grad():
correct = 0
vloss = 0
for batch_idx, (data, target) in enumerate(test_loader):
data = data.to(self.device)
target = target.to(self.device)
output = self.model(data)
loss = self.loss_function(output['normalized'], target)
vloss = vloss + loss.detach().item()
pred = output['x'].max(1)[1] # get the index of the max log-probability
correct += pred.eq(target).cpu().sum().item()
accr = 100. * correct / len(test_loader.dataset) accr))
return vloss
性能测量:
列车上的3条线路大约7秒()
那两条线测试大约20秒()
奇怪的是,我们使用的是torch.no_grad()我们的GPU内存使用率约为90%
我们现在完全不确定我们是否应该投入更多的时间来优化我们的绩效,或者这只是正常的行为。到目前为止,我认为评估应该比训练快得多,即使很难,我们的数据大小与训练数据(我们只使用整个训练集的20%)和测试数据大致相同
编辑:评估和培训花费的时间一样多,这正常吗?我想没有。但我无法解释所描述的行为
编辑2:增加的措施。这些测量结果似乎非常奇怪,不是吗?你的问题到底是什么?您是否在问GPU在使用时是否正常,即使您使用torch.no_grad()?添加了明确的问题;)@Seankala你的大部分时间都是I/O吗?你试过分析你的代码吗?我也不认为简单的评估花费和训练一样长的时间是“正常”的,但同时也很难得出这样的结论;有太多的变量可能会影响速度,所以很难说。然而,就您的情况而言,考虑到您拥有大致相同数量的培训和评估数据样本,我认为这并不奇怪。
output = self.model(data)['normalized']
loss = self.loss_function(output, target)
loss.backward()
loss = self.loss_function(output['normalized'], target)
vloss = vloss + loss.detach().item()