PaddlePaddle / Paddle

PArallel Distributed Deep LEarning: Machine Learning Framework from Industrial Practice (『飞桨』核心框架,深度学习&机器学习高性能单机、分布式训练和跨平台部署)
http://www.paddlepaddle.org/
Apache License 2.0
22.19k stars 5.57k forks source link

使用Predictor预测时爆显存,使用load_inference_model就不会。 #25675

Closed Maybewuss closed 1 year ago

Maybewuss commented 4 years ago

加载Rorberta-large进行预测,batch_size设置为32,使用load_inference_model导入后进行预测,显存维持在2g左右。 使用predictor是设置config中的gpu_memory上限为8g,调用时显存会迅速拉满,然后报错挂掉。 大致的代码逻辑如下

dataset = self.processor.build_dataset(data_list, predict=True)
data_iter = DataLoader(dataset,
                       batch_size=self.batch_size,
                       shuffle=False,
                       collate_fn=batcher('decode'))
for batch in tqdm(data_iter):
    input_ids, masks = batch[:2]
    logits = self.predictor.run([PaddleTensor(input_ids), PaddleTensor(masks)])
jiweibo commented 4 years ago

使用Predictor的时候 尝试把batch_size调小,或者打开config->EnableMemoryOptim()显存复用选项

Maybewuss commented 4 years ago

EnableMemoryOptim

为什么使用load_inference_model的方式可以成功运行呢? 使用predictor相比这种方式有什么优点?

Maybewuss commented 4 years ago

使用Predictor的时候 尝试把batch_size调小,或者打开config->EnableMemoryOptim()显存复用选项

试了一下,打开EnableMemoryOptim后真的可以了!这个选项默认是关闭的,是基于什么考虑?打开之后效率会变差吗?

jiweibo commented 4 years ago

EnableMemoryOptim

为什么使用load_inference_model的方式可以成功运行呢? 使用predictor相比这种方式有什么优点?

不是load_inference_model的问题,应该时exe.run和predictor.run的区别。predictor在预测阶段做了很多优化,可能会导致显存的增长

jiweibo commented 4 years ago

使用Predictor的时候 尝试把batch_size调小,或者打开config->EnableMemoryOptim()显存复用选项

试了一下,打开EnableMemoryOptim后真的可以了!这个选项默认是关闭的,是基于什么考虑?打开之后效率会变差吗?

显存复用和模型结构有关,对于部分模型可能没有效果,所以默认时关闭的。打开该选项不影响预测性能

Maybewuss commented 4 years ago

EnableMemoryOptim

为什么使用load_inference_model的方式可以成功运行呢? 使用predictor相比这种方式有什么优点?

不是load_inference_model的问题,应该时exe.run和predictor.run的区别。predictor在预测阶段做了很多优化,可能会导致显存的增长

为啥我刚刚测了一下发现exe.run要快一点点。。。