PaddlePaddle / Paddle

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

部署在线服务报错,使用load_inference_model可以成功 #23806

Closed hubu-wangpei closed 4 years ago

hubu-wangpei commented 4 years ago

paddle1.7版本 使用load_inference_model,加载自己保存的模型,成功。使用load_inference_model加载模型的代码如下,模型输入数据为256×256大小的pgm灰度图像,输入Tensor Shape为[1,1,256,256]

from paddle.fluid.dygraph import  TracedLayer
import cv2
import random
import numpy as np
from scipy import misc
import os
import paddle
import paddle.fluid as fluid
from paddle.fluid.layer_helper import LayerHelper
from paddle.fluid.dygraph.nn import Conv2D, Pool2D, BatchNorm, Linear
from paddle.fluid.dygraph.base import to_variable
from paddle.fluid.initializer import NumpyArrayInitializer
def data_loader(filename):
    filethpath="/home/aistudio/suni/test"
    full_filename = os.path.join(filethpath, filename)
    img = misc.imread(full_filename,0)
    img = img[np.newaxis, :]
    img = img[np.newaxis, :]
    img = img.astype('float32')
    return img
place = fluid.CPUPlace()
main_prog = fluid.Program()
startup_prog = fluid.Program()
exe = fluid.Executor(place)
exe.run(startup_prog)
path = "./saved_infer_model"
filename="6_0.pgm"
img = data_loader(filename)
[inference_program, feed_target_names, fetch_targets] = (fluid.io.load_inference_model(dirname=path, executor=exe))

results = exe.run(inference_program,
          feed={feed_target_names[0]: img},
          fetch_list=fetch_targets)
print(results)
print(feed_target_names)

但是使用在线部署的时候报错

Traceback (most recent call last):
  File "/home/work/serving/webserver/home/views.py", line 48, in index
    out = serving.infer(json.loads(req))
  File "/home/work/serving/webserver/home/serving.py", line 24, in infer
    return_numpy=False
  File "/usr/local/lib/python3.5/site-packages/paddle/fluid/executor.py", line 657, in run
    use_program_cache=use_program_cache)
  File "/usr/local/lib/python3.5/site-packages/paddle/fluid/executor.py", line 751, in _run
    fetch_var_name=fetch_var_name)
  File "/usr/local/lib/python3.5/site-packages/paddle/fluid/executor.py", line 419, in _add_feed_fetch_ops
    if not has_feed_operators(global_block, feed, feed_var_name):
  File "/usr/local/lib/python3.5/site-packages/paddle/fluid/executor.py", line 158, in has_feed_operators
    format(feed_target_name))
Exception: 'feed_targets' does not have feed_0 variable

预测时候的的数据转换器如下

# -*- coding: utf-8 -*-
"""
Hook
"""
import os
import sys

sys.path.append("..")
from PIL import Image

import numpy as np
import paddle.fluid as fluid

from home.utility import base64_to_image

def reader_infer(data_args):
    def reader():
        image_shape = [1, 1, 256,256]
        image = fluid.layers.data(name='image', shape=image_shape, dtype='float32')
        feeder = fluid.DataFeeder(place=fluid.CPUPlace(), feed_list=[image])
        img = base64_to_image(data_args["img"])
        img=np.array(img)
        img = img[np.newaxis, :]
        img = img[np.newaxis, :]
        img = img.astype('float32')
        return img,feeder
    return reader

"""
Hook
"""
def output(results, data_args):
    """
    示例为目标检测的输出hook
    将模型预测的结果,转换为直线坐标
    :param results 模型预测结果
    :param data_args: 接口传入的数据,以k-v形式
    :return array 需要能被json_encode的数据格式
    """

    lines = []
    for dt in results:
        lines.append(str(dt))
    return lines
zhhsplendid commented 4 years ago

嗨,请问feed_target_names需要的所有数据都feed了吗?看代码只feed了feed_target_names[0],因此我不确定你的feed_target_names长度是否是1. 可以看看是否有别的eed_target_names而你部署feed时没有使用。有可能需要feed的数据你没有全提供而报这个错。

hubu-wangpei commented 4 years ago

嗨,请问feed_target_names需要的所有数据都feed了吗?看代码只feed了feed_target_names[0],因此我不确定你的feed_target_names长度是否是1. 可以看看是否有别的eed_target_names而你部署feed时没有使用。有可能需要feed的数据你没有全提供而报这个错。

只有这一个数据需要feed,我在notebook里跑是没问题的 image

hubu-wangpei commented 4 years ago

嗨,请问feed_target_names需要的所有数据都feed了吗?看代码只feed了feed_target_names[0],因此我不确定你的feed_target_names长度是否是1. 可以看看是否有别的eed_target_names而你部署feed时没有使用。有可能需要feed的数据你没有全提供而报这个错。

是不是因为我这个模型是从动态图转换成静态图,再保存预测模型的原因?

zhhsplendid commented 4 years ago

动态图静态图请分别用相应方式保存,暂时不互串?

hubu-wangpei commented 4 years ago

动态图静态图请分别用相应方式保存,暂时不互串? 上次请教的,让这么用的,应该可以吧 image

zhhsplendid commented 4 years ago

哦,使用的是tracedlayer吗?notebook没有问题,但是自己的有问题,要不要试着看看是否安装版本/环境有可能出错呢?

hubu-wangpei commented 4 years ago

哦,使用的是tracedlayer吗?notebook没有问题,但是自己的有问题,要不要试着看看是否安装版本/环境有可能出错呢?

使用的Tracedlayer,都是用的AI Studio平台,应该不是版本的问题

zhhsplendid commented 4 years ago

嗨,注意到您自己close了issue,是自己已经解决了吗?我将继续保持此卡片为关闭状态,如果有更多问题可以reopen和追问