KServe从0.7升级至0.9后自定义MAR文件请求返回500错误
针对KServe从0.7升级到0.9后自定义PyTorch MAR文件推理返回500(连接拒绝)的问题,结合你提供的信息(Pod正常启动、官方示例运行正常、无直接tornado依赖),核心原因大概率集中在TorchServe版本兼容性或KServe代理与模型服务的通信配置上,以下是具体排查和解决步骤:
排查方向
1. 验证TorchServe内部服务是否正常监听端口
进入运行中的Pod,执行以下命令查看端口监听状态:
netstat -tulpn | grep torchserve # 或使用ss命令(若netstat未安装) ss -tulpn | grep torchserve
如果没有输出,说明TorchServe并未在预期端口(默认8080)启动,需进一步查看启动日志。
2. 检查TorchServe启动日志
查看Pod内TorchServe的启动日志,重点排查依赖冲突或启动失败信息:
# 查看容器标准输出 kubectl logs <pod-name> -c <predictor-container-name> # 或查看TorchServe的日志文件 kubectl exec -it <pod-name> -- cat /tmp/logs/ts_log.log
若日志中出现tornado相关的版本冲突或启动报错,说明MAR文件的间接依赖与KServe 0.9内置的TorchServe依赖版本不兼容(KServe 0.9升级了TorchServe版本,其依赖的tornado版本可能与你的MAR文件间接依赖的版本冲突)。
3. 核对RawDeployment的端口配置
检查你的InferenceService RawDeployment配置,确保容器端口与TorchServe实际监听端口一致:
apiVersion: serving.kserve.io/v1beta1 kind: InferenceService metadata: name: custom-model spec: predictor: rawDeployment: spec: template: spec: containers: - name: kserve-container image: your-custom-image ports: - containerPort: 8080 # 需与TorchServe推理端口一致 name: http protocol: TCP
KServe 0.9对RawDeployment的端口转发逻辑可能有调整,若TorchServe新版本修改了默认端口,需同步更新此处配置。
解决方法
1. 修复依赖兼容性问题
- 重新打包MAR文件:使用KServe 0.9对应的TorchServe版本重新打包模型,确保间接依赖(如tornado)与TorchServe内置版本兼容。你可以先拉取KServe 0.9的TorchServe镜像,查看其依赖版本:
docker run --rm kserve/torchserve:0.9.0 pip list | grep tornado
然后在打包MAR时,通过requirements.txt指定该版本的tornado。
- 覆盖依赖版本:在RawDeployment的容器配置中添加环境变量,强制安装兼容的tornado版本:
containers: - name: kserve-container image: your-custom-image env: - name: EXTRA_REQUIREMENTS value: "tornado==<兼容版本号>"
2. 显式指定TorchServe启动参数
在RawDeployment的容器启动命令中,显式指定TorchServe的监听地址和端口,避免自动配置异常:
containers: - name: kserve-container image: your-custom-image command: ["torchserve"] args: - "--start" - "--model-store" - "/mnt/models" - "--models" - "model=model.mar" - "--ts-config" - "/mnt/config/config.properties" volumeMounts: - name: config-volume mountPath: /mnt/config volumes: - name: config-volume configMap: name: torchserve-config
同时在config.properties中明确端口配置:
inference_address=http://0.0.0.0:8080 management_address=http://0.0.0.0:8081 metrics_address=http://0.0.0.0:8082
3. 匹配KServe代理转发配置
确保KServe的代理(如Istio)正确将推理请求转发到TorchServe的端口。若使用RawDeployment,KServe默认会转发到容器配置的containerPort,因此只要该端口与TorchServe监听端口一致即可。
内容的提问来源于stack exchange,提问作者Waqas Shah

