注意到第一次推理的gpu内存消耗和推理时间比后续推理高得多。我设置了batch size = 1。例如,对9个样本执行推理就是给出这个推理时间和内存消耗。对于内存消耗,我在每次迭代dataloader时重置峰值内存统计,并使用推理后分配的最大内存来获得每次推理的gpu内存消耗。对于推理时间,我简单地使用时间库并获得开始和结束时间的差异。
下面是代码片段:
with torch.no_grad():
for shape_index, (file_path) in enumerate(tqdm(dataset.file_paths, desc='eval', ncols=0)):
torch.cuda.empty_cache()
torch.cuda.reset_peak_memory_stats()
data = np.loadtxt(file_path).astype(np.float32)
start_time = time.time()
# model inference
inputs = torch.from_numpy(data).float().to(configs.device)
vote_confidences = F.softmax(model(inputs), dim=1)
time_consumption = (time.time() - start_time)
memory_consumption = (torch.cuda.max_memory_allocated())
下面是推理时间和内存消耗。
内存消耗:[10448984064, 1206454272, 1206454272, 1206454272, 1206454272, 1206454272, 1206454272, 1206454272, 1206454272]
时间消耗:[4.7059266567230225, 0.8842918872833252, 0.9028427600860596, 0.8580131530761719, 0.862271785736084, 0.8550527095794678, 0.8648409843444824, 0.8601820468902588, 0.8670477867126465]
这一观察是否有任何具体原因?
非常感谢
1条答案
按热度按时间xjreopfe1#
在第一次推理或前向传递期间,GPU必须为每个级别的每个输出Tensor分配必要的缓冲区内存(这会花费时间)。