0

我们的用例如下:我们有多个自定义训练模型(数百个,随着我们允许应用程序的用户通过 UI 创建模型,然后我们在运行中训练和部署模型,数量会增加),因此部署每个模型到一个单独的端点都是昂贵的,因为 Vertex AI对每个使用的节点收费。根据文档,我们似乎可以将不同类型的模型部署到同一个端点,但我不确定这将如何工作。假设我使用自定义容器部署了 2 个不同的自定义训练模型,用于预测到同一端点。另外,假设我将两个模型的流量分配指定为 50%。现在,我如何向特定模型发送请求?使用 python SDK,我们调用端点,如下所示:

from google.cloud import aiplatform
endpoint = aiplatform.Endpoint(endpoint_id)
prediction = endpoint.predict(instances=instances)

# where endpoint_id is the id of the endpoint and instances are the observations for which a prediction is required

我的理解是,在这种情况下,顶点 AI 将根据流量拆分将一些调用路由到一个模型,而将一些调用路由到另一个模型。我可以使用docs中指定的参数字段来指定模型,然后在自定义预测容器中相应地处理请求,但仍然有些调用最终会转到它无法处理的模型(因为Vertex AI 不会将所有请求发送到所有模型,否则流量拆分将没有意义)。然后,我如何将多个模型部署到同一个端点并确保每个预测请求都得到服务?

4

1 回答 1

1

文档讨论了一个用例,其中 2 个模型在同一特征集上进行训练并共享入口预测流量。正如您正确理解的那样,这不适用于在不同特征集上训练的模型,即不同的模型。

不幸的是,目前在 Vertex AI 中,仅使用一个节点将不同的模型部署到同一端点是不可能的。有一个正在进行的功能请求正在处理中。但是,我们无法提供该功能何时可用的确切预计到达时间。

我复制了多模型设置并注意到以下几点。

流量拆分

我将 2 个不同的模型部署到同一个端点并向其发送预测。我设置了一个 50-50 的流量拆分规则,并看到了暗示请求被发送到错误模型的错误。

成本优化

当多个模型部署到同一端点时,它们将部署到单独的独立节点。因此,您仍需为使用的每个节点付费。此外,节点自动缩放发生在模型级别,而不是端点级别。

一个可行的解决方法是将所有模型打包到一个容器中,并使用自定义 HTTP 服务器逻辑将预测请求发送到适当的模型。这可以使用parameters预测请求正文的字段来实现。自定义逻辑看起来像这样。

@app.post(os.environ['AIP_PREDICT_ROUTE'])
async def predict(request: Request):
    body = await request.json()
    parameters = body["parameters"]
    instances = body["instances"]
    inputs = np.asarray(instances)
    preprocessed_inputs = _preprocessor.preprocess(inputs)

    if(parameters["model_name"]=="random_forest"):
        print(parameters["model_name"])
        outputs = _random_forest_model.predict(preprocessed_inputs)
    else:
        print(parameters["model_name"])
        outputs = _decision_tree_model.predict(inputs)

    return {"predictions": [_class_names[class_num] for class_num in outputs]}
于 2021-11-08T20:54:50.010 回答