在Google Cloud Vertex AI部署Docker容器无预测结果求助
在Google Cloud Vertex AI部署Docker容器后无法获取预测结果
我们尝试在Google Cloud Vertex AI上部署Docker容器,但每次向Vertex AI发送请求时,仅收到包含模型规格的响应,无法获取模型生成的预测结果。
以下是当前使用的代码:
app.py 代码
class PredictionHandler(tornado.web.RequestHandler): def __init__( self, application: "Application", request: tornado.httputil.HTTPServerRequest, **kwargs: Any ) -> None: super().__init__(application, request, **kwargs) def post(self): response_body = None try: response_body = json.dumps({'predictions': 'Prediction ran succsessfully'}) except Exception as e: response_body = json.dumps({'error:':str(e)}) self.set_header("Content-Type", "application/json") self.set_header("Content-Length", len(response_body)) self.write(response_body) self.finish() def make_app(): tornado_app = tornado.web.Application([('/health_check', HealthCheckHandler), ('/predict', PredictionHandler)], debug=False) tornado_app.listen(8080) print("Running App...") tornado.ioloop.IOLoop.current().start()
Dockerfile 代码
FROM python:3.8 RUN mkdir -p /app/model WORKDIR /app COPY requirements.txt /app/requirements.txt RUN pip3 install --no-cache-dir -r requirements.txt COPY app /app/ EXPOSE 8080 ENTRYPOINT ["python3", "app.py"]
问题分析与修复方案
Vertex AI预测服务对容器内的Web服务有明确的格式要求,当前代码存在几个关键问题:
- 缺失必要的处理器定义:代码中引用了
HealthCheckHandler但未实现,会导致服务启动失败 - 未处理请求体:Vertex AI会将预测输入数据放在POST请求体中,当前代码完全未读取和处理这部分内容
- 响应格式不符合要求:Vertex AI期望
predictions字段的值为数组类型,而非字符串 - 拼写错误与语法问题:
succsessfully拼写错误,error:键名多了冒号,且缺少脚本入口
修复后的app.py代码
import tornado.web import tornado.ioloop import json from typing import Any, Application class HealthCheckHandler(tornado.web.RequestHandler): def get(self): self.write("OK") self.finish() class PredictionHandler(tornado.web.RequestHandler): def __init__( self, application: "Application", request: tornado.httputil.HTTPServerRequest, **kwargs: Any ) -> None: super().__init__(application, request, **kwargs) def post(self): response_body = None try: # 读取Vertex AI发送的请求体数据 request_data = json.loads(self.request.body) # 这里替换为实际的模型预测逻辑,示例仅返回处理后的输入信息 prediction_result = ["Prediction ran successfully with input: " + str(request_data)] response_body = json.dumps({'predictions': prediction_result}) except Exception as e: response_body = json.dumps({'error': str(e)}) self.set_header("Content-Type", "application/json") self.set_header("Content-Length", str(len(response_body))) self.write(response_body) self.finish() def make_app(): tornado_app = tornado.web.Application([ ('/health_check', HealthCheckHandler), ('/predict', PredictionHandler) ], debug=False) tornado_app.listen(8080) print("Running App...") tornado.ioloop.IOLoop.current().start() if __name__ == "__main__": make_app()
配套要求
确保requirements.txt包含tornado依赖:
tornado>=6.0
部署验证步骤
- 重新构建Docker镜像并推送到Google Artifact Registry(或Container Registry)
- 在Vertex AI控制台重新创建模型端点,使用更新后的镜像
- 发送测试请求,请求体示例:
此时应收到包含预测结果数组的响应。{"instances": [{"input": "test_data"}]}
内容的提问来源于stack exchange,提问作者Jan Janiszewski
相关产品推荐
相关产品推荐

