You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vertex AI自定义容器部署失败 模型服务未就绪404报错排查

问题解答

为什么首次部署能成,后面全失败

根本原因是Vertex AI在2022年7月前后(即你日志记录的时间点)全量上线了自定义容器的新增就绪校验规则,你第一次部署刚好赶在规则上线前跑完了流程,所以能成功,后续部署就会被新规则卡住:

  • 新规则下,平台除了检查你配置的/health健康路由,还会持续向/v1/endpoints/{endpoint_id}/deployedModels/{deployed_model_id}这个Vertex标准资源路径发送GET请求做探活
  • 你写的Flask服务没有配置这个路径的处理逻辑,请求过来全返回404,平台就一直判定服务未就绪,卡满1小时超时就抛出“model server never became ready”的错误
  • 你日志里反复打印的404记录,全是平台发的探活请求,不是业务侧的真实请求
    另外你直接用Flask自带的开发服务器跑服务也会放大这个问题:这个开发服务器是单线程阻塞模式,只要模型加载稍慢、或者有请求卡住,就无法响应探活,很容易触发平台超时判定。

为什么同样的配置在旧AI Platform能正常运行,在Vertex AI就部署失败

两个平台对自定义容器的校验逻辑完全不同:

  • 旧版AI Platform(Classic版本)校验逻辑非常简单,只认你手动配置的预测路由和健康路由,只要这两个路径能正常返回200状态码就通过校验,不会额外发送其他路径的探活请求,你的服务完全符合要求
  • Vertex AI是重构后的新版平台,默认会把所有/v1/*前缀的请求全转发到你的容器——不管是平台内部的探活请求,还是走标准REST API过来的预测请求,只要这些路径返回4xx、5xx错误,平台就会判定服务异常。

修复方法
  • 给Flask服务添加通配GET路由,对所有未明确定义的GET请求统一返回200状态码,满足平台探活要求,可直接添加如下代码:
@app.route('/', defaults={'path': ''})
@app.route('/<path:path>', methods=['GET'])
def catch_all_get(path):
    return "ok", 200
  • 不要用Flask自带的开发服务器跑生产服务,换成gunicorn这类生产级WSGI服务器启动,避免单线程阻塞导致探活超时,启动命令参考:gunicorn --bind 0.0.0.0:8080 --workers 1 --threads 8 app:app
  • 每次上传模型新版本后,去控制台确认模型的容器配置中,predict_route和health_route确实为你设置的/predict和/health,避免版本继承旧配置导致路由不生效。

内容的提问来源于stack exchange,提问作者Roee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:27:22