我正在尝试使用自定义容器来部署我的自定义训练模型,即从我创建的模型创建一个端点。我正在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上失败?
2条答案
按热度按时间zaqlnxep1#
此问题可能是由于不同的原因造成的:
1.验证容器配置端口,它应该使用端口8080。此配置非常重要,因为Vertex AI会将活动检查、健康检查和预测请求发送到容器上的此端口。您可以查看此文档中关于容器的内容,以及此文档中关于custom containers的内容。
1.另一个可能的原因是quota limits,它可能需要增加。
1.在health和predicate route中使用您正在使用的MODEL_NAME。
1.验证您使用的帐户是否具有足够的权限来读取项目的GCS存储桶。
1.验证模型位置,应为正确的路径。
如果以上任何一个建议有效,就需要通过创建Support Case来联系GCP支持来修复它。如果不使用内部GCP资源,社区就不可能解决它
8gsdolmq2#
如果你还没有找到一个解决方案,你可以尝试自定义预测例程。它们真的很有帮助,因为它们去掉了编写代码的服务器部分的必要性,让我们可以专注于ml模型的逻辑和任何类型的预处理或后处理。这里是帮助你的链接https://codelabs.developers.google.com/vertex-cpr-sklearn#0。希望这对你有帮助。