在 Vertex AI 中将多个模型部署到同一端点
Posted
技术标签:
【中文标题】在 Vertex AI 中将多个模型部署到同一端点【英文标题】:Deploying multiple models to same endpoint in Vertex AI 【发布时间】:2021-12-21 00:34:34 【问题描述】:我们的用例如下: 我们有多个自定义训练模型(数百个,随着我们允许应用程序的用户通过 UI 创建模型,然后我们在运行中训练和部署模型,数量会增加),因此将每个模型部署到单独的端点是与 Vertex AI charges per node used 一样昂贵。基于documentation,我们似乎可以将不同类型的模型部署到同一个端点,但我不确定这将如何工作。假设我使用自定义容器部署了 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 不会将所有请求发送到所有模型,否则流量拆分将没有意义)。然后如何将多个模型部署到同一个端点并确保每个预测请求都得到服务?
【问题讨论】:
您的延迟要求是什么?你可以有多少请求? 它会有所不同,对于一些可能是几分钟,对于一些,它是几秒钟,所以我们不能仅仅使用批量预测。请求的数量最终会因用户而异。 你有多少种模式?超过100个?您想通过 Vertex AI 自定义模型服务为他们提供服务,对吗? 是的,超过 100 个模型,都将通过自定义模型服务提供服务。 Here 来源。我不知道这是软限制还是硬限制;但是在我以前的公司中我们从来没有能够增加它,我写了那个 Cloud Run 包装:medium.com/google-cloud/… 【参考方案1】:documentation 讨论了一个用例,其中 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]
【讨论】:
好的,所以每个模型,无论是相同类型还是不同类型,都部署到自己的独立节点并独立扩展,这确实是不切实际的使用。是的,我已经使用了与您提到的类似的东西,只是我没有将模型存储在容器中,而是将它们存储在云存储中,然后使用自定义预测容器部署单个“虚拟”模型。当我需要预测时,我会在参数字段中传递相关的模型信息。如果我需要一个新模型,我只需将它存储在云存储中,这样我就不必重建容器进行预测。 嗨@racerX。感谢您分享您的解决方法。如果我的回答解决了您的问题,请考虑接受。如果没有,请告诉我,以便我改进答案。 @racerX 但我假设当您将新模型作为参数传递时,会有一个步骤从 GCS 获取模型。它会被缓存一次,还是下载步骤何时发生? 每次需要预测时,您都可以简单地从 gcs 获取模型工件。不确定这是否会导致性能问题,但如果确实如此,您可以将其复制到容器存储本身。然后下一次,您可以先检查模型是否在容器中可用。您还可以将所有模型缓存在内存中的字典中,并且仅在模型不可用时(从 gcs 或容器存储)获取。 是的,情况正是如此。我试图在没有缓存的情况下获取它,它导致了性能问题。这就是我问的原因。但也许我需要从一开始就考虑缓存使它们在容器中可用。谢谢。以上是关于在 Vertex AI 中将多个模型部署到同一端点的主要内容,如果未能解决你的问题,请参考以下文章
Vertex AI 自定义预测与 Google Kubernetes Engine
Vertex AI - ModelDeployOp(...) 上没有名为“google_cloud_pipeline_components.remote”的模块