PaddlePaddle / models

Officially maintained, supported by PaddlePaddle, including CV, NLP, Speech, Rec, TS, big models and so on.
Apache License 2.0
6.92k stars 2.91k forks source link

分类 评估预测 结果和 部署预测结果不一致 #4156

Open chliang opened 4 years ago

chliang commented 4 years ago

models/PaddleCV/image_classification/ 中 infer.py 的结果 和 predict.py 的结果 不一致,其中 predict.py 用的模型是 infer.py用的模型固化后的模型 paddlepaddle-gpu 1.6.2.post97 模型 Xception41, Xception65, Xception71

littletomatodonkey commented 4 years ago

可以直接贴代码或者问题吗?这边显示图片挂掉了~

chliang commented 4 years ago

可以直接贴代码或者问题吗?这边显示图片挂掉了~

models/PaddleCV/image_classification/ 中 infer.py 的结果 和 predict.py 的结果 不一致,其中 predict.py 用的模型是 infer.py用的模型固化后的模型 paddlepaddle-gpu 1.6.2.post97 模型 Xception41, Xception65, Xception71

littletomatodonkey commented 4 years ago

您好,感谢您的反馈,可以将下面的 https://github.com/PaddlePaddle/models/blob/b587334f24be09e7c1ea24139a930fc4d5ba77c2/PaddleCV/image_classification/predict.py#L110 修改为

predictor = create_paddle_predictor(config.to_native_config())

来避免这个问题~

littletomatodonkey commented 4 years ago

您好,感谢您的反馈,可以将下面的 https://github.com/PaddlePaddle/models/blob/b587334f24be09e7c1ea24139a930fc4d5ba77c2/PaddleCV/image_classification/predict.py#L110

修改为

predictor = create_paddle_predictor(config.to_native_config())

来避免这个问题~

这么改确实解决了,现在结果对齐了。 但是为什么要这么改呢,为什么 其他的模型没有问题 Xception系列不对呢

感谢您的关注,正在排查这个问题~有结论第一时间回复您

littletomatodonkey commented 4 years ago

您好,感谢您的反馈,可以将下面的 https://github.com/PaddlePaddle/models/blob/b587334f24be09e7c1ea24139a930fc4d5ba77c2/PaddleCV/image_classification/predict.py#L110

修改为

predictor = create_paddle_predictor(config.to_native_config())

来避免这个问题~

这么改确实解决了,现在结果对齐了。 但是为什么要这么改呢,为什么 其他的模型没有问题 Xception系列不对呢

感谢您的关注,正在排查这个问题~有结论第一时间回复您

好的,C++预测代码,这么改的话(predictor = create_paddle_predictor(config.to_native_config()))程序崩溃。

C++的话,需要修改为ToNativeConfig函数,可以参考 https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/pybind/inference_api.cc#L443

FrostML commented 4 years ago

关于这个问题,目前有以下的方法可以解决: Python:

predictor = create_paddle_predictor(config.to_native_config()) # 预测时将不会使用任何pass

或者是: 可以使用 最新的develop 编的whl包,使用一个新加的python接口,

config.delete_pass("conv_elementwise_add_fuse_pass") # 预测时,只是不使用这个pass

C++预测代码可以这么写:

auto predictor = CreatePaddlePredictor(config.ToNativeConfig()); // 预测时将不会使用任何pass

或者是:

config.pass_builder()->DeletePass("conv_elementwise_add_fuse_pass"); // 预测时,只是不使用这个pass
auto predictor = CreatePaddlePredictor(config);

python是封装的C++的API,C++崩溃可以确认下gcc版本是否是一致。

结果无法对齐的原因查到是conv_elementwise_add_fuse_pass被不支持的fuse pattern触发了导致,已经提交PR修复。 详见Paddle #22124

chliang commented 4 years ago

关于这个问题,目前有以下的方法可以解决: Python:

predictor = create_paddle_predictor(config.to_native_config()) # 预测时将不会使用任何pass

或者是: 可以使用 最新的develop 编的whl包,使用一个新加的python接口,

config.delete_pass("conv_elementwise_add_fuse_pass") # 预测时,只是不使用这个pass

C++预测代码可以这么写:

auto predictor = CreatePaddlePredictor(config.ToNativeConfig()); // 预测时将不会使用任何pass

或者是:

config.pass_builder()->DeletePass("conv_elementwise_add_fuse_pass"); // 预测时,只是不使用这个pass
auto predictor = CreatePaddlePredictor(config);

python是封装的C++的API,C++崩溃可以确认下gcc版本是否是一致。

原因查到是conv_elementwise_add_fuse_pass被不支持的fuse pattern触发了导致,已经提交PR修复。 详见Paddle #22124

非常感谢,我有三个问题:

  1. 问题是否重现了呢,其他的模型没有问题 Xception系列不对
  2. C++和Python, 我都是使用 AnalysisPredictor 方式预测,Python 改为 predictor = create_paddle_predictor(config.to_native_config()) ,就能正常运行,而C++就报错。
  3. 如果用的 AnalysisPredictor 方式预测 ,配置文件转换成 Native方式,这样使用没有问题吗?
FrostML commented 4 years ago

“问题是否重现了呢,其他的模型没有问题 Xception系列不对” 问题可以复现,已经提交PR修复,烦请查看上条回复最后的解释。

“配置文件转换成 Native方式” 请问指的是config.ToNativeConfig()?如果是这个意思,是没有问题的。ToNativeConfig()的作用只是在预测时候不会执行这些pass,采用与训练前向相同的方式计算模型结果。

“Python API可以,但C++报错” Python API封装的C++的API,如果Python API可以,可以查看下gcc的版本,官网提供的预测库是基于gcc482编译的,麻烦还是使用gcc482的环境编写cmake。 因C++端图片处理比较繁琐,或者也可以确认下输入的数据有无问题。 可以尝试下载官网提供的C++预测的sample,链接,可以作为编写cmake的参考;也可以通过测试样例确认下环境是否有问题;或者直接修改测试样例,运行Xception的模型。官网C++预测库API使用文档说明可以参考链接

FrostML commented 4 years ago

可以麻烦提供下您C++预测的代码么?熟悉Windows的同事稍后会和您讨论一下 @silingtong123

silingtong123 commented 4 years ago
  1. 根据你的代码中的copy_from_cpu函数,确认是否使用的zerocopytensor进行预测?zerocopytensor目前只支持使用analysisConfig进行预测,使用ToNativeConfig()将使用NativeConfig,目前NativeConfig不支持zerocopytensor

  2. 若使用普通PaddleTensor进行预测,则需要config.SwitchUseFeedFetchOps(false);这个需要修改为true,只有在使用zerocopytensor时才设置为false,之后应避免使用zerocopytensor相关接口

  3. 请提供本地能复现的该问题demo

silingtong123 commented 4 years ago

请看上一条回复的内容,NativeConfig的使用请参考:https://github.com/PaddlePaddle/Paddle/blob/develop/paddle/fluid/inference/api/demo_ci/vis_demo.cc