docker Vertex AI -展开失败

kd3sttzy  于 2022-11-03  发布在  Docker
关注(0)|答案(2)|浏览(202)

我正在尝试使用自定义容器来部署我的自定义训练模型,即从我创建的模型创建一个端点。我正在AI平台上做同样的事情(相同的模型和容器),它在那里工作得很好。
在第一次尝试时,我成功地部署了模型,但从那以后,每当我尝试创建一个端点时,它都会显示“正在部署”1个多小时,然后它会失败,并出现以下错误:

google.api_core.exceptions.FailedPrecondition: 400 Error: model server never became ready. Please validate that your model file or container configuration are valid. Model server logs can be found at (link)

该日志显示以下内容:


* Running on all addresses (0.0.0.0)

 WARNING: This is a development server. Do not use it in a production deployment.

* Running on http://127.0.0.1:8080

[05/Jul/2022 12:00:37] "[33mGET /v1/endpoints/1/deployedModels/2025850174177280000 HTTP/1.1[0m" 404 -
[05/Jul/2022 12:00:38] "[33mGET /v1/endpoints/1/deployedModels/2025850174177280000 HTTP/1.1[0m" 404 -

其中最后一行被垃圾邮件发送,直到它最终失败。
我的 flask 应用程序如下:

import base64
import os.path
import pickle
from typing import Dict, Any
from flask import Flask, request, jsonify
from streamliner.models.general_model import GeneralModel

class Predictor:
    def __init__(self, model: GeneralModel):
        self._model = model

    def predict(self, instance: str) -> Dict[str, Any]:
        decoded_pickle = base64.b64decode(instance)
        features_df = pickle.loads(decoded_pickle)
        prediction = self._model.predict(features_df).tolist()
        return {"prediction": prediction}

app = Flask(__name__)
with open('./model.pkl', 'rb') as model_file:
    model = pickle.load(model_file)
    predictor = Predictor(model=model)

@app.route("/predict", methods=['POST'])
def predict() -> Any:
    if request.method == "POST":
        instance = request.get_json()
        instance = instance['instances'][0]
        predictions = predictor.predict(instance)
        return jsonify(predictions)

@app.route("/health")
def health() -> str:
    return "ok"

if __name__ == '__main__':
    port = int(os.environ.get("PORT", 8080))
    app.run(host='0.0.0.0', port=port)

我通过Python执行的部署代码是不相关的,因为当我通过GCP的UI进行部署时,问题仍然存在。
模型创建代码如下:

def upload_model(self):
    model = {
        "name": self.model_name_on_platform,
        "display_name": self.model_name_on_platform,
        "version_aliases": ["default", self.run_id],
        "container_spec": {
            "image_uri": f'{REGION}-docker.pkg.dev/{GCP_PROJECT_ID}/{self.repository_name}/{self.run_id}',
            "predict_route": "/predict",
            "health_route": "/health",
        },
    }
    parent = self.model_service_client.common_location_path(project=GCP_PROJECT_ID, location=REGION)
    model_path = self.model_service_client.model_path(project=GCP_PROJECT_ID,
                                                      location=REGION,
                                                      model=self.model_name_on_platform)
    upload_model_request_specifications = {'parent': parent, 'model': model,
                                           'model_id': self.model_name_on_platform}
    try:
        print("trying to get model")
        self.get_model(model_path=model_path)
    except NotFound:
        print("didn't find model, creating a new one")
    else:
        print("found an existing model, creating a new version under it")
        upload_model_request_specifications['parent_model'] = model_path
    upload_model_request = model_service.UploadModelRequest(upload_model_request_specifications)
    response = self.model_service_client.upload_model(request=upload_model_request, timeout=1800)
    print("Long running operation:", response.operation.name)
    upload_model_response = response.result(timeout=1800)
    print("upload_model_response:", upload_model_response)

我的问题非常接近this one,不同的是我确实有一个健康检查。
为什么它会在第一次部署时工作,从那以后就失败了?为什么它会在AI平台上工作,但在Vertex AI上失败?

zaqlnxep

zaqlnxep1#

此问题可能是由于不同的原因造成的:
1.验证容器配置端口,它应该使用端口8080。此配置非常重要,因为Vertex AI会将活动检查、健康检查和预测请求发送到容器上的此端口。您可以查看此文档中关于容器的内容,以及此文档中关于custom containers的内容。
1.另一个可能的原因是quota limits,它可能需要增加。
1.在health和predicate route中使用您正在使用的MODEL_NAME。

"predict_route": "/v1/models/MODEL_NAME:predict",
 "health_route": "/v1/models/MODEL_NAME",

1.验证您使用的帐户是否具有足够的权限来读取项目的GCS存储桶。
1.验证模型位置,应为正确的路径。
如果以上任何一个建议有效,就需要通过创建Support Case来联系GCP支持来修复它。如果不使用内部GCP资源,社区就不可能解决它

8gsdolmq

8gsdolmq2#

如果你还没有找到一个解决方案,你可以尝试自定义预测例程。它们真的很有帮助,因为它们去掉了编写代码的服务器部分的必要性,让我们可以专注于ml模型的逻辑和任何类型的预处理或后处理。这里是帮助你的链接https://codelabs.developers.google.com/vertex-cpr-sklearn#0。希望这对你有帮助。

相关问题