当前位置: 首页 > 知识库问答 >
问题:

无法使用部署的TF BERT模型从SavedModel获取GCloud在线预测:“错误请求”错误

柯默
2023-03-14
def serving_input_fn():
    receiver_tensors = {
        "input_ids": tf.placeholder(dtype=tf.int32, shape=[1, MAX_SEQ_LENGTH])
    }

    features = {
        "input_ids": receiver_tensors['input_ids'],
        "input_mask": 1 - tf.cast(tf.equal(receiver_tensors['input_ids'], 0), dtype=tf.int32),
        "segment_ids": tf.zeros(dtype=tf.int32, shape=[1, MAX_SEQ_LENGTH]),
        "label_ids": tf.placeholder(tf.int32, [None], name='label_ids')
    }
    return tf.estimator.export.ServingInputReceiver(features, receiver_tensors)


estimator._export_to_tpu = False
estimator.export_saved_model("export", serving_input_fn)

然后,如果我尝试在本地使用保存的模型,它就可以工作了:

from tensorflow.contrib import predictor

predict_fn = predictor.from_saved_model("export/1575241274/")

print(predict_fn({
    "input_ids": [[101, 10468, 99304, 11496, 171, 112, 10176, 22873, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
}))

# {'probabilities': array([[-0.01023898, -4.5866656 ]], dtype=float32), 'labels': 0}

然后,我将SavedModel上传到一个bucket,并在gcloud上创建了一个模型和一个模型版本:

gcloud alpha ai-platform versions create v1gpu --model [...] --origin=[...] --python-version=3.5 --runtime-version=1.14 --accelerator=^:^count=1:type=nvidia-tesla-k80 --machine-type n1-highcpu-4

没有问题,模型在控制台中部署并显示为工作状态。

import googleapiclient.discovery

service = googleapiclient.discovery.build('ml', 'v1')
name = 'projects/[project_name]/models/[model_name]/versions/v1gpu'

response = service.projects().predict(
        name=name,
        body={'instances': [{
    "input_ids": [[101, 10468, 99304, 11496, 171, 112, 10176, 22873, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
}]}
).execute()

print(response["predictions"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/dist-packages/googleapiclient/_helpers.py", line 130, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "/usr/local/lib/python3.6/dist-packages/googleapiclient/http.py", line 851, in execute
    raise HttpError(resp, content, uri=self.uri)
googleapiclient.errors.HttpError: <HttpError 400 when requesting https://ml.googleapis.com/v1/projects/[project_name]/models/[model_name]/versions/v1gpu:predict?alt=json returned "Bad Request">

“saved_model_cli show--dir 1575241274/--tag_set serve--signature_def serving_default”的输出:

The given SavedModel SignatureDef contains the following input(s):
  inputs['input_ids'] tensor_info:
      dtype: DT_INT32
      shape: (1, 128)
      name: Placeholder:0
The given SavedModel SignatureDef contains the following output(s):
  outputs['labels'] tensor_info:
      dtype: DT_INT32
      shape: ()
      name: loss/Squeeze:0
  outputs['probabilities'] tensor_info:
      dtype: DT_FLOAT
      shape: (1, 2)
      name: loss/LogSoftmax:0
Method name is: tensorflow/serving/predict

共有1个答案

孙震博
2023-03-14

发送到API的请求正文的形式如下:

{"instances": [<instance 1>, <instance 2>, ...]}

如文档中所述,我们需要以下内容:

{
    "instances": [
        <object>
        ...
    ]
}

在这种情况下,您有:

{ 
    "instances": [ 
        {
           "input_ids": 
             [ <object> ] 
        }

     ...
    ]
}
{  
    "instances": 
     [
        [101, 10468, 99304, 11496, 171, 112, 10176, 22873, 119, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
     ]
}
 类似资料:
  • 我在PartnerController类中创建了下一个savePartner()方法,如下所示: 我还添加了savePartner方法来改进界面: 当我在postman works(代码200)中执行post call时,但我在android-dios中调试了之前的调用,并获得了下一个错误: 响应{协议=超文本传输协议/1.1,代码=400,消息=错误请求, url=https://localho

  • V2.6.5 在Heroku上部署API后请求API时,我面临一个400错误的错误请求。但我不知道为什么? 我所做的: > 在/api的根目录中添加了Procfile 补充。htaccess in/api/public(通过composer需要symfony/apache-pack命令) Heroku Dashboard应用程序设置上定义的APP\u ENV和DATABASE\u URL 在Her

  • 问题内容: 我正在尝试使用Jquery发送Ajax POST请求,但是我遇到了400错误的请求错误。 这是我的代码: 它说:无法根据请求构建资源。我想念什么? 问题答案: 最后,我弄错了,原因是我需要对发送的JSON数据进行字符串化处理。我必须在XHR对象中设置内容类型和数据类型。所以正确的版本在这里: 可能会帮助别人。

  • 我收到错误: 错误类型错误: 无法读取在评估 (webpack-internal:///./node_modules/@angular/common/esm5/http.js:163) 处未定义的属性 “长度”在 Array.forEach () 在 httpHeaders.lazyInit (webpack-internal:///./node_modules/@angular/common/e

  • 我是js/handlebars的新手,我无法用VS代码显示来自我的home.hbs文件的图像。当我运行服务器时,我得到的是: 这是我的服务器代码: 我的“home.hbs”代码: get“错误特别声明 无法获取/public/img/logo.png 这是我所有的信息,任何帮助将非常感谢。

  • 在做了一些研究后,我发现这是一个CORS问题。我正在使用谷歌应用程序引擎与Python。这个错误是我可以修复的,还是API的bug?我已经设法用这个API做了一个POST请求,没有问题。我已经阅读了很多关于CORS的信息,但还没有找到解决这个问题的方法。 下面是GET请求的Javascript代码,它只是从Trello API复制/粘贴的,所以我不确定哪里出了问题: