Paddle 使用paddle.inference时,同样一段代码,有的时候能够正确运行,而大多数时候会报错

baubqpgj  于 2021-12-07  发布在  Java
关注(0)|答案(10)|浏览(593)
  • 版本、环境信息:

   1)PaddlePaddle版本:2.0-rc
   2)CPU:Intel i5-8300H
   4)系统环境:Windows, python 3.7

def load_model(self, model_dir, use_gpu=False):
        model = os.path.join(model_dir, '__model__')
        params = os.path.join(model_dir, '__params__')
        config = Config(model, params)

        # 设置参数
        if use_gpu:   
            config.enable_use_gpu(100, 0)
        else:
            config.disable_gpu()
            config.enable_mkldnn()
        config.disable_glog_info()
        config.switch_ir_optim(True)
        config.enable_memory_optim()
        config.switch_use_feed_fetch_ops(False)
        config.switch_specify_input_names(True)

        # 通过参数加载模型预测器
        predictor = create_predictor(config)

        # 获取模型的输入输出
        input_names = predictor.get_input_names()
        output_names = predictor.get_output_names()
        input_handle = predictor.get_input_handle(input_names[0])
        output_handle = predictor.get_output_handle(output_names[0])

使用上述代码加载完模型之后

在预测阶段调用如下函数

def predict(self, imgs):
        input_datas = self.preprocess(imgs)
        self.input_handle.copy_from_cpu(input_datas)
        self.predictor.run()
        result = self.output_handle.copy_to_cpu()
        return result

将会在predictor.run报错

其中imgs为13128*128的numpy数组

但奇怪的是 有的时候能够正确运行(极少数)

s3fp2yjn

s3fp2yjn1#

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看官网API文档常见问题历史IssueAI社区来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

qzwqbdag

qzwqbdag2#

输入数据的shape对吗,是不是shape对应不上导致出错了。

v2g6jxz6

v2g6jxz63#

我输出过shape没什么问题 奇怪的是如果我在预测之前直接print 输入的数据 就能够正常运行
是因为之前的数据内存被释放掉了吗?

偶然间又成功一次. 之后又不行了

7ajki6be

7ajki6be4#

代码里面没有设置输入的shape,你把inpute_handle的shape设置一下试试。参考https://paddle-inference.readthedocs.io/en/latest/quick_start/python_demo.html

20jt8wwn

20jt8wwn5#

同时尝试一下,改成下面代码设置输入。可能是numpy内部数据不连续导致输入数据错误。

def predict(self, imgs):
        input_datas = self.preprocess(imgs)
        self.input_handle.copy_from_cpu(input_datas.copy())
        self.predictor.run()
        result = self.output_handle.copy_to_cpu()
        return result
dfddblmv

dfddblmv6#

这个偶然成功的输入大小

然后失败的时候也是这个大小

我尝试使用copy 好像没有什么变化

alen0pnh

alen0pnh7#

我将代码改成了

def predict(self, imgs, ori_img=None):
        # plt.imshow(cv2.cvtColor(ori_img, cv2.COLOR_BGR2RGB))
        # plt.show()
        input_datas = self.preprocess(imgs)
        self.input_handle.reshape((-1, 3, 128, 128))
        self.input_handle.copy_from_cpu(input_datas.copy())
        self.predictor.run()
        result = self.output_handle.copy_to_cpu()

        return result

感觉成功率高了不少,但是有的时候还是会出现上面这个错误

同时连续运行的时候还会出现段错误,是内存不过吗?

rfbsl7qr

rfbsl7qr8#

必须指定输入shape的 batch_size,不可以是-1。

同时考虑numpy内存不连续,可以不用copy,用这个api:https://numpy.org/doc/stable/reference/generated/numpy.ascontiguousarray.html

x759pob2

x759pob29#

def predict(self, imgs, ori_img=None):
        # plt.imshow(cv2.cvtColor(ori_img, cv2.COLOR_BGR2RGB))
        # plt.show()
        input_datas = self.preprocess(imgs)
        results = []
        for input_data in input_datas:
            self.input_handle.reshape((1, 3, 128, 128))
            self.input_handle.copy_from_cpu(np.ascontiguousarray(np.expand_dims(input_data, 0), np.float32))
            self.predictor.run()
            results.append(self.output_handle.copy_to_cpu())
        return np.array(results)

将代码改成了这样发现成功率更低了。。
这里使用的predictor模型是Paddle官方模型库中的Metric Learning模型的resnet50

qvk1mo1f

qvk1mo1f10#

可能和cpu下使用模型有关? 每次重新打开IDE都成功几率更大

相关问题