【问题标题】:tensorflow_model_server Access-Control-Allow-Origintensorflow_model_server 访问控制允许来源
【发布时间】:2019-01-07 23:50:34
【问题描述】:

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

我正在按照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 返回一个 Access-Control-Allow-Origin 标头?

【问题讨论】:

  • 你最终是如何解决这个问题的?

标签: cors tensorflow-serving


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    当我尝试从 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. Flask(后端):
    @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

    欢迎来看看!

    【讨论】:

      【解决方案3】:

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

      生产需要使用nginx/envoy等代理请求到TF Serving。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-02
        • 2017-12-15
        • 2016-08-18
        • 2022-01-09
        • 2013-07-04
        • 2012-11-05
        相关资源
        最近更新 更多