tensorflow_model_server Access-Control-Allow-Origin

tensorflow_model_server Access-Control-Allow-Origin

我想设置一个 TensorFlow Serving 端点,它可以像 API 一样从 不同的源域 访问。我已成功导出模型,并且可以通过 curl 中的 POST 请求获得预测。但是,当我尝试在浏览器中获取预测时,请求被阻止,因为 TensorFlow Serving 不 return Access-Control-Allow-Origin header.

我正在按照 https://www.tensorflow.org/serving/docker 中的说明使用 tensorflow/serving docker 图像。 (我知道这在内部使用 tensorflow_model_serving,而后者又构建在 gRPC 之上。)

这是来自 Chrome 的错误:

Failed to load http://<TensorFlow Serving Domain>/v1/models/<Model Name>:predict: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8000' is therefore not allowed access.

那么,有没有办法让 TensorFlow Serving 达到 return 和 Access-Control-Allow-Origin header?

暂时没有。您可能需要考虑让代理处理请求,这样它才能符合您的环境。这也将允许负载平衡、URL 重写、安全连接等,您可能需要。

当我尝试从 JS 调用 TensorFlow-serving 的预测 API(使用 fetch 命令)时,我遇到了同样的问题。我在网上找不到任何方法来编辑 Tensorflow-Serving 本身的 CORS 设置。

解法:

我可以通过添加一层 Flask 作为后端来解决这个问题

所以最终的架构变成了这样:

HTML + JS <---> Flask <---> Tensorflow Serving (Docker)

Flask 后端随后使用 requests 等库调用 Tensorflow Serving API。 这个附加层也可以用于 Python 中输入的预处理(如果需要的话)。

代码看起来像这样:

  1. JS(前端):
await fetch("http://<localhost/website-name>/predict", settings).then(response => response.json()).then(
   function (response) {
       console.log("Prediction response: ", response)
   })

  1. 烧瓶(后端):
@app.route("/predict", methods=['GET', 'POST'])
def predict():
    data = loads(request.data.decode(encoding="ascii"))

    # Do something with data, maybe preprocessing

    raw = "{\"instances\":[["
    for key, value in data.items():
        raw = raw + data[key] + ","
    raw = raw[:-1]
    raw = raw + "]]}"
    print(raw)

    url = "http://<TensorFlow Serving Domain>/v1/models/<Model Name>:predict"
    headers = {
        'Content-Type': 'text/plain'
    }
    response = requests.request("POST", url, headers=headers, data=raw)
    res_json=response.json()
    return res_json

我在这里的一个项目中使用过它:Link

随时查看!

对于开发人员,您可以使用 Chrome extension 来禁用烦人的 CORS 检查。

对于生产,您需要使用 nginx/envoy 或类似的方法将请求代理到 TF Serving。