Vertex AI部署自定义Flask预测容器失败问题排查求助
Vertex AI 自定义容器部署失败排查思路
1. 先排查最明显的配置错误
- 端口不匹配问题:你的Dockerfile中
EXPOSE 5050,但gunicorn绑定的端口是0.0.0.0:5000,二者完全不匹配,Vertex AI的健康检查和流量转发都会失败。整改方案:统一端口,比如将EXPOSE改为EXPOSE 5000,或者把gunicorn的绑定端口改为5050。 - 缺少健康检查接口:Vertex AI部署自定义容器时,默认会定时向容器发送GET请求校验服务可用性,你当前的Flask应用没有实现
/health(或你指定的健康检查路由)接口,服务会被判定为启动失败。需要在app.py中新增如下路由:
@app.route('/health', methods=['GET']) def health_check(): return 'OK', 200
2. 应用逻辑性能问题
- 模型加载逻辑错误:你现在把
tensorflow.keras.models.load_model('model')、pickle.load(open('tokenizer.pkl','rb'))都放在predict接口内部,每次请求都会重新加载模型和分词器,不仅性能极低、内存占用飙升,还会直接导致首次请求超时,甚至容器OOM崩溃。整改方案:将模型、分词器加载逻辑移到全局,服务启动时就完成加载:
# app.py 全局位置,放在接口定义之前 import pickle model = tensorflow.keras.models.load_model('model') tokenizer = pickle.load(open('tokenizer.pkl','rb'))
同时pre_process.py的preprocess_tokenizing方法要修改为接收全局传入的tokenizer,不要每次都读pkl文件。
- 分词器逻辑错误:pre_process.py的preprocess_tokenizing方法中,你对传入的单条文本再次执行了
tokenizer.fit_on_texts([text]),会覆盖训练好的分词器词表,导致预测结果完全错误,该逻辑需要删除,直接用加载好的训练阶段的分词器做texts_to_sequences即可。 - gunicorn超时配置不足:TensorFlow模型加载本身耗时较长,默认gunicorn 30秒超时会直接被kill,需要在Dockerfile的CMD中增加超时参数,比如调整为120秒:
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "--timeout", "120", "app:app"]
3. Vertex AI 部署配置校验
- 资源配置不足:TensorFlow 2.6运行需要至少2核4G内存,如果你给端点分配的CPU、内存规格过低,容器会因为OOM被系统 kill,导致部署超时失败,建议先选择
n1-standard-4这类规格测试。 - 路由和端口配置错误:在Vertex AI创建模型、部署到端点时,需要手动指定:
- 预测路由:
/predict - 健康检查路由:
/health - 服务端口:和gunicorn绑定的端口一致,比如5000
- 预测路由:
- 镜像权限问题:确认你构建的镜像已经推送到GCP的Artifact Registry或Container Registry,并且Vertex AI的服务账号有该镜像的拉取权限。
4. 路径与权限校验
- 确认
model文件夹、tokenizer.pkl文件已经被正确COPY到镜像的/app目录下,相对路径读取正常,没有文件权限不足的问题。
内容的提问来源于stack exchange,提问作者Piyush Pandey
相关产品推荐
相关产品推荐

