我们的用例如下:我们有多个自定义训练的模型(数百个,随着我们允许应用程序的用户通过UI创建模型,然后我们对其进行动态训练和部署,数量会增加(,因此将每个模型部署到一个单独的端点是昂贵的,因为Vertex AI对每个使用的节点收取费用。根据文档,我们似乎可以将不同类型的模型部署到同一个端点,但我不确定这将如何工作。假设我有两个不同的自定义训练模型,它们使用自定义容器部署到同一个端点进行预测。另外,假设我指定两个模型的流量分配为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会根据流量划分,将一些调用路由到一个模型,将一些呼叫路由到另一个模型。我可以使用文档中指定的参数字段来指定模型,然后在自定义预测容器中相应地处理请求,但仍然有一些调用最终会转到它无法处理的模型(因为Vertex AI不会将所有请求发送到所有模型,否则流量分割将没有意义(。然后,我如何将多个模型部署到同一个端点,并确保每个预测请求都能得到服务?
本文档讨论了一个用例,其中两个模型在同一特征集上进行训练,并共享入口预测流量。正如您正确理解的那样,这不适用于在不同特征集(即不同模型(上训练的模型。
不幸的是,目前在Vertex AI中,仅使用一个节点将不同的模型部署到同一个端点是不可能的。有一个正在处理的功能请求。但是,我们无法提供该功能何时可用的确切ETA。
我复制了多模型设置,并注意到以下几点。
流量拆分
我在同一个端点部署了两个不同的模型,并向其发送了预测。我设置了一个50-50的流量分配规则,发现了一些错误,这些错误意味着请求被发送到了错误的模型。
成本优化
当多个模型部署到同一个端点时,它们会部署到单独的独立节点。因此,您仍将为使用的每个节点收费。此外,节点自动缩放发生在模型级别,而不是端点级别。
一个可行的解决方案是将所有模型打包到一个容器中,并使用自定义HTTP服务器逻辑将预测请求发送到适当的模型。这可以使用预测请求主体的CCD_ 1字段来实现。自定义逻辑看起来是这样的。
@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]}