MLflow无法从模型仓库加载模型:S3路径404错误求助
解决MLflow加载注册模型时S3路径404的问题
针对你遇到的问题——明明S3中模型文件存在,加载时却返回404,大概率是以下几个原因,对应解决方案如下:
1. S3不支持相对路径../解析
错误信息里的路径包含artifacts/../saved-model/model20/,但S3是扁平结构的对象存储,不会像本地文件系统那样解析../这类相对路径。MLflow构造的这个路径会被直接传给S3客户端,导致请求的是一个包含../的无效对象路径,自然返回404。
解决方法:
- 先通过MLflow命令行查看注册模型的实际源路径:
查看输出的mlflow models get-latest-versions --name sample-ann-1source字段,确认是否包含../。如果是,说明模型注册时的路径记录有误。 - 重新注册模型:保存模型时使用绝对路径,避免相对路径引用。比如保存时指定
mlflow.pyfunc.log_model(model, artifact_path="saved-model"),确保artifact路径是绝对的。 - 临时应急:跳过模型注册表,直接用S3绝对路径加载模型:
loaded_model = mlflow.pyfunc.load_model("s3://{bucket}/saved-model/model20/")
2. IAM权限范围不足
你通过S3浏览器能看到文件,但程序使用的AWS凭证(IAM角色/用户)可能没有访问saved-model/model20/路径的权限——比如权限只授权了artifacts/下的资源,没覆盖上级的saved-model/路径。
解决方法:
- 检查程序使用的IAM权限策略,确保包含以下权限(替换为你的实际bucket和路径):
{ "Effect": "Allow", "Action": ["s3:GetObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:::{bucket}", "arn:aws:s3:::{bucket}/saved-model/model20/*" ] } - 用相同凭证在命令行测试访问:
如果命令返回403,说明确实是权限问题,需要调整IAM策略。aws s3 ls s3://{bucket}/saved-model/model20/
3. MLflow模型元数据错误
模型注册时,MLflow可能错误记录了模型的存储路径,导致加载时指向了错误的位置(比如关联的run_id、版本对应的路径有误)。
解决方法:
- 查看对应MLflow run的artifact路径:找到模型注册时关联的run,在MLflow UI里查看该run的artifact,确认模型实际存储的路径和注册模型的
source是否一致。 - 如果元数据错误,可以重新注册模型,确保注册时关联的是正确的run和artifact路径。
4. 路径大小写不匹配
S3的对象路径是区分大小写的,比如Model20和model20是两个完全不同的路径。检查错误信息里的路径和S3浏览器里的实际路径大小写是否完全一致。
内容的提问来源于stack exchange,提问作者Henry Bai
相关产品推荐
相关产品推荐

