ZenML+MLflow本地模型部署异常:服务启动后被终止
ZenML + MLflow本地部署服务启动后自动终止问题排查与解决
日志显示
mlflow_model_deployer_step已启动并更新现有部署服务,服务可访问地址为http://127.0.0.1:8000/invocations,但随后出现“Stopping existing services...”日志,最终提示“No MLflow prediction server is currently running”,WSL和Ubuntu系统均出现该问题。
可能原因及解决方案
1. 部署器生命周期配置导致自动停止
ZenML的MLflow部署器默认可能将服务设置为临时模式,pipeline运行结束后自动终止服务。
- 检查
deployment_pipeline.py中的部署步骤,确保添加serve_forever=True参数让服务持久运行:from zenml.integrations.mlflow.steps import mlflow_model_deployer_step deploy_step = mlflow_model_deployer_step( model=trained_model_output, deploy_decision=deploy_decision_output, serve_forever=True, # 强制服务持续运行 )
2. Pipeline主进程结束回收子进程
直接执行python run_deployment.py时,pipeline主进程结束会连带终止其启动的MLflow服务子进程。
- 改用ZenML CLI命令运行pipeline:
zenml pipeline run run_deployment.py - 或者在
run_deployment.py末尾添加阻塞逻辑,防止主进程退出:import time if __name__ == "__main__": # 执行pipeline代码... while True: time.sleep(3600) # 持续阻塞,保持服务运行
3. 部署器状态同步异常
ZenML部署器可能未正确识别服务状态,误触发清理操作。
- 手动检查MLflow服务进程是否存在:
ps aux | grep mlflow - 清理现有部署记录后重新部署:
zenml model-deployer delete --all
4. 端口冲突或权限问题
8000端口被占用会导致服务启动后立即崩溃,部署器检测到异常后执行停止操作。
- 检查端口占用情况:
lsof -i :8000 # Ubuntu/WSL环境 - 更换未被占用的端口,在部署步骤中指定:
deploy_step = mlflow_model_deployer_step( model=trained_model_output, deploy_decision=deploy_decision_output, port=8001, # 自定义未占用端口 serve_forever=True, ) - WSL环境下若出现权限问题,尝试用sudo运行部署命令:
sudo zenml pipeline run run_deployment.py
内容的提问来源于stack exchange,提问作者Aditya Anand
相关产品推荐
相关产品推荐

