PaddleRec icon indicating copy to clipboard operation
PaddleRec copied to clipboard

logic_regression模型save_inference_model的时候报错dense_input参数不存在

Open tfft2126 opened this issue 3 years ago • 9 comments

经过调试发现是函数def _prune_with_input(self, feeded_var_names, targets)保存的模型里面把一些变量都移除了.原因未知,dll无法调试 只剩下了两个变量 var label : LOD_TENSOR.shape(-1, 1).dtype(int64).stop_gradient(True) var save_infer_model/scale_0.tmp_0 : LOD_TENSOR.shape(-1, 1).dtype(int64).stop_gradient(False) 下面是堆栈 Traceback (most recent call last): File ".\PaddleRec-master\tools\static_trainer.py", line 288, in main(args) File ".\PaddleRec-master\tools\static_trainer.py", line 220, in main fetchvars, exe) File "D:\workspace_cm\MagicCubeServer\kibana\stat\PaddleRec-master\tools\utils\save_load.py", line 81, in save_inference_model executor=exe) File "", line 2, in save_inference_model File "D:\Program Files\Python37\lib\site-packages\paddle\fluid\wrapped_decorator.py", line 25, in impl return wrapped_func(*args, **kwargs) File "D:\Program Files\Python37\lib\site-packages\paddle\fluid\framework.py", line 238, in impl return func(*args, **kwargs) File "D:\Program Files\Python37\lib\site-packages\paddle\static\io.py", line 514, in save_inference_model program = normalize_program(program, feed_vars, fetch_vars) File "D:\Program Files\Python37\lib\site-packages\paddle\static\io.py", line 218, in normalize_program prepend_feed_ops(copy_program, feed_var_names) File "D:\Program Files\Python37\lib\site-packages\paddle\fluid\io.py", line 1218, in prepend_feed_ops i=i, name=name)) ValueError: The feeded_var_names[0]: 'dense_input' doesn't exist in pruned inference program. Please check whether 'dense_input' is a valid feed_var name, or remove it from feeded_var_names if 'dense_input' is not involved in the target_vars calculation.

tfft2126 avatar Mar 17 '22 09:03 tfft2126

config.ymal 新增了

use inference save model

use_inference: True # 静态图训练时保存为inference model save_inference_feed_varnames: ["dense_input", "sparse_input"] # inference model 的feed参数的名字 save_inference_fetch_varnames: ["label"] # inference model 的fetch参数的名字

tfft2126 avatar Mar 17 '22 09:03 tfft2126

“or remove it from feeded_var_names if 'dense_input' is not involved in the target_vars calculation” 就像报错中说的这样,save_inference_model接口会根据fetch_varnames来裁剪组网,如果feed进来的变量对于输出fetch变量没有帮助,就会被裁剪掉并报错。您需要调整save_inference_fetch_varnames中的参数以正确裁剪组网

yinhaofeng avatar Mar 18 '22 03:03 yinhaofeng

“or remove it from feeded_var_names if 'dense_input' is not involved in the target_vars calculation” 就像报错中说的这样,save_inference_model接口会根据fetch_varnames来裁剪组网,如果feed进来的变量对于输出fetch变量没有帮助,就会被裁剪掉并报错。您需要调整save_inference_fetch_varnames中的参数以正确裁剪组网

可是组网的逻辑是paddlerec的原始代码,我看不出来为什么feed进来的变量会对fetch变量没有帮助,反而裁剪完之后的变量更奇怪一些,都已经没有input了,我尝试了把fetch变量改成save_infer_model/scale_0.tmp_0,也得到是一样的结果

tfft2126 avatar Mar 18 '22 03:03 tfft2126

因为您fetch所需要的变量仅仅是label,就算没有组网label也是直接在数据集中的。所以在裁剪的时候,可能直接将全部的组网裁掉了

yinhaofeng avatar Mar 18 '22 03:03 yinhaofeng

您需要梳理一下组网的逻辑,确保写在save_inference_fetch_varnames中的输出,需要且仅需要save_inference_feed_varnames中的输入就可经过组网计算获得。

yinhaofeng avatar Mar 18 '22 03:03 yinhaofeng

您需要梳理一下组网的逻辑,确保写在save_inference_fetch_varnames中的输出,需要且仅需要save_inference_feed_varnames中的输入就可经过组网计算获得。

您的意思我明白了,label确实是已经在组网中的,我想问一下我该如何选取呢,我需要的值是最后sigmoid计算的结果。请问是选择sigmoid_0.tmp_0这个变量吗

tfft2126 avatar Mar 18 '22 03:03 tfft2126

是的,需要填var名,不是变量名

yinhaofeng avatar Mar 18 '22 06:03 yinhaofeng

是的,需要填var名,不是变量名

我把save_inference_fetch_varnames的参数改成了["sigmoid_0.tmp_0"],可以正常生成预测模型了,但是最终生成的服务proto和我想象的不太一样,并没有出现sigmoid_0.tmp_0,而是save_infer_model/scale_0.tmp_2,请问是哪一步有问题吗?下面是serving_server_conf.prototxt feed_var { name: "dense_input" alias_name: "dense_input" is_lod_tensor: false feed_type: 1 shape: 24 } feed_var { name: "sparse_input" alias_name: "sparse_input" is_lod_tensor: false feed_type: 0 shape: 24 } fetch_var { name: "save_infer_model/scale_0.tmp_2" alias_name: "save_infer_model/scale_0.tmp_2" is_lod_tensor: false fetch_type: 1 shape: 1 }

这个是生成的程序 serving_io.inference_model_to_serving("output_model_lr/2", serving_server="serving_server", serving_client="serving_client", model_filename="rec_inference.pdmodel", params_filename="rec_inference.pdiparams")

tfft2126 avatar Mar 18 '22 06:03 tfft2126

是的,需要填var名,不是变量名

我把save_inference_fetch_varnames的参数改成了["sigmoid_0.tmp_0"],可以正常生成预测模型了,但是最终生成的服务proto和我想象的不太一样,并没有出现sigmoid_0.tmp_0,而是save_infer_model/scale_0.tmp_2,请问是哪一步有问题吗?下面是serving_server_conf.prototxt feed_var { name: "dense_input" alias_name: "dense_input" is_lod_tensor: false feed_type: 1 shape: 24 } feed_var { name: "sparse_input" alias_name: "sparse_input" is_lod_tensor: false feed_type: 0 shape: 24 } fetch_var { name: "save_infer_model/scale_0.tmp_2" alias_name: "save_infer_model/scale_0.tmp_2" is_lod_tensor: false fetch_type: 1 shape: 1 }

这个是生成的程序 serving_io.inference_model_to_serving("output_model_lr/2", serving_server="serving_server", serving_client="serving_client", model_filename="rec_inference.pdmodel", params_filename="rec_inference.pdiparams")

遇到类似问题,请问解决了吗,另外您知道如何导出动态batch吗

Hoonly avatar Oct 28 '22 06:10 Hoonly