目录
前言
ChatGPT的回答:
实际测试
解决方法:
来自chatGPT的解答:
前言
最近在进行模型部署的工作,比较关注模型的推理耗时,发现相同的模型在推理时存在耗时波动。所以做了一些小测试,并做一下经验记录。
ChatGPT的回答:
【会话模式】这是因为在模型加载后进行推理时,PyTorch会将模型和数据加载到GPU或CPU中,并进行一系列的预处理和计算。在推理过程中,如果间隔时间很短,那么模型和数据都已经在内存中,可以直接进行计算,因此推理耗时较短且稳定。但是,如果间隔时间增大,可能会出现内存泄漏或者其他不可预测的因素,导致推理耗时偶尔会波动到较大的数值。因此,为了保证推理的稳定性和准确性,建议在模型加载后进行推理时,尽可能缩短间隔时间,避免长时间的空闲。
实际测试
以如下推理过程为例:
for i in range (0, len( input_file_list) ):start = time.time()input = Image.open(input_file_list[i]).convert('RGB')input = to_tensor(input).to(device)[None]N, C, H, W = input.shape# input = F.interpolate(input, (768, 1536), mode='bilinear', align_corners=True)input = F.interpolate(input, (512, 1024), mode='bilinear', align_corners=True)result = model(input)# end = time.time()# print("inference takes about ", end - start, "secs.")result = F.interpolate(result, [H, W], mode='bilinear', align_corners=True)# start = time.time()result = torch.softmax(result, dim=1)result = torch.argmax(result, dim=1).cpu().numpy()result = result.transpose(1, 2, 0)result = render_semantic(result, color_maps)cv2.imshow("result", result)cv2.waitKey(1)end = time.time()print("postprocess takes about ", end - start, "secs.")#增加时间间隔time.sleep(0.05)
对比每次推理结束后,增加50ms的时间间隔与直接进行推理的耗时:
增加时间间隔 前:
增加时间间隔后,明显看到推理时间出现波动,最大推理耗时甚至是原来的4倍左右:
解决方法:
来自chatGPT的解答:
这个问题可能是由于PyTorch的动态图机制导致的。在PyTorch中,每次计算都会重新构建计算图,这可能会导致计算图的构建时间影响推理时间。因此,当推理间隔时间较短时,计算图的构建时间占比较小,推理耗时就会更短且稳定。而当推理间隔时间较长时,计算图的构建时间占比较大,可能会导致推理耗时波动较大。
为了解决这个问题,可以考虑以下几个方面:
1. 将模型加载到GPU上,以加速计算。
2. 预先构建计算图,以减少计算图构建时间。可以使用torch.jit.trace()或torch.jit.script()等函数将模型转换为静态图模式,并将其保存为.pt文件。在推理时,直接加载保存的.pt文件,就可以避免重复构建计算图的时间。
3. 对于多次推理的情况,可以使用批处理的方式进行推理,以减少计算图的构建时间和推理时间。
4. 对于推理耗时波动较大的情况,可以考虑使用更高效的推理算法或优化模型结构,以减少计算量和内存占用。